From b8df6c3cd375970477a73d6d45f22c0d8cf46924 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Wed, 26 Apr 2017 06:00:25 +0700 Subject: [PATCH 01/58] Fixed warnings in 5.6, updated minimum Unity version to 5.3.6 (though it should work in 5.2 fine), uped TouchScript version to 8.3. --- .../Base/PinnedTransformGestureBaseEditor.cs | 4 ++ .../Base/TransformGestureBaseEditor.cs | 6 +- .../Editor/Gestures/FlickGestureEditor.cs | 6 +- .../Editor/Gestures/GestureEditor.cs | 6 +- .../Editor/Gestures/LongPressGestureEditor.cs | 6 +- .../Editor/Gestures/TapGestureEditor.cs | 6 +- .../Editor/InputSources/InputSourceEditor.cs | 6 +- .../Editor/InputSources/MobileInputEditor.cs | 6 +- .../Editor/InputSources/MouseInputEditor.cs | 6 +- .../InputSources/StandardInputEditor.cs | 7 +- .../Examples/Cube/Scripts/LayerDelegate.cs | 4 +- .../Examples/Cube/Scripts/RedirectInput.cs | 8 +-- .../Editor/InputSources/TuioInputEditor.cs | 6 +- .../Devices/Display/GenericDisplayDevice.cs | 7 +- .../TouchScript/Scripts/TouchManager.cs | 2 +- .../ProjectSettings/ClusterInputManager.asset | 6 ++ Source/ProjectSettings/GraphicsSettings.asset | 7 +- Source/ProjectSettings/ProjectSettings.asset | 72 +++++++------------ Source/ProjectSettings/ProjectVersion.txt | 2 +- .../UnityAnalyticsManager.asset | 10 --- .../UnityConnectSettings.asset | 14 ++++ 21 files changed, 116 insertions(+), 81 deletions(-) create mode 100644 Source/ProjectSettings/ClusterInputManager.asset delete mode 100644 Source/ProjectSettings/UnityAnalyticsManager.asset create mode 100644 Source/ProjectSettings/UnityConnectSettings.asset diff --git a/Source/Assets/TouchScript/Editor/Gestures/Base/PinnedTransformGestureBaseEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/Base/PinnedTransformGestureBaseEditor.cs index 6c9ab7b54..9f263102c 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/Base/PinnedTransformGestureBaseEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/Base/PinnedTransformGestureBaseEditor.cs @@ -28,7 +28,11 @@ protected override void OnEnable() public override void OnInspectorGUI() { +#if UNITY_5_6_OR_NEWER + serializedObject.UpdateIfRequiredOrScript(); +#else serializedObject.UpdateIfDirtyOrScript(); +#endif var typeValue = type.intValue; int newType = 0; diff --git a/Source/Assets/TouchScript/Editor/Gestures/Base/TransformGestureBaseEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/Base/TransformGestureBaseEditor.cs index c5fc0ad99..7ccba2324 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/Base/TransformGestureBaseEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/Base/TransformGestureBaseEditor.cs @@ -32,7 +32,11 @@ protected override void OnEnable() public override void OnInspectorGUI() { - serializedObject.UpdateIfDirtyOrScript(); +#if UNITY_5_6_OR_NEWER + serializedObject.UpdateIfRequiredOrScript(); +#else + serializedObject.UpdateIfDirtyOrScript(); +#endif var typeValue = type.intValue; int newType = 0; diff --git a/Source/Assets/TouchScript/Editor/Gestures/FlickGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/FlickGestureEditor.cs index 9753477bb..deccc2b3c 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/FlickGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/FlickGestureEditor.cs @@ -33,7 +33,11 @@ protected override void OnEnable() public override void OnInspectorGUI() { - serializedObject.UpdateIfDirtyOrScript(); +#if UNITY_5_6_OR_NEWER + serializedObject.UpdateIfRequiredOrScript(); +#else + serializedObject.UpdateIfDirtyOrScript(); +#endif EditorGUIUtility.labelWidth = 180; EditorGUILayout.PropertyField(direction, DIRECTION); diff --git a/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs index 0fc79c0f1..14178d79b 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs @@ -80,7 +80,11 @@ protected virtual void OnEnable() public override void OnInspectorGUI() { - serializedObject.UpdateIfDirtyOrScript(); +#if UNITY_5_6_OR_NEWER + serializedObject.UpdateIfRequiredOrScript(); +#else + serializedObject.UpdateIfDirtyOrScript(); +#endif EditorGUI.BeginChangeCheck(); var expanded = GUIElements.BeginFoldout(advanced.isExpanded, TEXT_ADVANCED_HEADER); diff --git a/Source/Assets/TouchScript/Editor/Gestures/LongPressGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/LongPressGestureEditor.cs index 74ac0e849..f4629e114 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/LongPressGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/LongPressGestureEditor.cs @@ -27,7 +27,11 @@ protected override void OnEnable() public override void OnInspectorGUI() { - serializedObject.UpdateIfDirtyOrScript(); +#if UNITY_5_6_OR_NEWER + serializedObject.UpdateIfRequiredOrScript(); +#else + serializedObject.UpdateIfDirtyOrScript(); +#endif EditorGUILayout.PropertyField(timeToPress, TIME_TO_PRESS); diff --git a/Source/Assets/TouchScript/Editor/Gestures/TapGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/TapGestureEditor.cs index 3cf54b49e..d6474d992 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/TapGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/TapGestureEditor.cs @@ -32,7 +32,11 @@ protected override void OnEnable() public override void OnInspectorGUI() { - serializedObject.UpdateIfDirtyOrScript(); +#if UNITY_5_6_OR_NEWER + serializedObject.UpdateIfRequiredOrScript(); +#else + serializedObject.UpdateIfDirtyOrScript(); +#endif EditorGUIUtility.labelWidth = 180; EditorGUILayout.IntPopup(numberOfTapsRequired, new[] {new GUIContent("One"), new GUIContent("Two"), new GUIContent("Three")}, new[] {1, 2, 3}, NUMBER_OF_TAPS_REQUIRED, GUILayout.ExpandWidth(true)); diff --git a/Source/Assets/TouchScript/Editor/InputSources/InputSourceEditor.cs b/Source/Assets/TouchScript/Editor/InputSources/InputSourceEditor.cs index d358b2173..973ffbddc 100644 --- a/Source/Assets/TouchScript/Editor/InputSources/InputSourceEditor.cs +++ b/Source/Assets/TouchScript/Editor/InputSources/InputSourceEditor.cs @@ -17,7 +17,11 @@ protected virtual void OnEnable() public override void OnInspectorGUI() { - serializedObject.UpdateIfDirtyOrScript(); +#if UNITY_5_6_OR_NEWER + serializedObject.UpdateIfRequiredOrScript(); +#else + serializedObject.UpdateIfDirtyOrScript(); +#endif EditorGUI.BeginChangeCheck(); var expanded = GUIElements.BeginFoldout(advanced.isExpanded, new GUIContent("Advanced", TEXT_ADVANCED_HEADER)); diff --git a/Source/Assets/TouchScript/Editor/InputSources/MobileInputEditor.cs b/Source/Assets/TouchScript/Editor/InputSources/MobileInputEditor.cs index dca00d9a8..375abcbfd 100644 --- a/Source/Assets/TouchScript/Editor/InputSources/MobileInputEditor.cs +++ b/Source/Assets/TouchScript/Editor/InputSources/MobileInputEditor.cs @@ -21,7 +21,11 @@ protected override void OnEnable() public override void OnInspectorGUI() { - serializedObject.UpdateIfDirtyOrScript(); +#if UNITY_5_6_OR_NEWER + serializedObject.UpdateIfRequiredOrScript(); +#else + serializedObject.UpdateIfDirtyOrScript(); +#endif EditorGUILayout.PropertyField(disableOnNonTouchPlatforms); diff --git a/Source/Assets/TouchScript/Editor/InputSources/MouseInputEditor.cs b/Source/Assets/TouchScript/Editor/InputSources/MouseInputEditor.cs index 062e9a202..eb59a5a5d 100644 --- a/Source/Assets/TouchScript/Editor/InputSources/MouseInputEditor.cs +++ b/Source/Assets/TouchScript/Editor/InputSources/MouseInputEditor.cs @@ -21,7 +21,11 @@ protected override void OnEnable() public override void OnInspectorGUI() { - serializedObject.UpdateIfDirtyOrScript(); +#if UNITY_5_6_OR_NEWER + serializedObject.UpdateIfRequiredOrScript(); +#else + serializedObject.UpdateIfDirtyOrScript(); +#endif EditorGUILayout.PropertyField(disableOnMobilePlatforms); diff --git a/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs b/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs index 9daf62c5d..520451d03 100644 --- a/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs +++ b/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs @@ -34,7 +34,12 @@ protected override void OnEnable() public override void OnInspectorGUI() { - serializedObject.UpdateIfDirtyOrScript(); +#if UNITY_5_6_OR_NEWER + serializedObject.UpdateIfRequiredOrScript(); +#else + serializedObject.UpdateIfDirtyOrScript(); +#endif + EditorGUILayout.PropertyField(windows8Touch); EditorGUILayout.PropertyField(windows7Touch); EditorGUILayout.PropertyField(webPlayerTouch); diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/LayerDelegate.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/LayerDelegate.cs index 2e438fd55..9a944f694 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/LayerDelegate.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/LayerDelegate.cs @@ -12,8 +12,8 @@ public class LayerDelegate : MonoBehaviour, ILayerDelegate public bool ShouldReceiveTouch(TouchLayer layer, TouchPoint touch) { if (layer == RenderTextureLayer) - return touch.InputSource == Source; - return touch.InputSource != Source; + return touch.InputSource.Equals(Source); + return !touch.InputSource.Equals(Source); } } } diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs index 4ca8a02d5..5599bd2b9 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs @@ -62,7 +62,7 @@ private Vector2 processCoords(Vector2 value) private void touchBeganHandler(object sender, MetaGestureEventArgs metaGestureEventArgs) { var touch = metaGestureEventArgs.Touch; - if (touch.InputSource == this) return; + if (touch.InputSource.Equals(this)) return; map.Add(touch.Id, beginTouch(processCoords(touch.Hit.RaycastHit.textureCoord), touch.Tags).Id); } @@ -71,7 +71,7 @@ private void touchMovedhandler(object sender, MetaGestureEventArgs metaGestureEv int id; TouchHit hit; var touch = metaGestureEventArgs.Touch; - if (touch.InputSource == this) return; + if (touch.InputSource.Equals(this)) return; if (!map.TryGetValue(touch.Id, out id)) return; if (!gesture.GetTargetHitResult(touch.Position, out hit)) return; moveTouch(id, processCoords(hit.RaycastHit.textureCoord)); @@ -81,7 +81,7 @@ private void touchEndedHandler(object sender, MetaGestureEventArgs metaGestureEv { int id; var touch = metaGestureEventArgs.Touch; - if (touch.InputSource == this) return; + if (touch.InputSource.Equals(this)) return; if (!map.TryGetValue(touch.Id, out id)) return; endTouch(id); } @@ -90,7 +90,7 @@ private void touchCancelledhandler(object sender, MetaGestureEventArgs metaGestu { int id; var touch = metaGestureEventArgs.Touch; - if (touch.InputSource == this) return; + if (touch.InputSource.Equals(this)) return; if (!map.TryGetValue(touch.Id, out id)) return; cancelTouch(id); } diff --git a/Source/Assets/TouchScript/Modules/TUIO/Editor/InputSources/TuioInputEditor.cs b/Source/Assets/TouchScript/Modules/TUIO/Editor/InputSources/TuioInputEditor.cs index ac65128ea..558b88a40 100644 --- a/Source/Assets/TouchScript/Modules/TUIO/Editor/InputSources/TuioInputEditor.cs +++ b/Source/Assets/TouchScript/Modules/TUIO/Editor/InputSources/TuioInputEditor.cs @@ -61,7 +61,11 @@ protected override void OnEnable() public override void OnInspectorGUI() { - serializedObject.UpdateIfDirtyOrScript(); +#if UNITY_5_6_OR_NEWER + serializedObject.UpdateIfRequiredOrScript(); +#else + serializedObject.UpdateIfDirtyOrScript(); +#endif EditorGUILayout.PropertyField(tuioPort); diff --git a/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs b/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs index a0d1e9c46..225b611b9 100644 --- a/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs +++ b/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs @@ -125,12 +125,7 @@ protected override void OnEnable() else dpi = 160; break; } - case RuntimePlatform.WSAPlayerARM: - case RuntimePlatform.WSAPlayerX64: - case RuntimePlatform.WSAPlayerX86: - dpi = 160; - break; - case RuntimePlatform.WP8Player: + default: dpi = 160; break; } diff --git a/Source/Assets/TouchScript/Scripts/TouchManager.cs b/Source/Assets/TouchScript/Scripts/TouchManager.cs index 744690fb3..269a25014 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManager.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManager.cs @@ -131,7 +131,7 @@ public enum MessageName /// /// TouchScript version. /// - public static readonly Version VERSION = new Version(8, 2); + public static readonly Version VERSION = new Version(8, 3); #endregion diff --git a/Source/ProjectSettings/ClusterInputManager.asset b/Source/ProjectSettings/ClusterInputManager.asset new file mode 100644 index 000000000..e7886b266 --- /dev/null +++ b/Source/ProjectSettings/ClusterInputManager.asset @@ -0,0 +1,6 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!236 &1 +ClusterInputManager: + m_ObjectHideFlags: 0 + m_Inputs: [] diff --git a/Source/ProjectSettings/GraphicsSettings.asset b/Source/ProjectSettings/GraphicsSettings.asset index 151b43f77..5a96ca8a8 100644 --- a/Source/ProjectSettings/GraphicsSettings.asset +++ b/Source/ProjectSettings/GraphicsSettings.asset @@ -3,7 +3,7 @@ --- !u!30 &1 GraphicsSettings: m_ObjectHideFlags: 0 - serializedVersion: 4 + serializedVersion: 5 m_Deferred: m_Mode: 1 m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} @@ -21,14 +21,17 @@ GraphicsSettings: - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} - {fileID: 10782, guid: 0000000000000000f000000000000000, type: 0} m_PreloadedShaders: [] + m_ShaderSettings: + useScreenSpaceShadows: 1 + m_BuildTargetShaderSettings: [] m_LightmapStripping: 0 + m_FogStripping: 0 m_LightmapKeepPlain: 1 m_LightmapKeepDirCombined: 1 m_LightmapKeepDirSeparate: 1 m_LightmapKeepDynamicPlain: 1 m_LightmapKeepDynamicDirCombined: 1 m_LightmapKeepDynamicDirSeparate: 1 - m_FogStripping: 0 m_FogKeepLinear: 1 m_FogKeepExp: 1 m_FogKeepExp2: 1 diff --git a/Source/ProjectSettings/ProjectSettings.asset b/Source/ProjectSettings/ProjectSettings.asset index 592e3872c..0dab5dcee 100644 --- a/Source/ProjectSettings/ProjectSettings.asset +++ b/Source/ProjectSettings/ProjectSettings.asset @@ -3,11 +3,10 @@ --- !u!129 &1 PlayerSettings: m_ObjectHideFlags: 0 - serializedVersion: 7 + serializedVersion: 8 AndroidProfiler: 0 defaultScreenOrientation: 3 targetDevice: 2 - targetResolution: 0 useOnDemandResources: 0 accelerometerFrequency: 60 companyName: valyard @@ -15,6 +14,7 @@ PlayerSettings: defaultCursor: {fileID: 0} cursorHotspot: {x: 0, y: 0} m_ShowUnitySplashScreen: 1 + m_VirtualRealitySplashScreen: {fileID: 0} defaultScreenWidth: 1024 defaultScreenHeight: 768 defaultScreenWidthWeb: 960 @@ -56,16 +56,22 @@ PlayerSettings: xboxEnableKinectAutoTracking: 0 xboxEnableFitness: 0 visibleInBackground: 0 + allowFullscreenSwitch: 1 macFullscreenMode: 2 d3d9FullscreenMode: 1 d3d11FullscreenMode: 1 xboxSpeechDB: 0 xboxEnableHeadOrientation: 0 xboxEnableGuest: 0 + xboxEnablePIXSampling: 0 + xboxEnableEnableRenderThreadRunsJobs: 0 n3dsDisableStereoscopicView: 0 n3dsEnableSharedListOpt: 1 n3dsEnableVSync: 0 + uiUse16BitDepthBuffer: 0 + ignoreAlphaClear: 0 xboxOneResolution: 0 + xboxOneMonoLoggingLevel: 0 ps3SplashScreen: {fileID: 0} videoMemoryForVertexBuffers: 0 psp2PowerMode: 0 @@ -113,8 +119,11 @@ PlayerSettings: m_Bits: 238 iPhoneSdkVersion: 988 iPhoneTargetOSVersion: 28 + tvOSSdkVersion: 0 + tvOSTargetOSVersion: 900 uIPrerenderedIcon: 0 uIRequiresPersistentWiFi: 0 + uIRequiresFullScreen: 1 uIStatusBarHidden: 1 uIExitOnSuspend: 1 uIStatusBarStyle: 0 @@ -128,6 +137,10 @@ PlayerSettings: iPadHighResPortraitSplashScreen: {fileID: 0} iPadLandscapeSplashScreen: {fileID: 0} iPadHighResLandscapeSplashScreen: {fileID: 0} + appleTVSplashScreen: {fileID: 0} + tvOSSmallIconLayers: [] + tvOSLargeIconLayers: [] + tvOSTopShelfImageLayers: [] iOSLaunchScreenType: 0 iOSLaunchScreenPortrait: {fileID: 0} iOSLaunchScreenLandscape: {fileID: 0} @@ -193,6 +206,7 @@ PlayerSettings: wiiUSystemHeapSize: 128 wiiUTVStartupScreen: {fileID: 0} wiiUGamePadStartupScreen: {fileID: 0} + wiiUDrcBufferDisabled: 0 wiiUProfilerLibPath: actionOnDotNetUnhandledException: 1 enableInternalProfiler: 0 @@ -252,6 +266,7 @@ PlayerSettings: ps4NPtitleDatPath: ps4RemotePlayKeyAssignment: -1 ps4RemotePlayKeyMappingDir: + ps4PlayTogetherPlayerCount: 0 ps4EnterButtonAssignment: 1 ps4ApplicationParam1: 0 ps4ApplicationParam2: 0 @@ -260,6 +275,7 @@ PlayerSettings: ps4DownloadDataSize: 0 ps4GarlicHeapSize: 2048 ps4Passcode: 5xr84P2R391UXaLHbavJvFZGfO47XWS2 + ps4UseDebugIl2cppLibs: 0 ps4pnSessions: 1 ps4pnPresence: 1 ps4pnFriends: 1 @@ -267,11 +283,18 @@ PlayerSettings: playerPrefsSupport: 0 ps4ReprojectionSupport: 0 ps4UseAudio3dBackend: 0 + ps4SocialScreenEnabled: 0 ps4Audio3dVirtualSpeakerCount: 14 + ps4attribCpuUsage: 0 + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: ps4attribUserManagement: 0 ps4attribMoveSupport: 0 ps4attrib3DSupport: 0 ps4attribShareSupport: 0 + ps4attribExclusiveVR: 0 + ps4disableAutoHideSplash: 0 ps4IncludedModules: [] monoEnv: psp2Splashimage: {fileID: 0} @@ -320,16 +343,13 @@ PlayerSettings: psp2UseLibLocation: 0 psp2InfoBarOnStartup: 0 psp2InfoBarColor: 0 + psp2UseDebugIl2cppLibs: 0 psmSplashimage: {fileID: 0} spritePackerPolicy: scriptingDefineSymbols: 1: 4: metroPackageName: General Examples - metroPackageLogo: - metroPackageLogo140: - metroPackageLogo180: - metroPackageLogo240: metroPackageVersion: metroCertificatePath: metroCertificatePassword: @@ -337,44 +357,7 @@ PlayerSettings: metroCertificateIssuer: metroCertificateNotAfter: 0000000000000000 metroApplicationDescription: General Examples - metroStoreTileLogo80: - metroStoreTileLogo: - metroStoreTileLogo140: - metroStoreTileLogo180: - metroStoreTileWideLogo80: - metroStoreTileWideLogo: - metroStoreTileWideLogo140: - metroStoreTileWideLogo180: - metroStoreTileSmallLogo80: - metroStoreTileSmallLogo: - metroStoreTileSmallLogo140: - metroStoreTileSmallLogo180: - metroStoreSmallTile80: - metroStoreSmallTile: - metroStoreSmallTile140: - metroStoreSmallTile180: - metroStoreLargeTile80: - metroStoreLargeTile: - metroStoreLargeTile140: - metroStoreLargeTile180: - metroStoreSplashScreenImage: - metroStoreSplashScreenImage140: - metroStoreSplashScreenImage180: - metroPhoneAppIcon: - metroPhoneAppIcon140: - metroPhoneAppIcon240: - metroPhoneSmallTile: - metroPhoneSmallTile140: - metroPhoneSmallTile240: - metroPhoneMediumTile: - metroPhoneMediumTile140: - metroPhoneMediumTile240: - metroPhoneWideTile: - metroPhoneWideTile140: - metroPhoneWideTile240: - metroPhoneSplashScreenImage: - metroPhoneSplashScreenImage140: - metroPhoneSplashScreenImage240: + wsaImages: {} metroTileShortName: metroCommandLineArgsFile: metroTileShowName: 0 @@ -486,7 +469,6 @@ PlayerSettings: WebGL::emscriptenArgs: WebGL::template: APPLICATION:Default additionalIl2CppArgs::additionalIl2CppArgs: - firstStreamedSceneWithResources: 0 cloudProjectId: projectName: organizationId: diff --git a/Source/ProjectSettings/ProjectVersion.txt b/Source/ProjectSettings/ProjectVersion.txt index b11ab9b5b..d4ad3ce51 100644 --- a/Source/ProjectSettings/ProjectVersion.txt +++ b/Source/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 5.2.2f1 +m_EditorVersion: 5.3.6f1 m_StandardAssetsVersion: 0 diff --git a/Source/ProjectSettings/UnityAnalyticsManager.asset b/Source/ProjectSettings/UnityAnalyticsManager.asset deleted file mode 100644 index 4a7b66883..000000000 --- a/Source/ProjectSettings/UnityAnalyticsManager.asset +++ /dev/null @@ -1,10 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!303 &1 -UnityAnalyticsManager: - m_ObjectHideFlags: 0 - m_Enabled: 0 - m_InitializeOnStartup: 1 - m_TestMode: 0 - m_TestEventUrl: - m_TestConfigUrl: diff --git a/Source/ProjectSettings/UnityConnectSettings.asset b/Source/ProjectSettings/UnityConnectSettings.asset new file mode 100644 index 000000000..9b7a57834 --- /dev/null +++ b/Source/ProjectSettings/UnityConnectSettings.asset @@ -0,0 +1,14 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!310 &1 +UnityConnectSettings: + m_ObjectHideFlags: 0 + UnityPurchasingSettings: + m_Enabled: 0 + m_TestMode: 0 + UnityAnalyticsSettings: + m_Enabled: 0 + m_InitializeOnStartup: 1 + m_TestMode: 0 + m_TestEventUrl: + m_TestConfigUrl: From c09febde8ff95c1c88d7a7c831c594d204283c61 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Fri, 28 Apr 2017 00:17:11 +0300 Subject: [PATCH 02/58] Fixed a dependency on GetPointerInfo Windows 8 API in WindowsTouch.dll. --- External/WindowsTouch/WindowsTouch.cpp | 3 ++ External/WindowsTouch/WindowsTouch.h | 62 ++++++++++++++++++++++ External/WindowsTouch/WindowsTouch.vcxproj | 1 + 3 files changed, 66 insertions(+) diff --git a/External/WindowsTouch/WindowsTouch.cpp b/External/WindowsTouch/WindowsTouch.cpp index a3914e8c2..575a90d8f 100644 --- a/External/WindowsTouch/WindowsTouch.cpp +++ b/External/WindowsTouch/WindowsTouch.cpp @@ -19,6 +19,9 @@ extern "C" _currentWindow = FindWindowA("UnityWndClass", NULL); if (api == WIN8) { + HINSTANCE h = LoadLibrary(TEXT("user32.dll")); + GetPointerInfo = (GET_POINTER_INFO) GetProcAddress(h, "GetPointerInfo"); + _oldWindowProc = SetWindowLongPtr(_currentWindow, GWLP_WNDPROC, (LONG_PTR)wndProc8); } else diff --git a/External/WindowsTouch/WindowsTouch.h b/External/WindowsTouch/WindowsTouch.h index 46f83aa18..06fb37fce 100644 --- a/External/WindowsTouch/WindowsTouch.h +++ b/External/WindowsTouch/WindowsTouch.h @@ -2,6 +2,9 @@ * @author Valentin Simonov / http://va.lent.in/ */ +#define WINVER _WIN32_WINNT_WIN7 +#define _WIN32_WINNT _WIN32_WINNT_WIN7 + #include #define EXPORT_API __declspec(dllexport) @@ -23,6 +26,65 @@ typedef enum WIN8 } TOUCH_API; +// + +#define WM_POINTERUPDATE 0x0245 +#define WM_POINTERDOWN 0x0246 +#define WM_POINTERUP 0x0247 + +#define POINTER_FLAG_CANCELED 0x00008000 // Pointer is departing in an abnormal manner + +#define GET_POINTERID_WPARAM(wParam) (LOWORD(wParam)) + +typedef UINT32 POINTER_FLAGS; + +typedef enum { + PT_POINTER = 0x00000001, + PT_TOUCH = 0x00000002, + PT_PEN = 0x00000003, + PT_MOUSE = 0x00000004, + PT_TOUCHPAD = 0x00000005 +} POINTER_INPUT_TYPE; + +typedef enum { + POINTER_CHANGE_NONE, + POINTER_CHANGE_FIRSTBUTTON_DOWN, + POINTER_CHANGE_FIRSTBUTTON_UP, + POINTER_CHANGE_SECONDBUTTON_DOWN, + POINTER_CHANGE_SECONDBUTTON_UP, + POINTER_CHANGE_THIRDBUTTON_DOWN, + POINTER_CHANGE_THIRDBUTTON_UP, + POINTER_CHANGE_FOURTHBUTTON_DOWN, + POINTER_CHANGE_FOURTHBUTTON_UP, + POINTER_CHANGE_FIFTHBUTTON_DOWN, + POINTER_CHANGE_FIFTHBUTTON_UP, +} POINTER_BUTTON_CHANGE_TYPE; + +typedef struct { + POINTER_INPUT_TYPE pointerType; + UINT32 pointerId; + UINT32 frameId; + POINTER_FLAGS pointerFlags; + HANDLE sourceDevice; + HWND hwndTarget; + POINT ptPixelLocation; + POINT ptHimetricLocation; + POINT ptPixelLocationRaw; + POINT ptHimetricLocationRaw; + DWORD dwTime; + UINT32 historyCount; + INT32 InputData; + DWORD dwKeyStates; + UINT64 PerformanceCount; + POINTER_BUTTON_CHANGE_TYPE ButtonChangeType; +} POINTER_INFO; + +typedef BOOL (WINAPI *GET_POINTER_INFO)(UINT32 pointerId, POINTER_INFO *pointerInfo); + +GET_POINTER_INFO GetPointerInfo; + +// + typedef void(__stdcall * PointerBeganFuncPtr)(int id, POINTER_INPUT_TYPE type, unsigned int buttons, Vector2 position); typedef void(__stdcall * PointerMovedFuncPtr)(int id, POINTER_INPUT_TYPE type, unsigned int buttonsSet, unsigned int buttonsClear, Vector2 position); typedef void(__stdcall * PointerEndedFuncPtr)(int id, POINTER_INPUT_TYPE type, unsigned int buttons); diff --git a/External/WindowsTouch/WindowsTouch.vcxproj b/External/WindowsTouch/WindowsTouch.vcxproj index 50247a536..42ac710b2 100644 --- a/External/WindowsTouch/WindowsTouch.vcxproj +++ b/External/WindowsTouch/WindowsTouch.vcxproj @@ -23,6 +23,7 @@ Win32Proj WindowsTouch 8.1 + WindowsTouch From c4e9808fe8f61486a4fbfbdee925f1a3c89796eb Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 16 Jul 2017 15:19:19 +0300 Subject: [PATCH 03/58] - Fixed Windows pen interaction. - Added Pressure and Rotation properties to pen pointer. - Fixed interop between mouse and Windows 7 / Unity touch inputs. --- External/WindowsTouch/WindowsTouch.cpp | 168 +++---- External/WindowsTouch/WindowsTouch.h | 174 ++++--- .../Scripts/InputSources/IInputSource.cs | 2 +- .../InputHandlers/MouseHandler.cs | 345 +++++++------ .../InputHandlers/TouchHandler.cs | 31 +- .../InputHandlers/WindowsPointerHandlers.cs | 459 ++++++++++++------ .../Scripts/InputSources/InputSource.cs | 3 +- .../Scripts/InputSources/StandardInput.cs | 46 +- .../Scripts/Pointers/FakePointer.cs | 13 +- .../TouchScript/Scripts/Pointers/IPointer.cs | 6 +- .../Scripts/Pointers/MousePointer.cs | 5 +- .../Scripts/Pointers/ObjectPointer.cs | 20 +- .../Scripts/Pointers/PenPointer.cs | 31 +- .../TouchScript/Scripts/Pointers/Pointer.cs | 92 ++-- .../Scripts/Pointers/TouchPointer.cs | 22 +- .../TouchScript/Scripts/Utils/BinaryUtils.cs | 11 +- .../TouchScript/Scripts/Utils/ObjectPool.cs | 7 + .../TouchScript/Scripts/Utils/PointerUtils.cs | 65 ++- 18 files changed, 899 insertions(+), 601 deletions(-) diff --git a/External/WindowsTouch/WindowsTouch.cpp b/External/WindowsTouch/WindowsTouch.cpp index 6ce5fa27e..1efa9dbf4 100644 --- a/External/WindowsTouch/WindowsTouch.cpp +++ b/External/WindowsTouch/WindowsTouch.cpp @@ -7,20 +7,10 @@ extern "C" { - void __stdcall Init(TOUCH_API api, - MousePointerBeganFuncPtr mouseBegan, MousePointerMovedFuncPtr mouseMoved, - TouchPointerBeganFuncPtr touchBegan, TouchPointerMovedFuncPtr touchMoved, - PenPointerBeganFuncPtr penBegan, PenPointerMovedFuncPtr penMoved, - PointerEndedFuncPtr ended, PointerCancelledFuncPtr cancelled) + void __stdcall Init(TOUCH_API api, LogFuncPtr logFunc, PointerDelegatePtr delegate) { - _mousePointerBeganFunc = mouseBegan; - _mousePointerMovedFunc = mouseMoved; - _touchPointerBeganFunc = touchBegan; - _touchPointerMovedFunc = touchMoved; - _penPointerBeganFunc = penBegan; - _penPointerMovedFunc = penMoved; - _pointerEndedFunc = ended; - _pointerCancelledFunc = cancelled; + _log = logFunc; + _delegate = delegate; _api = api; _currentWindow = FindWindowA("UnityWndClass", NULL); @@ -29,13 +19,16 @@ extern "C" HINSTANCE h = LoadLibrary(TEXT("user32.dll")); GetPointerInfo = (GET_POINTER_INFO) GetProcAddress(h, "GetPointerInfo"); GetPointerTouchInfo = (GET_POINTER_TOUCH_INFO) GetProcAddress(h, "GetPointerTouchInfo"); + GetPointerPenInfo = (GET_POINTER_PEN_INFO)GetProcAddress(h, "GetPointerPenInfo"); _oldWindowProc = SetWindowLongPtr(_currentWindow, GWLP_WNDPROC, (LONG_PTR)wndProc8); + log(L"Initialized WIN8 input."); } else { RegisterTouchWindow(_currentWindow, 0); _oldWindowProc = SetWindowLongPtr(_currentWindow, GWLP_WNDPROC, (LONG_PTR)wndProc7); + log(L"Initialized WIN7 input."); } } @@ -71,9 +64,12 @@ LRESULT CALLBACK wndProc8(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) case WM_TOUCH: CloseTouchInputHandle((HTOUCHINPUT)lParam); break; + case WM_POINTERENTER: + case WM_POINTERLEAVE: case WM_POINTERDOWN: case WM_POINTERUP: case WM_POINTERUPDATE: + case WM_POINTERCAPTURECHANGED: decodeWin8Touches(msg, wParam, lParam); break; default: @@ -107,105 +103,39 @@ void decodeWin8Touches(UINT msg, WPARAM wParam, LPARAM lParam) p.y = pointerInfo.ptPixelLocation.y; ScreenToClient(_currentWindow, &p); - switch (msg) - { - case WM_POINTERDOWN: - { - if ((pointerInfo.pointerFlags & POINTER_FLAG_CANCELED) != 0) return; + Vector2 position = Vector2(((float)p.x - _offsetX) * _scaleX, _screenHeight - ((float)p.y - _offsetY) * _scaleY); + PointerData data; + data.pointerFlags = pointerInfo.pointerFlags; + data.changedButtons = pointerInfo.ButtonChangeType; - Vector2 position = Vector2(((float)p.x - _offsetX) * _scaleX, _screenHeight - ((float)p.y - _offsetY) * _scaleY); - unsigned int buttons = 0, b; - switch (pointerInfo.pointerType) - { - case PT_MOUSE: - b = (((unsigned int)pointerInfo.ButtonChangeType - 1) / 2) * 3; - buttons |= 1 << (b + 1); // add down - buttons |= 1 << b; // add pressed - _mousePointerBeganFunc(pointerId, buttons, position); - break; - case PT_TOUCH: - POINTER_TOUCH_INFO touchInfo; - GetPointerTouchInfo(pointerId, &touchInfo); - buttons = 1 + 2; // first button down, pressed - _touchPointerBeganFunc(pointerId, buttons, touchInfo.orientation, touchInfo.pressure, position); - break; - case PT_PEN: - b = (((unsigned int)pointerInfo.ButtonChangeType - 1) / 2) * 3; - buttons |= 1 << (b + 1); // add down - buttons |= 1 << b; // add pressed - _penPointerBeganFunc(pointerId, buttons, position); - break; - } - break; - } - case WM_POINTERUP: + if ((pointerInfo.pointerFlags & POINTER_FLAG_CANCELED) != 0 + || msg == WM_POINTERCAPTURECHANGED) msg = POINTER_CANCELLED; + + switch (pointerInfo.pointerType) { - if ((pointerInfo.pointerFlags & POINTER_FLAG_CANCELED) != 0) - { - _pointerCancelledFunc(pointerId, pointerInfo.pointerType); - } - else - { - unsigned int buttons = 0, b; - switch (pointerInfo.pointerType) - { - case PT_MOUSE: - case PT_PEN: - b = (((unsigned int)pointerInfo.ButtonChangeType - 1) / 2) * 3; - buttons |= 1 << (b + 2); // add up - break; - case PT_TOUCH: - buttons = 4; // first button up - break; - } - _pointerEndedFunc(pointerId, pointerInfo.pointerType, buttons); - } + case PT_MOUSE: break; - } - case WM_POINTERUPDATE: - { - if ((pointerInfo.pointerFlags & POINTER_FLAG_CANCELED) != 0) - { - _pointerCancelledFunc(pointerId, pointerInfo.pointerType); - } - else - { - Vector2 position = Vector2(((float)p.x - _offsetX) * _scaleX, _screenHeight - ((float)p.y - _offsetY) * _scaleY); - unsigned int buttonsSet = 0, buttonsClear = 0; - if (pointerInfo.ButtonChangeType != POINTER_CHANGE_NONE) - { - unsigned int change = (unsigned int)pointerInfo.ButtonChangeType; - if (change % 2 == 0) // up - { - unsigned int b = (change / 2 - 1) * 3; - buttonsSet |= 1 << (b + 2); // add up - buttonsClear |= 1 << b; // remove pressed - } - else // down - { - unsigned int b = ((change - 1) / 2) * 3; - buttonsSet |= 1 << (b + 1); // add down - buttonsSet |= 1 << b; // add pressed - } - } - switch (pointerInfo.pointerType) - { - case PT_MOUSE: - _mousePointerMovedFunc(pointerId, buttonsSet, buttonsClear, position); - break; - case PT_TOUCH: - POINTER_TOUCH_INFO touchInfo; - GetPointerTouchInfo(pointerId, &touchInfo); - _touchPointerMovedFunc(pointerId, buttonsSet, buttonsClear, touchInfo.orientation, touchInfo.pressure, position); - break; - case PT_PEN: - _penPointerMovedFunc(pointerId, buttonsSet, buttonsClear, position); - break; - } - } + case PT_TOUCH: + POINTER_TOUCH_INFO touchInfo; + GetPointerTouchInfo(pointerId, &touchInfo); + data.flags = touchInfo.touchFlags; + data.mask = touchInfo.touchMask; + data.rotation = touchInfo.orientation; + data.pressure = touchInfo.pressure; + break; + case PT_PEN: + POINTER_PEN_INFO penInfo; + GetPointerPenInfo(pointerId, &penInfo); + data.flags = penInfo.penFlags; + data.mask = penInfo.penMask; + data.rotation = penInfo.rotation; + data.pressure = penInfo.pressure; + data.tiltX = penInfo.tiltX; + data.tiltY = penInfo.tiltY; break; } - } + + _delegate(pointerId, msg, pointerInfo.pointerType, position, data); } void decodeWin7Touches(UINT msg, WPARAM wParam, LPARAM lParam) @@ -225,22 +155,36 @@ void decodeWin7Touches(UINT msg, WPARAM wParam, LPARAM lParam) p.y = touch.y / 100; ScreenToClient(_currentWindow, &p); + Vector2 position = Vector2(((float)p.x - _offsetX) * _scaleX, _screenHeight - ((float)p.y - _offsetY) * _scaleY); + PointerData data; + if ((touch.dwFlags & TOUCHEVENTF_DOWN) != 0) { - Vector2 position = Vector2(((float)p.x - _offsetX) * _scaleX, _screenHeight - ((float)p.y - _offsetY) * _scaleY); - _touchPointerBeganFunc(touch.dwID, 3, 0, 0, position); + msg = WM_POINTERDOWN; + data.changedButtons = POINTER_CHANGE_FIRSTBUTTON_DOWN; } else if ((touch.dwFlags & TOUCHEVENTF_UP) != 0) { - _pointerEndedFunc(touch.dwID, PT_TOUCH, 4); + msg = WM_POINTERUP; + data.changedButtons = POINTER_CHANGE_FIRSTBUTTON_UP; } else if ((touch.dwFlags & TOUCHEVENTF_MOVE) != 0) { - Vector2 position = Vector2(((float)p.x - _offsetX) * _scaleX, _screenHeight - ((float)p.y - _offsetY) * _scaleY); - _touchPointerMovedFunc(touch.dwID, 0, 0, 0, 0, position); + msg = WM_POINTERUPDATE; } + + _delegate(touch.dwID, msg, PT_TOUCH, position, data); } CloseTouchInputHandle((HTOUCHINPUT)lParam); delete[] pInputs; +} + +void log(const wchar_t* str) +{ +#if _DEBUG + BSTR bstr = SysAllocString(str); + _log(bstr); + SysFreeString(bstr); +#endif } \ No newline at end of file diff --git a/External/WindowsTouch/WindowsTouch.h b/External/WindowsTouch/WindowsTouch.h index 8e6a975fb..1a6d15976 100644 --- a/External/WindowsTouch/WindowsTouch.h +++ b/External/WindowsTouch/WindowsTouch.h @@ -9,17 +9,6 @@ #define EXPORT_API __declspec(dllexport) -struct Vector2 -{ - float x, y; - - Vector2(float x, float y) - { - this->x = x; - this->y = y; - } -}; - typedef enum { WIN7, @@ -28,16 +17,16 @@ typedef enum // -#define WM_POINTERUPDATE 0x0245 -#define WM_POINTERDOWN 0x0246 -#define WM_POINTERUP 0x0247 - -#define POINTER_FLAG_CANCELED 0x00008000 // Pointer is departing in an abnormal manner +#define WM_POINTERENTER 0x0249 +#define WM_POINTERLEAVE 0x024A +#define WM_POINTERUPDATE 0x0245 +#define WM_POINTERDOWN 0x0246 +#define WM_POINTERUP 0x0247 +#define WM_POINTERCAPTURECHANGED 0x024C +#define POINTER_CANCELLED 0x1000 #define GET_POINTERID_WPARAM(wParam) (LOWORD(wParam)) -typedef UINT32 POINTER_FLAGS; - typedef enum { PT_POINTER = 0x00000001, PT_TOUCH = 0x00000002, @@ -46,6 +35,28 @@ typedef enum { PT_TOUCHPAD = 0x00000005 } POINTER_INPUT_TYPE; +typedef enum { + POINTER_FLAG_NONE = 0x00000000, + POINTER_FLAG_NEW = 0x00000001, + POINTER_FLAG_INRANGE = 0x00000002, + POINTER_FLAG_INCONTACT = 0x00000004, + POINTER_FLAG_FIRSTBUTTON = 0x00000010, + POINTER_FLAG_SECONDBUTTON = 0x00000020, + POINTER_FLAG_THIRDBUTTON = 0x00000040, + POINTER_FLAG_FOURTHBUTTON = 0x00000080, + POINTER_FLAG_FIFTHBUTTON = 0x00000100, + POINTER_FLAG_PRIMARY = 0x00002000, + POINTER_FLAG_CONFIDENCE = 0x00004000, + POINTER_FLAG_CANCELED = 0x00008000, + POINTER_FLAG_DOWN = 0x00010000, + POINTER_FLAG_UPDATE = 0x00020000, + POINTER_FLAG_UP = 0x00040000, + POINTER_FLAG_WHEEL = 0x00080000, + POINTER_FLAG_HWHEEL = 0x00100000, + POINTER_FLAG_CAPTURECHANGED = 0x00200000, + POINTER_FLAG_HASTRANSFORM = 0x00400000 +} POINTER_FLAGS; + typedef enum { POINTER_CHANGE_NONE, POINTER_CHANGE_FIRSTBUTTON_DOWN, @@ -71,60 +82,98 @@ typedef enum { TOUCH_MASK_PRESSURE = 0x00000004 } TOUCH_MASK; +typedef enum { + PEN_FLAG_NONE = 0x00000000, + PEN_FLAG_BARREL = 0x00000001, + PEN_FLAG_INVERTED = 0x00000002, + PEN_FLAG_ERASER = 0x00000004 +} PEN_FLAGS; + +typedef enum { + PEN_MASK_NONE = 0x00000000, + PEN_MASK_PRESSURE = 0x00000001, + PEN_MASK_ROTATION = 0x00000002, + PEN_MASK_TILT_X = 0x00000004, + PEN_MASK_TILT_Y = 0x00000008 +} PEN_MASK; + typedef struct { - POINTER_INPUT_TYPE pointerType; - UINT32 pointerId; - UINT32 frameId; - POINTER_FLAGS pointerFlags; - HANDLE sourceDevice; - HWND hwndTarget; - POINT ptPixelLocation; - POINT ptHimetricLocation; - POINT ptPixelLocationRaw; - POINT ptHimetricLocationRaw; - DWORD dwTime; - UINT32 historyCount; - INT32 InputData; - DWORD dwKeyStates; - UINT64 PerformanceCount; + POINTER_INPUT_TYPE pointerType; + UINT32 pointerId; + UINT32 frameId; + POINTER_FLAGS pointerFlags; + HANDLE sourceDevice; + HWND hwndTarget; + POINT ptPixelLocation; + POINT ptHimetricLocation; + POINT ptPixelLocationRaw; + POINT ptHimetricLocationRaw; + DWORD dwTime; + UINT32 historyCount; + INT32 InputData; + DWORD dwKeyStates; + UINT64 PerformanceCount; POINTER_BUTTON_CHANGE_TYPE ButtonChangeType; } POINTER_INFO; typedef struct { - POINTER_INFO pointerInfo; - TOUCH_FLAGS touchFlags; - TOUCH_MASK touchMask; - RECT rcContact; - RECT rcContactRaw; - UINT32 orientation; - UINT32 pressure; + POINTER_INFO pointerInfo; + TOUCH_FLAGS touchFlags; + TOUCH_MASK touchMask; + RECT rcContact; + RECT rcContactRaw; + UINT32 orientation; + UINT32 pressure; } POINTER_TOUCH_INFO; +typedef struct { + POINTER_INFO pointerInfo; + PEN_FLAGS penFlags; + PEN_MASK penMask; + UINT32 pressure; + UINT32 rotation; + INT32 tiltX; + INT32 tiltY; +} POINTER_PEN_INFO; + typedef BOOL (WINAPI *GET_POINTER_INFO)(UINT32 pointerId, POINTER_INFO *pointerInfo); typedef BOOL (WINAPI *GET_POINTER_TOUCH_INFO)(UINT32 pointerId, POINTER_TOUCH_INFO *pointerInfo); +typedef BOOL (WINAPI *GET_POINTER_PEN_INFO)(UINT32 pointerId, POINTER_PEN_INFO *pointerInfo); -GET_POINTER_INFO GetPointerInfo; -GET_POINTER_TOUCH_INFO GetPointerTouchInfo; +GET_POINTER_INFO GetPointerInfo; +GET_POINTER_TOUCH_INFO GetPointerTouchInfo; +GET_POINTER_PEN_INFO GetPointerPenInfo; // -typedef void(__stdcall * MousePointerBeganFuncPtr)(int id, unsigned int buttons, Vector2 position); -typedef void(__stdcall * MousePointerMovedFuncPtr)(int id, unsigned int buttonsSet, unsigned int buttonsClear, Vector2 position); -typedef void(__stdcall * TouchPointerBeganFuncPtr)(int id, unsigned int buttons, unsigned int orientation, unsigned int pressure, Vector2 position); -typedef void(__stdcall * TouchPointerMovedFuncPtr)(int id, unsigned int buttonsSet, unsigned int orientation, unsigned int pressure, unsigned int buttonsClear, Vector2 position); -typedef void(__stdcall * PenPointerBeganFuncPtr)(int id, unsigned int buttons, Vector2 position); -typedef void(__stdcall * PenPointerMovedFuncPtr)(int id, unsigned int buttonsSet, unsigned int buttonsClear, Vector2 position); -typedef void(__stdcall * PointerEndedFuncPtr)(int id, POINTER_INPUT_TYPE type, unsigned int buttons); -typedef void(__stdcall * PointerCancelledFuncPtr)(int id, POINTER_INPUT_TYPE type); - -MousePointerBeganFuncPtr _mousePointerBeganFunc; -MousePointerMovedFuncPtr _mousePointerMovedFunc; -TouchPointerBeganFuncPtr _touchPointerBeganFunc; -TouchPointerMovedFuncPtr _touchPointerMovedFunc; -PenPointerBeganFuncPtr _penPointerBeganFunc; -PenPointerMovedFuncPtr _penPointerMovedFunc; -PointerEndedFuncPtr _pointerEndedFunc; -PointerCancelledFuncPtr _pointerCancelledFunc; +struct Vector2 +{ + float x, y; + + Vector2(float x, float y) + { + this->x = x; + this->y = y; + } +}; + +struct PointerData +{ + POINTER_FLAGS pointerFlags; + UINT32 flags; + UINT32 mask; + POINTER_BUTTON_CHANGE_TYPE changedButtons; + UINT32 rotation; + UINT32 pressure; + INT32 tiltX; + INT32 tiltY; +}; + +typedef void(__stdcall * PointerDelegatePtr)(int id, UINT32 event, POINTER_INPUT_TYPE type, Vector2 position, PointerData data); +typedef void(__stdcall * LogFuncPtr)(BSTR log); + +PointerDelegatePtr _delegate; +LogFuncPtr _log; HWND _currentWindow; int _screenWidth; int _screenHeight; @@ -137,15 +186,12 @@ LONG_PTR _oldWindowProc; extern "C" { - EXPORT_API void __stdcall Init(TOUCH_API api, - MousePointerBeganFuncPtr mouseBegan, MousePointerMovedFuncPtr mouseMoved, - TouchPointerBeganFuncPtr touchBegan, TouchPointerMovedFuncPtr touchMoved, - PenPointerBeganFuncPtr penBegan, PenPointerMovedFuncPtr penMoved, - PointerEndedFuncPtr ended, PointerCancelledFuncPtr cancelled); + EXPORT_API void __stdcall Init(TOUCH_API api, LogFuncPtr logFunc, PointerDelegatePtr delegate); EXPORT_API void __stdcall SetScreenParams(int width, int height, float offsetX, float offsetY, float scaleX, float scaleY); EXPORT_API void __stdcall Dispose(); } +void log(const wchar_t* str); LRESULT CALLBACK wndProc8(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); LRESULT CALLBACK wndProc7(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); void decodeWin8Touches(UINT msg, WPARAM wParam, LPARAM lParam); diff --git a/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs b/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs index 6984bb2c5..4034b61f7 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs @@ -25,7 +25,7 @@ public interface IInputSource : INTERNAL_IInputSource /// /// This method is called by to synchronously update the input. /// - void UpdateInput(); + bool UpdateInput(); /// /// Cancels the pointer. diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs index 730d40d46..d33f0c077 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs @@ -1,4 +1,4 @@ -/* +/* * @author Valentin Simonov / http://va.lent.in/ */ @@ -14,32 +14,32 @@ namespace TouchScript.InputSources.InputHandlers /// public class MouseHandler : IInputSource, IDisposable { - #region Consts + #region Consts - private enum State - { - /// - /// Only mouse pointer is active - /// - Mouse, - - /// - /// ALT is pressed but mouse isn't - /// - WaitingForFake, - - /// - /// Mouse and fake pointers are moving together after ALT+PRESS - /// - MouseAndFake, - - /// - /// After ALT+RELEASE fake pointer is stationary while mouse can move freely - /// - StationaryFake - } + private enum State + { + /// + /// Only mouse pointer is active + /// + Mouse, + + /// + /// ALT is pressed but mouse isn't + /// + WaitingForFake, + + /// + /// Mouse and fake pointers are moving together after ALT+PRESS + /// + MouseAndFake, + + /// + /// After ALT+RELEASE fake pointer is stationary while mouse can move freely + /// + StationaryFake + } - #endregion + #endregion #region Public properties @@ -75,7 +75,7 @@ public bool EmulateSecondMousePointer private PointerDelegate removePointer; private PointerDelegate cancelPointer; - private State state; + private State state; private ObjectPool mousePool; private MousePointer mousePointer, fakeMousePointer; private Vector3 mousePointPos = Vector3.zero; @@ -100,99 +100,135 @@ public MouseHandler(PointerDelegate addPointer, PointerDelegate updatePointer, P this.removePointer = removePointer; this.cancelPointer = cancelPointer; - mousePool = new ObjectPool(4, () => new MousePointer(this), null, (t) => t.INTERNAL_Reset()); + mousePool = new ObjectPool(4, () => new MousePointer(this), null, resetPointer); mousePointPos = Input.mousePosition; - mousePointer = internalAddPointer(remapCoordinates(mousePointPos)); + Debug.Log(mousePointPos); + mousePointer = internalAddPointer(remapCoordinates(mousePointPos)); - stateMouse(); + stateMouse(); } #region Public methods + public void CancelMousePointer() + { + if (mousePointer != null) + { + cancelPointer(mousePointer); + mousePointer = null; + } + } + /// - public void UpdateInput() + public bool UpdateInput() { - var buttons = state == State.MouseAndFake ? fakeMousePointer.Buttons : mousePointer.Buttons; - var newButtons = getMouseButtons(); - var pos = Input.mousePosition; - Vector2 remappedPos = new Vector2(0, 0); - - if (mousePointPos != pos) - { - remappedPos = remapCoordinates(new Vector2(pos.x, pos.y)); - mousePointer.Position = remappedPos; - updatePointer(mousePointer); - } - - var scroll = Input.mouseScrollDelta; - if (!Mathf.Approximately(scroll.sqrMagnitude, 0.0f)) - { - mousePointer.ScrollDelta = scroll; - updatePointer(mousePointer); - } + var pos = Input.mousePosition; + Vector2 remappedPos = new Vector2(0, 0); + bool updated = false; + + if (mousePointPos != pos) + { + remappedPos = remapCoordinates(new Vector2(pos.x, pos.y)); + + if (mousePointer == null) + { + mousePointer = internalAddPointer(remappedPos); + } + else + { + mousePointer.Position = remappedPos; + updatePointer(mousePointer); + } + updated = true; + } + + if (mousePointer == null) return false; + + var buttons = state == State.MouseAndFake ? fakeMousePointer.Buttons : mousePointer.Buttons; + var newButtons = getMouseButtons(); + var scroll = Input.mouseScrollDelta; + if (!Mathf.Approximately(scroll.sqrMagnitude, 0.0f)) + { + mousePointer.ScrollDelta = scroll; + updatePointer(mousePointer); + } if (emulateSecondMousePointer) { - switch (state) - { - case State.Mouse: - if (Input.GetKeyDown(KeyCode.LeftAlt) && !Input.GetKeyUp(KeyCode.LeftAlt) - && ((newButtons & Pointer.PointerButtonState.AnyButtonPressed) == 0)) - { - stateWaitingForFake(); - } else { - if (buttons != newButtons) updateButtons(buttons, newButtons); - } - break; - case State.WaitingForFake: - if (Input.GetKey(KeyCode.LeftAlt)) - { - if ((newButtons & Pointer.PointerButtonState.AnyButtonDown) != 0) - { - // A button is down while holding Alt - fakeMousePointer = internalAddPointer(pos, newButtons, mousePointer.Flags | Pointer.FLAG_ARTIFICIAL); - pressPointer(fakeMousePointer); - stateMouseAndFake(); - } - } else { - stateMouse(); - } - break; - case State.MouseAndFake: - if (fakeTouchReleased()) - { - stateMouse(); - } else { - if (mousePointPos != pos) - { - fakeMousePointer.Position = remappedPos; - updatePointer(fakeMousePointer); - } - if ((newButtons & Pointer.PointerButtonState.AnyButtonPressed) == 0) - { - // All buttons are released, Alt is still holding - stateStationaryFake(); - } else if (buttons != newButtons) - { - fakeMousePointer.Buttons = newButtons; - updatePointer(fakeMousePointer); - } - } - break; - case State.StationaryFake: - if (buttons != newButtons) updateButtons(buttons, newButtons); - if (fakeTouchReleased()) - { - stateMouse(); - } - break; - } - } else { - if (buttons != newButtons) updateButtons(buttons, newButtons); - } - - mousePointPos = pos; + switch (state) + { + case State.Mouse: + if (Input.GetKeyDown(KeyCode.LeftAlt) && !Input.GetKeyUp(KeyCode.LeftAlt) + && ((newButtons & Pointer.PointerButtonState.AnyButtonPressed) == 0)) + { + stateWaitingForFake(); + } + else + { + if (buttons != newButtons) updateButtons(buttons, newButtons); + } + break; + case State.WaitingForFake: + if (Input.GetKey(KeyCode.LeftAlt)) + { + if ((newButtons & Pointer.PointerButtonState.AnyButtonDown) != 0) + { + // A button is down while holding Alt + fakeMousePointer = internalAddPointer(pos, newButtons, mousePointer.Flags | Pointer.FLAG_ARTIFICIAL); + pressPointer(fakeMousePointer); + stateMouseAndFake(); + } + } + else + { + stateMouse(); + } + break; + case State.MouseAndFake: + if (fakeTouchReleased()) + { + stateMouse(); + } + else + { + if (mousePointPos != pos) + { + fakeMousePointer.Position = remappedPos; + updatePointer(fakeMousePointer); + } + if ((newButtons & Pointer.PointerButtonState.AnyButtonPressed) == 0) + { + // All buttons are released, Alt is still holding + stateStationaryFake(); + } + else if (buttons != newButtons) + { + fakeMousePointer.Buttons = newButtons; + updatePointer(fakeMousePointer); + } + } + break; + case State.StationaryFake: + if (buttons != newButtons) updateButtons(buttons, newButtons); + if (fakeTouchReleased()) + { + stateMouse(); + } + break; + } + } + else + { + if (buttons != newButtons) + { + updateButtons(buttons, newButtons); + updated = true; + } + } + + mousePointPos = pos; + return updated; } /// @@ -202,7 +238,7 @@ public bool CancelPointer(Pointer pointer, bool shouldReturn) { cancelPointer(mousePointer); if (shouldReturn) mousePointer = internalReturnPointer(mousePointer); - else mousePointer = internalAddPointer(mousePointer.Position); // can't totally cancel mouse pointer + else mousePointer = internalAddPointer(mousePointer.Position); // can't totally cancel mouse pointer return true; } if (pointer.Equals(fakeMousePointer)) @@ -266,16 +302,16 @@ private Pointer.PointerButtonState getMouseButtons() return buttons; } - private void updateButtons(Pointer.PointerButtonState oldButtons, Pointer.PointerButtonState newButtons) - { + private void updateButtons(Pointer.PointerButtonState oldButtons, Pointer.PointerButtonState newButtons) + { // pressed something - if (oldButtons == Pointer.PointerButtonState.Nothing) + if (oldButtons == Pointer.PointerButtonState.Nothing) { // pressed and released this frame if ((newButtons & Pointer.PointerButtonState.AnyButtonPressed) == 0) { // Add pressed buttons for processing - mousePointer.Buttons = newButtons | (Pointer.PointerButtonState) ((uint) (newButtons & Pointer.PointerButtonState.AnyButtonDown) >> 1); + mousePointer.Buttons = PointerUtils.PressDownButtons(newButtons); pressPointer(mousePointer); internalReleaseMousePointer(newButtons); } @@ -302,29 +338,30 @@ private void updateButtons(Pointer.PointerButtonState oldButtons, Pointer.Pointe updatePointer(mousePointer); } } - } - - private bool fakeTouchReleased() - { - if (!Input.GetKey(KeyCode.LeftAlt)) - { - // Alt is released, need to kill the fake touch - fakeMousePointer.Buttons = (Pointer.PointerButtonState)((uint)fakeMousePointer.Buttons << 2); // Convert current pressed buttons to UP - releasePointer(fakeMousePointer); - removePointer(fakeMousePointer); - fakeMousePointer = null; // Will be returned to the pool by INTERNAL_DiscardPointer - return true; - } - return false; - } + } + + private bool fakeTouchReleased() + { + if (!Input.GetKey(KeyCode.LeftAlt)) + { + // Alt is released, need to kill the fake touch + fakeMousePointer.Buttons = PointerUtils.UpPressedButtons(fakeMousePointer.Buttons); // Convert current pressed buttons to UP + releasePointer(fakeMousePointer); + removePointer(fakeMousePointer); + fakeMousePointer = null; // Will be returned to the pool by INTERNAL_DiscardPointer + return true; + } + return false; + } private MousePointer internalAddPointer(Vector2 position, Pointer.PointerButtonState buttons = Pointer.PointerButtonState.Nothing, uint flags = 0) { var pointer = mousePool.Get(); pointer.Position = position; pointer.Buttons |= buttons; - pointer.Flags |= flags; + pointer.Flags |= flags; addPointer(pointer); + updatePointer(pointer); return pointer; } @@ -343,7 +380,7 @@ private MousePointer internalReturnPointer(MousePointer pointer) if ((newPointer.Buttons & Pointer.PointerButtonState.AnyButtonPressed) != 0) { // Adding down state this frame - newPointer.Buttons |= (Pointer.PointerButtonState) ((uint) (newPointer.Buttons & Pointer.PointerButtonState.AnyButtonPressed) << 1); + newPointer.Buttons = PointerUtils.DownPressedButtons(newPointer.Buttons); pressPointer(newPointer); } return newPointer; @@ -355,36 +392,40 @@ private Vector2 remapCoordinates(Vector2 position) return position; } - #endregion + private void resetPointer(Pointer p) + { + p.INTERNAL_Reset(); + } - #region State logic + #endregion - private void stateMouse() - { - setState(State.Mouse); - } + #region State logic - private void stateWaitingForFake() - { - setState(State.WaitingForFake); - } + private void stateMouse() + { + setState(State.Mouse); + } - private void stateMouseAndFake() - { - setState(State.MouseAndFake); - } + private void stateWaitingForFake() + { + setState(State.WaitingForFake); + } - private void stateStationaryFake() - { - setState(State.StationaryFake); - } + private void stateMouseAndFake() + { + setState(State.MouseAndFake); + } - private void setState(State newState) - { - state = newState; - } + private void stateStationaryFake() + { + setState(State.StationaryFake); + } - #endregion + private void setState(State newState) + { + state = newState; + } + #endregion } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs index 48c4578f8..4012497ae 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs @@ -1,4 +1,4 @@ -/* +/* * @author Michael Holub * @author Valentin Simonov / http://va.lent.in/ */ @@ -66,14 +66,14 @@ public TouchHandler(PointerDelegate addPointer, PointerDelegate updatePointer, P this.removePointer = removePointer; this.cancelPointer = cancelPointer; - touchPool = new ObjectPool(10, () => new TouchPointer(this), null, (t) => t.INTERNAL_Reset()); + touchPool = new ObjectPool(10, () => new TouchPointer(this), null, resetPointer); touchPool.Name = "Touch"; } #region Public methods /// - public void UpdateInput() + public bool UpdateInput() { for (var i = 0; i < Input.touchCount; ++i) { @@ -95,20 +95,22 @@ public void UpdateInput() } break; case TouchPhase.Moved: - if (systemToInternalId.TryGetValue(t.fingerId, out touchState)) - { - if (touchState.Phase != TouchPhase.Canceled) - { - touchState.Pointer.Position = t.position; + if (systemToInternalId.TryGetValue(t.fingerId, out touchState)) + { + if (touchState.Phase != TouchPhase.Canceled) + { + touchState.Pointer.Position = t.position; updatePointer(touchState.Pointer); - } - } + } + } else { // Missed began phase systemToInternalId.Add(t.fingerId, new TouchState(internalAddPointer(t.position))); } break; + // NOTE: Unity touch on Windows reports Cancelled as Ended + // when a touch goes out of display boundary case TouchPhase.Ended: if (systemToInternalId.TryGetValue(t.fingerId, out touchState)) { @@ -145,6 +147,8 @@ public void UpdateInput() break; } } + + return Input.touchCount > 0; } /// @@ -243,6 +247,11 @@ private Vector2 remapCoordinates(Vector2 position) return position; } + private void resetPointer(Pointer p) + { + p.INTERNAL_Reset(); + } + #endregion private struct TouchState @@ -255,8 +264,6 @@ public TouchState(Pointer pointer, TouchPhase phase = TouchPhase.Began) Pointer = pointer; Phase = phase; } - } - } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs index 5975bfc93..d6e9f4a8e 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs @@ -20,7 +20,7 @@ namespace TouchScript.InputSources.InputHandlers /// public class Windows8PointerHandler : WindowsPointerHandler { -#region Public properties + #region Public properties public bool MouseInPointer { @@ -39,9 +39,7 @@ public bool MouseInPointer { if ((mousePointer.Buttons & Pointer.PointerButtonState.AnyButtonPressed) != 0) { - var pressed = (uint) (mousePointer.Buttons & Pointer.PointerButtonState.AnyButtonPressed); - mousePointer.Buttons |= (Pointer.PointerButtonState) (pressed << 2); // add up state - mousePointer.Buttons &= ~Pointer.PointerButtonState.AnyButtonPressed; // remove pressed state + mousePointer.Buttons = PointerUtils.UpPressedButtons(mousePointer.Buttons); releasePointer(mousePointer); } removePointer(mousePointer); @@ -50,30 +48,36 @@ public bool MouseInPointer } } -#endregion + #endregion -#region Private variables + #region Private variables private bool mouseInPointer = true; -#endregion + #endregion -#region Constructor + #region Constructor /// public Windows8PointerHandler(PointerDelegate addPointer, PointerDelegate updatePointer, PointerDelegate pressPointer, PointerDelegate releasePointer, PointerDelegate removePointer, PointerDelegate cancelPointer) : base(addPointer, updatePointer, pressPointer, releasePointer, removePointer, cancelPointer) { - mousePool = new ObjectPool(4, () => new MousePointer(this), null, (t) => t.INTERNAL_Reset()); - penPool = new ObjectPool(2, () => new PenPointer(this), null, (t) => t.INTERNAL_Reset()); + mousePool = new ObjectPool(4, () => new MousePointer(this), null, resetPointer); + penPool = new ObjectPool(2, () => new PenPointer(this), null, resetPointer); mousePointer = internalAddMousePointer(Vector3.zero); init(TOUCH_API.WIN8); } -#endregion + #endregion -#region Public methods + #region Public methods + + /// + public override bool UpdateInput() + { + return true; + } /// public override bool CancelPointer(Pointer pointer, bool shouldReturn) @@ -82,14 +86,13 @@ public override bool CancelPointer(Pointer pointer, bool shouldReturn) { cancelPointer(mousePointer); if (shouldReturn) mousePointer = internalReturnMousePointer(mousePointer); - else mousePointer = internalAddMousePointer(pointer.Position); // can't totally cancell mouse pointer + else mousePointer = internalAddMousePointer(pointer.Position); // can't totally cancel mouse pointer return true; } if (pointer.Equals(penPointer)) { cancelPointer(penPointer); if (shouldReturn) penPointer = internalReturnPenPointer(penPointer); - else penPointer = internalAddPenPointer(pointer.Position); // can't totally cancell mouse pointer return true; } return base.CancelPointer(pointer, shouldReturn); @@ -114,9 +117,9 @@ public override void Dispose() base.Dispose(); } -#endregion + #endregion -#region Internal methods + #region Internal methods /// public override void INTERNAL_DiscardPointer(Pointer pointer) @@ -126,8 +129,7 @@ public override void INTERNAL_DiscardPointer(Pointer pointer) else base.INTERNAL_DiscardPointer(pointer); } -#endregion - + #endregion } public class Windows7PointerHandler : WindowsPointerHandler @@ -139,35 +141,30 @@ public Windows7PointerHandler(PointerDelegate addPointer, PointerDelegate update { init(TOUCH_API.WIN7); } - } - public abstract class WindowsPointerHandler : IInputSource, IDisposable - { -#region Consts + #region Public methods - /// - /// Source of pointer input. - /// - public enum PointerSource + /// + public override bool UpdateInput() { - Pointer, - Pen, - Mouse + return winTouchToInternalId.Count > 0; } + #endregion + } + + public abstract class WindowsPointerHandler : IInputSource, IDisposable + { + #region Consts + /// /// Windows constant to turn off press and hold visual effect. /// public const string PRESS_AND_HOLD_ATOM = "MicrosoftTabletPenServiceProperty"; - protected delegate void NativeMousePointerDown(int id, Pointer.PointerButtonState buttons, Vector2 position); - protected delegate void NativeMousePointerUpdate(int id, Pointer.PointerButtonState buttonsSet, Pointer.PointerButtonState buttonsClear, Vector2 position); - protected delegate void NativeTouchPointerDown(int id, Pointer.PointerButtonState buttons, uint orientation, uint pressure, Vector2 position); - protected delegate void NativeTouchPointerUpdate(int id, Pointer.PointerButtonState buttonsSet, Pointer.PointerButtonState buttonsClear, uint orientation, uint pressure, Vector2 position); - protected delegate void NativePenPointerDown(int id, Pointer.PointerButtonState buttons, Vector2 position); - protected delegate void NativePenPointerUpdate(int id, Pointer.PointerButtonState buttonsSet, Pointer.PointerButtonState buttonsClear, Vector2 position); - protected delegate void NativePointerUp(int id, POINTER_INPUT_TYPE type, Pointer.PointerButtonState buttons); - protected delegate void NativePointerCancel(int id, POINTER_INPUT_TYPE type); + protected delegate void NativePointerDelegate(int id, PointerEvent evt, PointerType type, Vector2 position, PointerData data); + + protected delegate void NativeLog([MarshalAs(UnmanagedType.BStr)] string log); #endregion @@ -180,14 +177,8 @@ public enum PointerSource #region Protected variables - private NativeMousePointerDown nativeMousePointerDownDelegate; - private NativeMousePointerUpdate nativeMousePointerUpdateDelegate; - private NativeTouchPointerDown nativeTouchPointerDownDelegate; - private NativeTouchPointerUpdate nativeTouchPointerUpdateDelegate; - private NativePenPointerDown nativePenPointerDownDelegate; - private NativePenPointerUpdate nativePenPointerUpdateDelegate; - private NativePointerUp nativePointerUpDelegate; - private NativePointerCancel nativePointerCancelDelegate; + private NativePointerDelegate nativePointerDelegate; + private NativeLog nativeLogDelegate; protected PointerDelegate addPointer; protected PointerDelegate updatePointer; @@ -228,29 +219,24 @@ public WindowsPointerHandler(PointerDelegate addPointer, PointerDelegate updateP this.removePointer = removePointer; this.cancelPointer = cancelPointer; - nativeMousePointerDownDelegate = nativeMousePointerDown; - nativeMousePointerUpdateDelegate = nativeMousePointerUpdate; - nativeTouchPointerDownDelegate = nativeTouchPointerDown; - nativeTouchPointerUpdateDelegate = nativeTouchPointerUpdate; - nativePenPointerDownDelegate = nativePenPointerDown; - nativePenPointerUpdateDelegate = nativePenPointerUpdate; - nativePointerUpDelegate = nativePointerUp; - nativePointerCancelDelegate = nativePointerCancel; + nativeLogDelegate = nativeLog; + nativePointerDelegate = nativePointer; - touchPool = new ObjectPool(10, () => new TouchPointer(this), null, (t) => t.INTERNAL_Reset()); + touchPool = new ObjectPool(10, () => new TouchPointer(this), null, resetPointer); hMainWindow = GetActiveWindow(); disablePressAndHold(); initScaling(); } -#endregion + #endregion -#region Public methods + #region Public methods /// - public void UpdateInput() + public virtual bool UpdateInput() { + return false; } /// @@ -288,9 +274,9 @@ public virtual void Dispose() DisposePlugin(); } -#endregion + #endregion -#region Internal methods + #region Internal methods /// public virtual void INTERNAL_DiscardPointer(Pointer pointer) @@ -301,16 +287,14 @@ public virtual void INTERNAL_DiscardPointer(Pointer pointer) touchPool.Release(p); } -#endregion + #endregion -#region Protected methods + #region Protected methods - protected TouchPointer internalAddTouchPointer(Vector2 position, uint orientation = 0, float pressure = 0) + protected TouchPointer internalAddTouchPointer(Vector2 position) { var pointer = touchPool.Get(); pointer.Position = remapCoordinates(position); - pointer.Orientation = orientation; - pointer.Pressure = pressure; pointer.Buttons |= Pointer.PointerButtonState.FirstButtonDown | Pointer.PointerButtonState.FirstButtonPressed; addPointer(pointer); pressPointer(pointer); @@ -353,7 +337,7 @@ protected MousePointer internalReturnMousePointer(MousePointer pointer) if ((newPointer.Buttons & Pointer.PointerButtonState.AnyButtonPressed) != 0) { // Adding down state this frame - newPointer.Buttons |= (Pointer.PointerButtonState)((uint)(newPointer.Buttons & Pointer.PointerButtonState.AnyButtonPressed) << 1); + newPointer.Buttons = PointerUtils.DownPressedButtons(newPointer.Buttons); pressPointer(newPointer); } return newPointer; @@ -361,12 +345,19 @@ protected MousePointer internalReturnMousePointer(MousePointer pointer) protected PenPointer internalAddPenPointer(Vector2 position) { + if (penPointer != null) throw new InvalidOperationException("One pen pointer is already registered! Trying to add another one."); var pointer = penPool.Get(); pointer.Position = remapCoordinates(position); addPointer(pointer); return pointer; } + protected void internalRemovePenPointer(PenPointer pointer) + { + removePointer(pointer); + penPointer = null; + } + protected PenPointer internalReturnPenPointer(PenPointer pointer) { var newPointer = penPool.Get(); @@ -376,7 +367,7 @@ protected PenPointer internalReturnPenPointer(PenPointer pointer) if ((newPointer.Buttons & Pointer.PointerButtonState.AnyButtonPressed) != 0) { // Adding down state this frame - newPointer.Buttons |= (Pointer.PointerButtonState)((uint)(newPointer.Buttons & Pointer.PointerButtonState.AnyButtonPressed) << 1); + newPointer.Buttons = PointerUtils.DownPressedButtons(newPointer.Buttons); pressPointer(newPointer); } return newPointer; @@ -384,11 +375,7 @@ protected PenPointer internalReturnPenPointer(PenPointer pointer) protected void init(TOUCH_API api) { - Init(api, - nativeMousePointerDownDelegate, nativeMousePointerUpdateDelegate, - nativeTouchPointerDownDelegate, nativeTouchPointerUpdateDelegate, - nativePenPointerDownDelegate, nativePenPointerUpdateDelegate, - nativePointerUpDelegate, nativePointerCancelDelegate); + Init(api, nativeLogDelegate, nativePointerDelegate); } protected Vector2 remapCoordinates(Vector2 position) @@ -397,6 +384,11 @@ protected Vector2 remapCoordinates(Vector2 position) return position; } + protected void resetPointer(Pointer p) + { + p.INTERNAL_Reset(); + } + #endregion #region Private functions @@ -432,7 +424,7 @@ private void initScaling() int width, height; getNativeMonitorResolution(out width, out height); - float scale = Mathf.Max(Screen.width / ((float)width), Screen.height / ((float)height)); + float scale = Mathf.Max(Screen.width / ((float) width), Screen.height / ((float) height)); SetScreenParams(Screen.width, Screen.height, (width - Screen.width / scale) * .5f, (height - Screen.height / scale) * .5f, scale, scale); } @@ -457,97 +449,157 @@ private void getNativeMonitorResolution(out int width, out int height) #region Pointer callbacks - private void nativeMousePointerDown(int id, Pointer.PointerButtonState buttons, Vector2 position) + private void nativeLog(string log) { - mousePointer.Buttons = buttons; - pressPointer(mousePointer); + Debug.Log("[WindowsTouch.dll]: " + log); } - private void nativeTouchPointerDown(int id, Pointer.PointerButtonState buttons, uint orientation, uint pressure, Vector2 position) + private void nativePointer(int id, PointerEvent evt, PointerType type, Vector2 position, PointerData data) { - winTouchToInternalId.Add(id, internalAddTouchPointer(position, orientation, pressure / 1024f)); - } - - private void nativePenPointerDown(int id, Pointer.PointerButtonState buttons, Vector2 position) - { - penPointer.Buttons = buttons; - pressPointer(penPointer); + switch (type) + { + case PointerType.Mouse: + switch (evt) + { + // Enter and Exit are not used - mouse is always present + // TODO: how does it work with 2+ mice? + case PointerEvent.Enter: + throw new NotImplementedException("This is not supposed to be called o.O"); + case PointerEvent.Leave: + break; + case PointerEvent.Down: + mousePointer.Buttons = updateButtons(mousePointer.Buttons, data.PointerFlags, data.ChangedButtons); + pressPointer(mousePointer); + break; + case PointerEvent.Up: + mousePointer.Buttons = updateButtons(mousePointer.Buttons, data.PointerFlags, data.ChangedButtons); + releasePointer(mousePointer); + break; + case PointerEvent.Update: + mousePointer.Position = position; + mousePointer.Buttons = updateButtons(mousePointer.Buttons, data.PointerFlags, data.ChangedButtons); + updatePointer(mousePointer); + break; + case PointerEvent.Cancelled: + cancelPointer(mousePointer); + // can't cancel the mouse pointer, it is always present + mousePointer = internalAddMousePointer(mousePointer.Position); + break; + } + break; + case PointerType.Touch: + switch (evt) + { + // Enter/Leave logic is handles in Down/Up + case PointerEvent.Enter: + case PointerEvent.Leave: + break; + case PointerEvent.Down: + TouchPointer touchPointer = internalAddTouchPointer(position); + touchPointer.Rotation = getTouchRotation(ref data); + touchPointer.Pressure = getTouchPressure(ref data); + winTouchToInternalId.Add(id, touchPointer); + break; + case PointerEvent.Up: + if (winTouchToInternalId.TryGetValue(id, out touchPointer)) + { + winTouchToInternalId.Remove(id); + internalRemoveTouchPointer(touchPointer); + } + break; + case PointerEvent.Update: + if (!winTouchToInternalId.TryGetValue(id, out touchPointer)) return; + touchPointer.Position = position; + touchPointer.Rotation = getTouchRotation(ref data); + touchPointer.Pressure = getTouchPressure(ref data); + updatePointer(touchPointer); + break; + case PointerEvent.Cancelled: + if (winTouchToInternalId.TryGetValue(id, out touchPointer)) + { + winTouchToInternalId.Remove(id); + cancelPointer(touchPointer); + } + break; + } + break; + case PointerType.Pen: + switch (evt) + { + case PointerEvent.Enter: + penPointer = internalAddPenPointer(position); + penPointer.Pressure = getPenPressure(ref data); + penPointer.Rotation = getPenRotation(ref data); + break; + case PointerEvent.Leave: + if (penPointer == null) break; + internalRemovePenPointer(penPointer); + break; + case PointerEvent.Down: + if (penPointer == null) break; + penPointer.Buttons = updateButtons(penPointer.Buttons, data.PointerFlags, data.ChangedButtons); + penPointer.Pressure = getPenPressure(ref data); + penPointer.Rotation = getPenRotation(ref data); + pressPointer(penPointer); + break; + case PointerEvent.Up: + if (penPointer == null) break; + mousePointer.Buttons = updateButtons(penPointer.Buttons, data.PointerFlags, data.ChangedButtons); + releasePointer(penPointer); + break; + case PointerEvent.Update: + if (penPointer == null) break; + penPointer.Position = position; + penPointer.Pressure = getPenPressure(ref data); + penPointer.Rotation = getPenRotation(ref data); + penPointer.Buttons = updateButtons(penPointer.Buttons, data.PointerFlags, data.ChangedButtons); + updatePointer(penPointer); + break; + case PointerEvent.Cancelled: + if (penPointer == null) break; + cancelPointer(penPointer); + break; + } + break; + } } - private void nativeMousePointerUpdate(int id, Pointer.PointerButtonState buttonsSet, Pointer.PointerButtonState buttonsClear, Vector2 position) + private Pointer.PointerButtonState updateButtons(Pointer.PointerButtonState current, PointerFlags flags, ButtonChangeType change) { - if (mousePointer == null) return; - mousePointer.Position = position; - mousePointer.Buttons &= ~buttonsClear; - mousePointer.Buttons |= buttonsSet; - updatePointer(mousePointer); + var currentUpDown = ((uint) current) & 0xFFFFFC00; + var pressed = ((uint) flags >> 4) & 0x1F; + var newUpDown = 0U; + if (change != ButtonChangeType.None) newUpDown = 1U << (10 + (int) change); + var combined = (Pointer.PointerButtonState) (pressed | newUpDown | currentUpDown); + return combined; } - private void nativeTouchPointerUpdate(int id, Pointer.PointerButtonState buttonsSet, Pointer.PointerButtonState buttonsClear, uint orientation, uint pressure, Vector2 position) + private float getTouchPressure(ref PointerData data) { - TouchPointer touchPointer; - if (!winTouchToInternalId.TryGetValue(id, out touchPointer)) return; - touchPointer.Position = position; - touchPointer.Orientation = orientation; - touchPointer.Pressure = pressure / 1024f; - touchPointer.Buttons &= ~buttonsClear; - touchPointer.Buttons |= buttonsSet; - updatePointer(touchPointer); + var reliable = (data.Mask & (uint) TouchMask.Pressure) > 0; + if (reliable) return data.Pressure / 1024f; + return TouchPointer.DEFAULT_PRESSURE; } - private void nativePenPointerUpdate(int id, Pointer.PointerButtonState buttonsSet, Pointer.PointerButtonState buttonsClear, Vector2 position) + private float getTouchRotation(ref PointerData data) { - if (penPointer == null) return; - penPointer.Position = position; - penPointer.Buttons &= ~buttonsClear; - penPointer.Buttons |= buttonsSet; - updatePointer(penPointer); + var reliable = (data.Mask & (uint) TouchMask.Orientation) > 0; + if (reliable) return data.Rotation / 180f * Mathf.PI; + return TouchPointer.DEFAULT_ROTATION; } - private void nativePointerUp(int id, POINTER_INPUT_TYPE type, Pointer.PointerButtonState buttons) + private float getPenPressure(ref PointerData data) { - switch (type) - { - case POINTER_INPUT_TYPE.PT_MOUSE: - mousePointer.Buttons = buttons; - releasePointer(mousePointer); - break; - case POINTER_INPUT_TYPE.PT_TOUCH: - TouchPointer touchPointer; - if (winTouchToInternalId.TryGetValue(id, out touchPointer)) - { - winTouchToInternalId.Remove(id); - internalRemoveTouchPointer(touchPointer); - } - break; - case POINTER_INPUT_TYPE.PT_PEN: - penPointer.Buttons = buttons; - releasePointer(penPointer); - break; - } + var reliable = (data.Mask & (uint) PenMask.Pressure) > 0; + if (reliable) return data.Pressure / 1024f; + return PenPointer.DEFAULT_PRESSURE; } - private void nativePointerCancel(int id, POINTER_INPUT_TYPE type) + private float getPenRotation(ref PointerData data) { - switch (type) - { - case POINTER_INPUT_TYPE.PT_MOUSE: - cancelPointer(mousePointer); - mousePointer = internalAddMousePointer(mousePointer.Position); // can't totally cancell mouse pointer - break; - case POINTER_INPUT_TYPE.PT_TOUCH: - TouchPointer touchPointer; - if (winTouchToInternalId.TryGetValue(id, out touchPointer)) - { - winTouchToInternalId.Remove(id); - cancelPointer(touchPointer); - } - break; - case POINTER_INPUT_TYPE.PT_PEN: - cancelPointer(penPointer); - penPointer = internalAddPenPointer(penPointer.Position); // can't totally cancell mouse pointer; - break; - } + var reliable = (data.Mask & (uint) PenMask.Rotation) > 0; + if (reliable) return data.Rotation / 180f * Mathf.PI; + return PenPointer.DEFAULT_ROTATION; } #endregion @@ -560,6 +612,111 @@ protected enum TOUCH_API WIN8 } + protected enum PointerEvent : uint + { + Enter = 0x0249, + Leave = 0x024A, + Update = 0x0245, + Down = 0x0246, + Up = 0x0247, + Cancelled = 0x1000 + } + + protected enum PointerType + { + Pointer = 0x00000001, + Touch = 0x00000002, + Pen = 0x00000003, + Mouse = 0x00000004, + TouchPad = 0x00000005 + } + + [Flags] + protected enum PointerFlags + { + None = 0x00000000, + New = 0x00000001, + InRange = 0x00000002, + InContact = 0x00000004, + FirstButton = 0x00000010, + SecondButton = 0x00000020, + ThirdButton = 0x00000040, + FourthButton = 0x00000080, + FifthButton = 0x00000100, + Primary = 0x00002000, + Confidence = 0x00004000, + Canceled = 0x00008000, + Down = 0x00010000, + Update = 0x00020000, + Up = 0x00040000, + Wheel = 0x00080000, + HWheel = 0x00100000, + CaptureChanged = 0x00200000, + HasTransform = 0x00400000 + } + + protected enum ButtonChangeType + { + None, + FirstDown, + FirstUp, + SecondDown, + SecondUp, + ThirdDown, + ThirdUp, + FourthDown, + FourthUp, + FifthDown, + FifthUp + } + + [Flags] + protected enum TouchFlags + { + None = 0x00000000 + } + + [Flags] + protected enum TouchMask + { + None = 0x00000000, + ContactArea = 0x00000001, + Orientation = 0x00000002, + Pressure = 0x00000004 + } + + [Flags] + protected enum PenFlags + { + None = 0x00000000, + Barrel = 0x00000001, + Inverted = 0x00000002, + Eraser = 0x00000004 + } + + [Flags] + protected enum PenMask + { + None = 0x00000000, + Pressure = 0x00000001, + Rotation = 0x00000002, + TiltX = 0x00000004, + TiltY = 0x00000008 + } + + [StructLayout(LayoutKind.Sequential)] + protected struct PointerData + { + public PointerFlags PointerFlags; + public uint Flags; + public uint Mask; + public ButtonChangeType ChangedButtons; + public uint Rotation; + public uint Pressure; + public int TiltX; + public int TiltY; + } + private const int TABLET_DISABLE_PRESSANDHOLD = 0x00000001; private const int TABLET_DISABLE_PENTAPFEEDBACK = 0x00000008; private const int TABLET_DISABLE_PENBARRELFEEDBACK = 0x00000010; @@ -602,20 +759,8 @@ public int Width } } - protected enum POINTER_INPUT_TYPE - { - PT_POINTER = 0x00000001, - PT_TOUCH = 0x00000002, - PT_PEN = 0x00000003, - PT_MOUSE = 0x00000004, - } - [DllImport("WindowsTouch", CallingConvention = CallingConvention.StdCall)] - private static extern void Init(TOUCH_API api, - NativeMousePointerDown nativeMousePointerDown, NativeMousePointerUpdate nativeMousePointerUpdate, - NativeTouchPointerDown nativeTouchPointerDown, NativeTouchPointerUpdate nativeTouchPointerUpdate, - NativePenPointerDown nativePenPointerDown, NativePenPointerUpdate nativePenPointerUpdate, - NativePointerUp nativePointerUp, NativePointerCancel nativePointerCancel); + private static extern void Init(TOUCH_API api, NativeLog log, NativePointerDelegate pointerDelegate); [DllImport("WindowsTouch", EntryPoint = "Dispose", CallingConvention = CallingConvention.StdCall)] private static extern void DisposePlugin(); diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs index c60a7dd62..71212dc86 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs @@ -51,8 +51,9 @@ public ICoordinatesRemapper CoordinatesRemapper #region Public methods /// - public virtual void UpdateInput() + public virtual bool UpdateInput() { + return false; } /// diff --git a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs index ec266a6c5..2f65f1022 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs @@ -1,4 +1,4 @@ -/* +/* * @author Valentin Simonov / http://va.lent.in/ */ @@ -145,11 +145,11 @@ public bool EmulateSecondMousePointer private static StandardInput instance; - [SerializeField] - private bool generalProps; // Used in the custom inspector + [SerializeField] + private bool generalProps; // Used in the custom inspector - [SerializeField] - private bool windowsProps; // Used in the custom inspector + [SerializeField] + private bool windowsProps; // Used in the custom inspector [SerializeField] private Windows8APIType windows8API = Windows8APIType.Windows8; @@ -189,12 +189,38 @@ public bool EmulateSecondMousePointer #region Public methods /// - public override void UpdateInput() + public override bool UpdateInput() { - base.UpdateInput(); + if (base.UpdateInput()) return true; + + var handled = false; +#if UNITY_STANDALONE_WIN && !UNITY_EDITOR + if (windows8PointerHandler != null) + { + handled = windows8PointerHandler.UpdateInput(); + } + else + { + if (windows7PointerHandler != null) + { + handled = windows7PointerHandler.UpdateInput(); + } + else +#endif + if (touchHandler != null) + { + handled = touchHandler.UpdateInput(); + } + if (mouseHandler != null) + { + if (handled) mouseHandler.CancelMousePointer(); + else handled = mouseHandler.UpdateInput(); + } - if (touchHandler != null) touchHandler.UpdateInput(); - if (mouseHandler != null) mouseHandler.UpdateInput(); +#if UNITY_STANDALONE_WIN && !UNITY_EDITOR + } +#endif + return handled; } /// @@ -398,6 +424,6 @@ private void disableWindows8Touch() } #endif -#endregion + #endregion } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Pointers/FakePointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/FakePointer.cs index dd80d4d27..c145aed77 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/FakePointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/FakePointer.cs @@ -10,23 +10,26 @@ namespace TouchScript.Pointers { public class FakePointer : IPointer { - #region Public properties /// - public int Id { get; set; } + public int Id { get; private set; } /// - public Pointer.PointerType Type { get; set; } + public Pointer.PointerType Type { get; private set; } /// - public IInputSource InputSource { get; set; } + public IInputSource InputSource { get; private set; } /// public Vector2 Position { get; set; } /// - public uint Flags { get; set; } + public uint Flags { get; private set; } + + public Pointer.PointerButtonState Buttons { get; private set; } + + public Vector2 PreviousPosition { get; private set; } #endregion diff --git a/Source/Assets/TouchScript/Scripts/Pointers/IPointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/IPointer.cs index 2dce019fb..5abddc706 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/IPointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/IPointer.cs @@ -20,6 +20,8 @@ public interface IPointer /// Pointer.PointerType Type { get; } + Pointer.PointerButtonState Buttons { get; } + /// /// Original input source which created this pointer. /// @@ -31,11 +33,13 @@ public interface IPointer /// Vector2 Position { get; set; } + Vector2 PreviousPosition { get; } + /// /// Gets or sets pointer flags: /// Note: setting this property doesn't immediately change its value, the value actually changes during the next TouchManager update phase. /// - uint Flags { get; set; } + uint Flags { get; } /// /// Returns for current pointer position, i.e. what is right beneath it. Caches the result for the entire frame. diff --git a/Source/Assets/TouchScript/Scripts/Pointers/MousePointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/MousePointer.cs index 7e18f9cd0..4515abf9e 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/MousePointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/MousePointer.cs @@ -7,13 +7,11 @@ namespace TouchScript.Pointers { - /// /// A pointer of type . /// public class MousePointer : Pointer { - #region Public properties public Vector2 ScrollDelta { get; set; } @@ -53,6 +51,5 @@ public override void CopyFrom(Pointer target) //} #endregion - } -} +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs index 03cea48f7..df1ad80e4 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs @@ -1,4 +1,4 @@ -/* +/* * @author Valentin Simonov / http://va.lent.in/ */ @@ -6,12 +6,20 @@ namespace TouchScript.Pointers { - /// /// A pointer of type . /// public class ObjectPointer : Pointer { + #region Public consts + + public const int DEFAULT_OBJECT_ID = 0; + public const float DEFAULT_WIDTH = 1f; + public const float DEFAULT_HEIGHT = 1f; + public const float DEFAULT_ANGLE = 0f; + + #endregion + #region Public properties /// @@ -71,10 +79,10 @@ public override void CopyFrom(Pointer target) internal override void INTERNAL_Reset() { base.INTERNAL_Reset(); - ObjectId = 0; - Width = 0; - Height = 0; - Angle = 0; + ObjectId = DEFAULT_OBJECT_ID; + Width = DEFAULT_WIDTH; + Height = DEFAULT_HEIGHT; + Angle = DEFAULT_ANGLE; } #endregion diff --git a/Source/Assets/TouchScript/Scripts/Pointers/PenPointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/PenPointer.cs index 14f8c8718..66e903327 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/PenPointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/PenPointer.cs @@ -1,4 +1,4 @@ -/* +/* * @author Valentin Simonov / http://va.lent.in/ */ @@ -6,12 +6,25 @@ namespace TouchScript.Pointers { - /// /// A pointer of type . /// public class PenPointer : Pointer { + #region Public consts + + public const float DEFAULT_PRESSURE = 0.5f; + public const float DEFAULT_ROTATION = 0f; + + #endregion + + #region Public properties + + public float Rotation { get; set; } + + public float Pressure { get; set; } + + #endregion #region Constructor @@ -27,12 +40,14 @@ public PenPointer(IInputSource input) : base(input) #region Internal functions - //internal override void INTERNAL_Reset() - //{ - // base.INTERNAL_Reset(); - //} + internal override void INTERNAL_Reset() + { + base.INTERNAL_Reset(); + + Rotation = DEFAULT_ROTATION; + Pressure = DEFAULT_PRESSURE; + } #endregion - } -} +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs index b1fda70c4..84644bfd3 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs @@ -78,83 +78,83 @@ public enum PointerButtonState FirstButtonPressed = 1 << 0, /// - /// First button pressed this frame. + /// Indicates a secondary action, analogous to a right mouse button down. + /// A or does not use this flag. + /// A has this flag set when it is in contact with the digitizer surface with the pen barrel button pressed. + /// A has this flag set when the right mouse button is down. /// - FirstButtonDown = 1 << 1, + SecondButtonPressed = 1 << 1, /// - /// First button released this frame. + /// Analogous to a mouse wheel button down. + /// A , or does not use this flag. + /// A has this flag set when the mouse wheel button is down. /// - FirstButtonUp = 1 << 2, + ThirdButtonPressed = 1 << 2, /// - /// Indicates a secondary action, analogous to a right mouse button down. - /// A or does not use this flag. - /// A has this flag set when it is in contact with the digitizer surface with the pen barrel button pressed. - /// A has this flag set when the right mouse button is down. + /// Analogous to the first extended button button down. + /// A , or does not use this flag. + /// A has this flag set when the first extended button is down. /// - SecondButtonPressed = 1 << 3, + FourthButtonPressed = 1 << 3, /// - /// Second button pressed this frame. + /// Analogous to the second extended button button down. + /// A , or does not use this flag. + /// A has this flag set when the second extended button is down. /// - SecondButtonDown = 1 << 4, + FifthButtonPressed = 1 << 4, /// - /// Second button released this frame. + /// First button pressed this frame. /// - SecondButtonUp = 1 << 5, + FirstButtonDown = 1 << 11, /// - /// Analogous to a mouse wheel button down. - /// A , or does not use this flag. - /// A has this flag set when the mouse wheel button is down. + /// First button released this frame. /// - ThirdButtonPressed = 1 << 6, + FirstButtonUp = 1 << 12, /// - /// Third button pressed this frame. + /// Second button pressed this frame. /// - ThirdButtonDown = 1 << 7, + SecondButtonDown = 1 << 13, /// - /// Third button released this frame. + /// Second button released this frame. /// - ThirdButtonUp = 1 << 8, + SecondButtonUp = 1 << 14, /// - /// Analogous to the first extended button button down. - /// A , or does not use this flag. - /// A has this flag set when the first extended button is down. + /// Third button pressed this frame. /// - FourthButtonPressed = 1 << 9, + ThirdButtonDown = 1 << 15, /// - /// Fourth button pressed this frame. + /// Third button released this frame. /// - FourthButtonDown = 1 << 10, + ThirdButtonUp = 1 << 16, /// - /// Fourth button released this frame. + /// Fourth button pressed this frame. /// - FourthButtonUp = 1 << 11, + FourthButtonDown = 1 << 17, /// - /// Analogous to the second extended button button down. - /// A , or does not use this flag. - /// A has this flag set when the second extended button is down. + /// Fourth button released this frame. /// - FifthButtonPressed = 1 << 12, + FourthButtonUp = 1 << 18, /// /// Fifth button pressed this frame. /// - FifthButtonDown = 1 << 13, + FifthButtonDown = 1 << 19, /// /// Fifth button released this frame. /// - FifthButtonUp = 1 << 14, + FifthButtonUp = 1 << 20, /// /// Any button is pressed. @@ -304,28 +304,6 @@ public override string ToString() builder.Append(Id); builder.Append(", flags: "); BinaryUtils.ToBinaryString(Flags, builder, 8); - builder.Append(", buttons: "); - if (Buttons == PointerButtonState.Nothing) - { - builder.Append("-"); - } - else - { - var b = (uint) Buttons; - for (int i = 0; i < 5; i++) - { - int pressed = 1 << (i * 3); - int down = 1 << (i * 3 + 1); - int up = 1 << (i * 3 + 2); - if ((b & (pressed | down | up)) != 0) - { - builder.Append(i + 1); - if ((b & (pressed)) != 0) builder.Append("+"); - if ((b & (down)) != 0) builder.Append("v"); - if ((b & (up)) != 0) builder.Append("^"); - } - } - } builder.Append(", position: "); builder.Append(Position); builder.Append(")"); diff --git a/Source/Assets/TouchScript/Scripts/Pointers/TouchPointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/TouchPointer.cs index a231f057c..7a1570ff6 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/TouchPointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/TouchPointer.cs @@ -11,10 +11,16 @@ namespace TouchScript.Pointers /// public class TouchPointer : Pointer { + #region Public consts + + public const float DEFAULT_PRESSURE = 0.5f; + public const float DEFAULT_ROTATION = 0f; + + #endregion #region Public properties - public uint Orientation { get; set; } + public float Rotation { get; set; } public float Pressure { get; set; } @@ -34,12 +40,14 @@ public TouchPointer(IInputSource input) : base(input) #region Internal functions - //internal override void INTERNAL_Reset() - //{ - // base.INTERNAL_Reset(); - //} + internal override void INTERNAL_Reset() + { + base.INTERNAL_Reset(); - #endregion + Rotation = DEFAULT_ROTATION; + Pressure = DEFAULT_PRESSURE; + } + #endregion } -} +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Utils/BinaryUtils.cs b/Source/Assets/TouchScript/Scripts/Utils/BinaryUtils.cs index 669f785d7..02914f396 100644 --- a/Source/Assets/TouchScript/Scripts/Utils/BinaryUtils.cs +++ b/Source/Assets/TouchScript/Scripts/Utils/BinaryUtils.cs @@ -8,10 +8,9 @@ namespace TouchScript.Utils { public static class BinaryUtils { - public static void ToBinaryString(uint value, StringBuilder builder, int digits = 32) { - int i = digits-1; + int i = digits - 1; while (i >= 0) { @@ -20,5 +19,11 @@ public static void ToBinaryString(uint value, StringBuilder builder, int digits } } + public static string ToBinaryString(uint value, int digits = 32) + { + var sb = new StringBuilder(digits); + ToBinaryString(value, sb, digits); + return sb.ToString(); + } } -} +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs b/Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs index 338ae5011..7acc913c6 100644 --- a/Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs +++ b/Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs @@ -94,6 +94,13 @@ public void Release(T element) #endif } + public void Release(object element) + { + var obj = (T)element; + if (obj == null) return; + Release(obj); + } + #if OBJECTPOOL_DEBUG private void log(string message) { diff --git a/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs b/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs index dfc8630bf..c82816b33 100644 --- a/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs +++ b/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs @@ -1,7 +1,8 @@ -/* +/* * @author Valentin Simonov / http://va.lent.in/ */ +using System.Text; using TouchScript.Hit; using TouchScript.Pointers; using UnityEngine; @@ -51,5 +52,67 @@ public static bool IsPointerOnTarget(IPointer pointer, Transform target, out Hit if (hit.Target == null) return false; return hit.Target.IsChildOf(target); } + + public static void ButtonsToString(Pointer.PointerButtonState buttons, StringBuilder builder) + { + if ((buttons & Pointer.PointerButtonState.FirstButtonPressed) != 0) builder.Append("1"); + else builder.Append("_"); + if ((buttons & Pointer.PointerButtonState.SecondButtonPressed) != 0) builder.Append("2"); + else builder.Append("_"); + if ((buttons & Pointer.PointerButtonState.ThirdButtonPressed) != 0) builder.Append("3"); + else builder.Append("_"); + if ((buttons & Pointer.PointerButtonState.FourthButtonPressed) != 0) builder.Append("4"); + else builder.Append("_"); + if ((buttons & Pointer.PointerButtonState.FifthButtonPressed) != 0) builder.Append("5"); + else builder.Append("_"); + } + + public static Pointer.PointerButtonState DownPressedButtons(Pointer.PointerButtonState buttons) + { + var btns = buttons & Pointer.PointerButtonState.AnyButtonPressed; + if ((btns & Pointer.PointerButtonState.FirstButtonPressed) != 0) + btns |= Pointer.PointerButtonState.FirstButtonDown; + if ((btns & Pointer.PointerButtonState.SecondButtonPressed) != 0) + btns |= Pointer.PointerButtonState.SecondButtonDown; + if ((btns & Pointer.PointerButtonState.ThirdButtonPressed) != 0) + btns |= Pointer.PointerButtonState.ThirdButtonDown; + if ((btns & Pointer.PointerButtonState.FourthButtonPressed) != 0) + btns |= Pointer.PointerButtonState.FourthButtonDown; + if ((btns & Pointer.PointerButtonState.FifthButtonPressed) != 0) + btns |= Pointer.PointerButtonState.FifthButtonDown; + return btns; + } + + public static Pointer.PointerButtonState PressDownButtons(Pointer.PointerButtonState buttons) + { + var btns = buttons; + if ((btns & Pointer.PointerButtonState.FirstButtonDown) != 0) + btns |= Pointer.PointerButtonState.FirstButtonPressed; + if ((btns & Pointer.PointerButtonState.SecondButtonDown) != 0) + btns |= Pointer.PointerButtonState.SecondButtonPressed; + if ((btns & Pointer.PointerButtonState.ThirdButtonDown) != 0) + btns |= Pointer.PointerButtonState.ThirdButtonPressed; + if ((btns & Pointer.PointerButtonState.FourthButtonDown) != 0) + btns |= Pointer.PointerButtonState.FourthButtonPressed; + if ((btns & Pointer.PointerButtonState.FifthButtonDown) != 0) + btns |= Pointer.PointerButtonState.FifthButtonPressed; + return btns; + } + + public static Pointer.PointerButtonState UpPressedButtons(Pointer.PointerButtonState buttons) + { + var btns = Pointer.PointerButtonState.Nothing; + if ((btns & Pointer.PointerButtonState.FirstButtonPressed) != 0) + btns |= Pointer.PointerButtonState.FirstButtonUp; + if ((btns & Pointer.PointerButtonState.SecondButtonPressed) != 0) + btns |= Pointer.PointerButtonState.SecondButtonUp; + if ((btns & Pointer.PointerButtonState.ThirdButtonPressed) != 0) + btns |= Pointer.PointerButtonState.ThirdButtonUp; + if ((btns & Pointer.PointerButtonState.FourthButtonPressed) != 0) + btns |= Pointer.PointerButtonState.FourthButtonUp; + if ((btns & Pointer.PointerButtonState.FifthButtonPressed) != 0) + btns |= Pointer.PointerButtonState.FifthButtonUp; + return btns; + } } } \ No newline at end of file From f8fa42873be4ce465afca190855b1e9bf6dff2e7 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 16 Jul 2017 15:31:04 +0300 Subject: [PATCH 04/58] Better support for different point types in the Pointer Visualizer. --- .../Visualizer/TouchVisualizerEditor.cs | 38 +-- .../Cube/Scripts/CustomPointerProxy.cs | 2 +- .../Prefabs/Pointer Visualizer.prefab | 17 +- .../Pointer Visualizer/Mouse Pointer.prefab | 298 +++++++++++++++++ .../Mouse Pointer.prefab.meta | 8 + .../Pointer Visualizer/Pen Pointer.prefab | 300 ++++++++++++++++++ .../Pen Pointer.prefab.meta | 8 + .../{Pointer Hit.prefab => Pointer.prefab} | 7 +- ...er Hit.prefab.meta => Pointer.prefab.meta} | 0 .../Pointer Visualizer/Touch Pointer.prefab | 228 +++++++++++++ .../Touch Pointer.prefab.meta | 8 + .../Behaviors/Visualizer/MousePointerProxy.cs | 76 +++++ .../Visualizer/MousePointerProxy.cs.meta | 12 + .../Visualizer/ObjectPointerProxy.cs | 71 +++++ .../Visualizer/ObjectPointerProxy.cs.meta | 12 + .../Behaviors/Visualizer/PenPointerProxy.cs | 94 ++++++ .../Visualizer/PenPointerProxy.cs.meta | 12 + .../Behaviors/Visualizer/PointerProxy.cs | 153 ++++++--- .../Behaviors/Visualizer/PointerVisualizer.cs | 186 +++++++---- .../Behaviors/Visualizer/TouchPointerProxy.cs | 61 ++++ .../Visualizer/TouchPointerProxy.cs.meta | 12 + 21 files changed, 1462 insertions(+), 141 deletions(-) create mode 100644 Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Mouse Pointer.prefab create mode 100644 Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Mouse Pointer.prefab.meta create mode 100644 Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pen Pointer.prefab create mode 100644 Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pen Pointer.prefab.meta rename Source/Assets/TouchScript/Prefabs/Pointer Visualizer/{Pointer Hit.prefab => Pointer.prefab} (98%) rename Source/Assets/TouchScript/Prefabs/Pointer Visualizer/{Pointer Hit.prefab.meta => Pointer.prefab.meta} (100%) create mode 100644 Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Touch Pointer.prefab create mode 100644 Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Touch Pointer.prefab.meta create mode 100644 Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/MousePointerProxy.cs create mode 100644 Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/MousePointerProxy.cs.meta create mode 100644 Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/ObjectPointerProxy.cs create mode 100644 Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/ObjectPointerProxy.cs.meta create mode 100644 Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PenPointerProxy.cs create mode 100644 Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PenPointerProxy.cs.meta create mode 100644 Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/TouchPointerProxy.cs create mode 100644 Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/TouchPointerProxy.cs.meta diff --git a/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs b/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs index b57c59e1a..182377f25 100644 --- a/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs +++ b/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs @@ -1,4 +1,4 @@ -/* +/* * @author Valentin Simonov / http://va.lent.in/ */ @@ -14,26 +14,24 @@ namespace TouchScript.Editor.Behaviors.Visualizer internal sealed class TouchVisualizerEditor : UnityEditor.Editor { - public static readonly GUIContent TEXT_SETTINGS_HEADER = new GUIContent("Pointer settings", "General pointersettings."); public static readonly GUIContent TEXT_DPI_HEADER = new GUIContent("Use DPI", "Scale touch pointer based on DPI."); public static readonly GUIContent TEXT_ADVANCED_HEADER = new GUIContent("Advanced", "Advanced settings."); - - public static readonly GUIContent TEXT_POINTER_ID = new GUIContent("Show Pointer Id", "Display pointer id."); - public static readonly GUIContent TEXT_POINTER_FLAGS = new GUIContent("Show Pointer Flags", "Display pointer flags."); public static readonly GUIContent TEXT_POINTER_SIZE = new GUIContent("Pointer size (cm)", "Pointer size in cm based on current DPI."); - private SerializedProperty touchProxy, useDPI, touchSize, showTouchId, showFlags; - private SerializedProperty generalProps, advancedProps; + private SerializedProperty mousePointerProxy, touchPointerProxy, penPointerProxy, objectPointerProxy; + private SerializedProperty useDPI, touchSize; + private SerializedProperty advancedProps; private void OnEnable() { - showTouchId = serializedObject.FindProperty("showPointerId"); - showFlags = serializedObject.FindProperty("showFlags"); - touchProxy = serializedObject.FindProperty("pointerProxy"); + mousePointerProxy = serializedObject.FindProperty("mousePointerProxy"); + touchPointerProxy = serializedObject.FindProperty("touchPointerProxy"); + penPointerProxy = serializedObject.FindProperty("penPointerProxy"); + objectPointerProxy = serializedObject.FindProperty("objectPointerProxy"); + useDPI = serializedObject.FindProperty("useDPI"); touchSize = serializedObject.FindProperty("pointerSize"); - generalProps = serializedObject.FindProperty("generalProps"); advancedProps = serializedObject.FindProperty("advancedProps"); } @@ -43,16 +41,7 @@ public override void OnInspectorGUI() GUILayout.Space(5); - var display = GUIElements.Header(TEXT_SETTINGS_HEADER, generalProps); - if (display) - { - EditorGUI.indentLevel++; - EditorGUILayout.PropertyField(showTouchId, TEXT_POINTER_ID); - EditorGUILayout.PropertyField(showFlags, TEXT_POINTER_FLAGS); - EditorGUI.indentLevel--; - } - - display = GUIElements.Header(TEXT_DPI_HEADER, useDPI, useDPI); + var display = GUIElements.Header(TEXT_DPI_HEADER, useDPI, useDPI); if (display) { EditorGUI.indentLevel++; @@ -67,8 +56,11 @@ public override void OnInspectorGUI() if (display) { EditorGUI.indentLevel++; - EditorGUILayout.PropertyField(touchProxy, new GUIContent("Pointer Proxy")); - EditorGUI.indentLevel--; + EditorGUILayout.PropertyField(mousePointerProxy, new GUIContent("Mouse Pointer Proxy")); + EditorGUILayout.PropertyField(touchPointerProxy, new GUIContent("Touch Pointer Proxy")); + EditorGUILayout.PropertyField(penPointerProxy, new GUIContent("Pen Pointer Proxy")); + EditorGUILayout.PropertyField(objectPointerProxy, new GUIContent("Object Pointer Proxy")); + EditorGUI.indentLevel--; } serializedObject.ApplyModifiedProperties(); diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs index f27d32b6d..c4d240eb1 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs @@ -8,7 +8,7 @@ namespace TouchScript.Examples.Cube { public class CustomPointerProxy : Behaviors.Visualizer.PointerProxy { - protected override void updateOnce(Pointer pointer) { + protected override void updateOnce(IPointer pointer) { if (pointer.InputSource is RedirectInput) Hide(); base.updateOnce(pointer); diff --git a/Source/Assets/TouchScript/Prefabs/Pointer Visualizer.prefab b/Source/Assets/TouchScript/Prefabs/Pointer Visualizer.prefab index c3060008e..f12df3482 100644 --- a/Source/Assets/TouchScript/Prefabs/Pointer Visualizer.prefab +++ b/Source/Assets/TouchScript/Prefabs/Pointer Visualizer.prefab @@ -43,11 +43,14 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 75324aa372886435faa21a4145210f8e, type: 3} m_Name: m_EditorClassIdentifier: - pointerProxy: {fileID: 11468960, guid: 4230502e1973f4c9e9ef6767dcc8c602, type: 2} - showPointerId: 1 - showFlags: 1 + generalProps: 0 + advancedProps: 0 + mousePointerProxy: {fileID: 11416202, guid: a71503570adc6194b9bbc69bf19cc2de, type: 2} + touchPointerProxy: {fileID: 11435582, guid: 7fd82b375cf1cdc45b55e2751d814207, type: 2} + penPointerProxy: {fileID: 11486812, guid: 7af150e8b98b05449aaf9462bd6c7109, type: 2} + objectPointerProxy: {fileID: 11468960, guid: 4230502e1973f4c9e9ef6767dcc8c602, type: 2} useDPI: 1 - pointerSize: 1 + pointerSize: 3 --- !u!1002 &11400001 EditorExtensionImpl: serializedVersion: 6 @@ -69,8 +72,10 @@ Canvas: m_ReceivesEvents: 1 m_OverrideSorting: 0 m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 m_SortingLayerID: 0 m_SortingOrder: 9000 + m_TargetDisplay: 0 --- !u!224 &22401058 RectTransform: m_ObjectHideFlags: 1 @@ -80,6 +85,7 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0, y: 0, z: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 0} m_RootOrder: 0 @@ -98,8 +104,7 @@ Prefab: - target: {fileID: 0} propertyPath: pointerProxy value: - objectReference: {fileID: 11468960, guid: 4230502e1973f4c9e9ef6767dcc8c602, - type: 2} + objectReference: {fileID: 0} m_RemovedComponents: [] m_ParentPrefab: {fileID: 0} m_RootGameObject: {fileID: 100000} diff --git a/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Mouse Pointer.prefab b/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Mouse Pointer.prefab new file mode 100644 index 000000000..4930b5a01 --- /dev/null +++ b/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Mouse Pointer.prefab @@ -0,0 +1,298 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &152322 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 224: {fileID: 22498922} + - 222: {fileID: 22253470} + - 114: {fileID: 11415522} + - 114: {fileID: 11446012} + m_Layer: 0 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &183852 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 224: {fileID: 22471328} + - 222: {fileID: 22246154} + - 114: {fileID: 11454912} + m_Layer: 0 + m_Name: Pressed + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &185820 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 224: {fileID: 22499528} + - 114: {fileID: 11416202} + m_Layer: 0 + m_Name: Mouse Pointer + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &189110 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 224: {fileID: 22497446} + - 222: {fileID: 22249184} + - 114: {fileID: 11412770} + m_Layer: 0 + m_Name: Default + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &11412770 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 189110} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.209} + m_RaycastTarget: 0 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 21300000, guid: f5c75ed8c6bed0f489d9003aa739aff7, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!114 &11415522 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 152322} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.003921569, g: 0.9960785, b: 0.9960785, a: 1} + m_RaycastTarget: 0 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 12 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 0 + m_HorizontalOverflow: 1 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: '1 + + 2 + + 3 + + 4' +--- !u!114 &11416202 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 185820} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c8fbf4dedcb22ba4c955bd24592e0845, type: 3} + m_Name: + m_EditorClassIdentifier: + ShowPointerId: 1 + ShowFlags: 1 + Text: {fileID: 11415522} + DefaultCursor: {fileID: 189110} + PressedCursor: {fileID: 183852} + ShowButtons: 1 +--- !u!114 &11446012 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 152322} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -900027084, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.541} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 1 +--- !u!114 &11454912 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 183852} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 21300000, guid: f5c75ed8c6bed0f489d9003aa739aff7, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &22246154 +CanvasRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 183852} +--- !u!222 &22249184 +CanvasRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 189110} +--- !u!222 &22253470 +CanvasRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 152322} +--- !u!224 &22471328 +RectTransform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 183852} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_Children: [] + m_Father: {fileID: 22499528} + m_RootOrder: 1 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &22497446 +RectTransform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 189110} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_Children: [] + m_Father: {fileID: 22499528} + m_RootOrder: 0 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &22498922 +RectTransform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 152322} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_Children: [] + m_Father: {fileID: 22499528} + m_RootOrder: 2 + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 3, y: 0} + m_SizeDelta: {x: 100, y: 64} + m_Pivot: {x: 0, y: 0.5} +--- !u!224 &22499528 +RectTransform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 185820} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 22497446} + - {fileID: 22471328} + - {fileID: 22498922} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 370, y: 402.78} + m_SizeDelta: {x: 64, y: 64} + m_Pivot: {x: 0.5, y: 0.5} +--- !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: 185820} + m_IsPrefabParent: 1 diff --git a/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Mouse Pointer.prefab.meta b/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Mouse Pointer.prefab.meta new file mode 100644 index 000000000..de2e3cbbe --- /dev/null +++ b/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Mouse Pointer.prefab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a71503570adc6194b9bbc69bf19cc2de +timeCreated: 1500147529 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pen Pointer.prefab b/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pen Pointer.prefab new file mode 100644 index 000000000..f450ca475 --- /dev/null +++ b/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pen Pointer.prefab @@ -0,0 +1,300 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &108352 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 224: {fileID: 22483962} + - 222: {fileID: 22239818} + - 114: {fileID: 11439998} + - 114: {fileID: 11426034} + m_Layer: 0 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &118164 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 224: {fileID: 22480400} + - 114: {fileID: 11486812} + m_Layer: 0 + m_Name: Pen Pointer + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &133736 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 224: {fileID: 22479482} + - 222: {fileID: 22231526} + - 114: {fileID: 11430106} + m_Layer: 0 + m_Name: Default + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &167092 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 224: {fileID: 22408358} + - 222: {fileID: 22255864} + - 114: {fileID: 11441420} + m_Layer: 0 + m_Name: Pressed + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &11426034 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 108352} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -900027084, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.541} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 1 +--- !u!114 &11430106 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 133736} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.07450981, g: 1, b: 0, a: 0.234} + m_RaycastTarget: 0 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 21300000, guid: f5c75ed8c6bed0f489d9003aa739aff7, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!114 &11439998 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 108352} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.003921569, g: 0.9960785, b: 0.9960785, a: 1} + m_RaycastTarget: 0 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 12 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 0 + m_HorizontalOverflow: 1 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: '1 + + 2 + + 3 + + 4' +--- !u!114 &11441420 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 167092} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.07586217, g: 1, b: 0, a: 1} + m_RaycastTarget: 0 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 21300000, guid: f5c75ed8c6bed0f489d9003aa739aff7, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!114 &11486812 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 118164} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 181d9c001cb470f44ac60c140a847605, type: 3} + m_Name: + m_EditorClassIdentifier: + ShowPointerId: 1 + ShowFlags: 1 + Text: {fileID: 11439998} + DefaultCursor: {fileID: 133736} + PressedCursor: {fileID: 167092} + ShowButtons: 1 + ShowPressure: 1 + ShowRotation: 1 +--- !u!222 &22231526 +CanvasRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 133736} +--- !u!222 &22239818 +CanvasRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 108352} +--- !u!222 &22255864 +CanvasRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 167092} +--- !u!224 &22408358 +RectTransform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 167092} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_Children: [] + m_Father: {fileID: 22480400} + m_RootOrder: 1 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &22479482 +RectTransform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 133736} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_Children: [] + m_Father: {fileID: 22480400} + m_RootOrder: 0 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &22480400 +RectTransform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 118164} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 22479482} + - {fileID: 22408358} + - {fileID: 22483962} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 502.94275, y: 402.78043} + m_SizeDelta: {x: 64, y: 64} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &22483962 +RectTransform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 108352} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_Children: [] + m_Father: {fileID: 22480400} + m_RootOrder: 2 + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 3, y: 0.00000071525574} + m_SizeDelta: {x: 100, y: 64} + m_Pivot: {x: 0, y: 0.5} +--- !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: 118164} + m_IsPrefabParent: 1 diff --git a/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pen Pointer.prefab.meta b/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pen Pointer.prefab.meta new file mode 100644 index 000000000..5df709948 --- /dev/null +++ b/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pen Pointer.prefab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7af150e8b98b05449aaf9462bd6c7109 +timeCreated: 1500153289 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pointer Hit.prefab b/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pointer.prefab similarity index 98% rename from Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pointer Hit.prefab rename to Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pointer.prefab index 5b8bb08ae..c728b52ea 100644 --- a/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pointer Hit.prefab +++ b/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pointer.prefab @@ -30,7 +30,7 @@ GameObject: - 114: {fileID: 11454912} - 114: {fileID: 11468960} m_Layer: 0 - m_Name: Pointer Hit + m_Name: Pointer m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -68,9 +68,7 @@ MonoBehaviour: m_HorizontalOverflow: 1 m_VerticalOverflow: 0 m_LineSpacing: 1 - m_Text: 'Id: 0 - - Tags: Bla' + m_Text: --- !u!114 &11446012 MonoBehaviour: m_ObjectHideFlags: 1 @@ -123,7 +121,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 7cb960f8e83f447beb42da7d064d77e2, type: 3} m_Name: m_EditorClassIdentifier: - Text: {fileID: 11415522} --- !u!222 &22246154 CanvasRenderer: m_ObjectHideFlags: 1 diff --git a/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pointer Hit.prefab.meta b/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pointer.prefab.meta similarity index 100% rename from Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pointer Hit.prefab.meta rename to Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pointer.prefab.meta diff --git a/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Touch Pointer.prefab b/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Touch Pointer.prefab new file mode 100644 index 000000000..825d517e1 --- /dev/null +++ b/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Touch Pointer.prefab @@ -0,0 +1,228 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &152322 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 224: {fileID: 22498922} + - 222: {fileID: 22253470} + - 114: {fileID: 11415522} + - 114: {fileID: 11446012} + m_Layer: 0 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &183852 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 224: {fileID: 22471328} + - 222: {fileID: 22246154} + - 114: {fileID: 11454912} + m_Layer: 0 + m_Name: Pressed + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &185820 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 224: {fileID: 22499528} + - 114: {fileID: 11435582} + m_Layer: 0 + m_Name: Touch Pointer + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &11415522 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 152322} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.003921569, g: 0.9960785, b: 0.9960785, a: 1} + m_RaycastTarget: 0 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 12 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 0 + m_HorizontalOverflow: 1 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: '1 + + 2 + + 3 + + 4' +--- !u!114 &11435582 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 185820} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d3a5cfcc9939fb340b2c3ed29a3d0b5d, type: 3} + m_Name: + m_EditorClassIdentifier: + ShowPointerId: 1 + ShowFlags: 1 + Text: {fileID: 11415522} + ShowPressure: 1 + ShowOrientation: 1 +--- !u!114 &11446012 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 152322} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -900027084, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.541} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 1 +--- !u!114 &11454912 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 183852} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0.37931037, b: 1, a: 1} + m_RaycastTarget: 0 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 21300000, guid: f5c75ed8c6bed0f489d9003aa739aff7, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &22246154 +CanvasRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 183852} +--- !u!222 &22253470 +CanvasRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 152322} +--- !u!224 &22471328 +RectTransform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 183852} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_Children: [] + m_Father: {fileID: 22499528} + m_RootOrder: 0 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &22498922 +RectTransform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 152322} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_Children: [] + m_Father: {fileID: 22499528} + m_RootOrder: 1 + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 3, y: 0.00000035762787} + m_SizeDelta: {x: 100, y: 64} + m_Pivot: {x: 0, y: 0.5} +--- !u!224 &22499528 +RectTransform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 185820} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 22471328} + - {fileID: 22498922} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 609.9613, y: 418.8903} + m_SizeDelta: {x: 64, y: 64} + m_Pivot: {x: 0.5, y: 0.5} +--- !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: 185820} + m_IsPrefabParent: 1 diff --git a/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Touch Pointer.prefab.meta b/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Touch Pointer.prefab.meta new file mode 100644 index 000000000..e71f5ff4c --- /dev/null +++ b/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Touch Pointer.prefab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7fd82b375cf1cdc45b55e2751d814207 +timeCreated: 1500151683 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/MousePointerProxy.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/MousePointerProxy.cs new file mode 100644 index 000000000..e29bc55e8 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/MousePointerProxy.cs @@ -0,0 +1,76 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using System.Text; +using TouchScript.Pointers; +using TouchScript.Utils; +using UnityEngine; + +namespace TouchScript.Behaviors.Visualizer +{ + public class MousePointerProxy : TextPointerProxy + { + #region Public properties + + public GameObject DefaultCursor; + public GameObject PressedCursor; + + public bool ShowButtons = false; + + #endregion + + #region Public methods + + #endregion + + #region Protected methods + + protected override void updateOnce(IPointer pointer) + { + switch (state) + { + case ProxyState.Released: + case ProxyState.Over: + if (DefaultCursor != null) DefaultCursor.SetActive(true); + if (PressedCursor != null) PressedCursor.SetActive(false); + break; + case ProxyState.Pressed: + case ProxyState.OverPressed: + if (DefaultCursor != null) DefaultCursor.SetActive(false); + if (PressedCursor != null) PressedCursor.SetActive(true); + break; + } + + base.updateOnce(pointer); + } + + protected override void generateText(MousePointer pointer, StringBuilder str) + { + base.generateText(pointer, str); + + if (ShowButtons) + { + if (str.Length > 0) str.Append("\n"); + str.Append("Buttons: "); + PointerUtils.ButtonsToString(pointer.Buttons, str); + } + } + + protected override bool shouldShowText() + { + return base.shouldShowText() || ShowButtons; + } + + protected override uint gethash(MousePointer pointer) + { + var hash = base.gethash(pointer); + + if (ShowButtons == true) hash += (uint) (pointer.Buttons & Pointer.PointerButtonState.AnyButtonPressed); + + return hash; + } + + #endregion + } +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/MousePointerProxy.cs.meta b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/MousePointerProxy.cs.meta new file mode 100644 index 000000000..0a6e63e7a --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/MousePointerProxy.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c8fbf4dedcb22ba4c955bd24592e0845 +timeCreated: 1500143380 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/ObjectPointerProxy.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/ObjectPointerProxy.cs new file mode 100644 index 000000000..7334abad5 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/ObjectPointerProxy.cs @@ -0,0 +1,71 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using System.Text; +using TouchScript.Pointers; + +namespace TouchScript.Behaviors.Visualizer +{ + public class ObjectPointerProxy : TextPointerProxy + { + #region Public properties + + public bool ShowObjectId = false; + + public bool ShowSize = false; + + public bool ShowAngle = false; + + #endregion + + #region Public methods + + #endregion + + #region Protected methods + + protected override void generateText(ObjectPointer pointer, StringBuilder str) + { + base.generateText(pointer, str); + + if (ShowObjectId) + { + if (str.Length > 0) str.Append("\n"); + str.Append("ObjectId: "); + str.Append(pointer.ObjectId); + } + if (ShowSize) + { + if (str.Length > 0) str.Append("\n"); + str.Append("Size: "); + str.Append(pointer.Width); + str.Append("x"); + str.Append(pointer.Height); + } + if (ShowAngle) + { + if (str.Length > 0) str.Append("\n"); + str.Append("Angle: "); + str.Append(pointer.Angle); + } + } + + protected override bool shouldShowText() + { + return base.shouldShowText() || ShowObjectId || ShowSize || ShowAngle; + } + + protected override uint gethash(ObjectPointer pointer) + { + var hash = base.gethash(pointer); + + if (ShowSize == true) hash += (uint) (pointer.Width * 1024 + pointer.Height * 1024 * 1024) << 8; + if (ShowAngle == true) hash += (uint) (pointer.Angle * 1024) << 24; + + return hash; + } + + #endregion + } +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/ObjectPointerProxy.cs.meta b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/ObjectPointerProxy.cs.meta new file mode 100644 index 000000000..530c26e98 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/ObjectPointerProxy.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 278a3da2a34252e45bd08b6726d68e87 +timeCreated: 1500144248 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PenPointerProxy.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PenPointerProxy.cs new file mode 100644 index 000000000..0845af809 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PenPointerProxy.cs @@ -0,0 +1,94 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using System.Text; +using TouchScript.Pointers; +using TouchScript.Utils; +using UnityEngine; + +namespace TouchScript.Behaviors.Visualizer +{ + public class PenPointerProxy : TextPointerProxy + { + #region Public properties + + public GameObject DefaultCursor; + public GameObject PressedCursor; + + public bool ShowButtons = false; + + public bool ShowPressure = false; + + public bool ShowRotation = false; + + #endregion + + #region Public methods + + #endregion + + #region Protected methods + + protected override void updateOnce(IPointer pointer) + { + switch (state) + { + case ProxyState.Released: + case ProxyState.Over: + if (DefaultCursor != null) DefaultCursor.SetActive(true); + if (PressedCursor != null) PressedCursor.SetActive(false); + break; + case ProxyState.Pressed: + case ProxyState.OverPressed: + if (DefaultCursor != null) DefaultCursor.SetActive(false); + if (PressedCursor != null) PressedCursor.SetActive(true); + break; + } + + base.updateOnce(pointer); + } + + protected override void generateText(PenPointer pointer, StringBuilder str) + { + base.generateText(pointer, str); + + if (ShowButtons) + { + if (str.Length > 0) str.Append("\n"); + str.Append("Buttons: "); + PointerUtils.ButtonsToString(pointer.Buttons, str); + } + if (ShowPressure) + { + if (str.Length > 0) str.Append("\n"); + str.Append("Pressure: "); + str.AppendFormat("{0:0.000}", pointer.Pressure); + } + if (ShowRotation) + { + if (str.Length > 0) str.Append("\n"); + str.Append("Rotation: "); + str.Append(pointer.Rotation); + } + } + + protected override bool shouldShowText() + { + return base.shouldShowText() || ShowButtons || ShowPressure || ShowRotation; + } + + protected override uint gethash(PenPointer pointer) + { + var hash = base.gethash(pointer); + + if (ShowButtons == true) hash += (uint) (pointer.Buttons & Pointer.PointerButtonState.AnyButtonPressed); + if (ShowPressure == true) hash += (uint) (pointer.Pressure * 1024) << 8; + if (ShowRotation == true) hash += (uint) (pointer.Rotation * 1024) << 16; + + return hash; + } + + #endregion + } +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PenPointerProxy.cs.meta b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PenPointerProxy.cs.meta new file mode 100644 index 000000000..a4b0924d8 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PenPointerProxy.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 181d9c001cb470f44ac60c140a847605 +timeCreated: 1500144236 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs index 40b4b6cf2..a7bc6a65b 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs @@ -4,6 +4,7 @@ using System.Text; using TouchScript.Pointers; +using TouchScript.Utils; using UnityEngine; using UnityEngine.UI; @@ -13,19 +14,43 @@ namespace TouchScript.Behaviors.Visualizer /// Visual cursor implementation used by TouchScript. /// [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Behaviors_Visualizer_TouchProxy.htm")] - public class PointerProxy : PointerProxyBase + public abstract class TextPointerProxy : PointerProxy where T : IPointer { + #region Public properties + + /// + /// Gets or sets a value indicating whether pointer id text should be displayed on screen. + /// + /// true if pointer id text should be displayed on screen; otherwise, false. + public bool ShowPointerId = true; + + /// + /// Gets or sets a value indicating whether pointer flags text should be displayed on screen. + /// + /// true if pointer flags text should be displayed on screen; otherwise, false. + public bool ShowFlags = false; + /// /// The link to UI.Text component. /// public Text Text; - private StringBuilder stringBuilder = new StringBuilder(64); + #endregion + + #region Private variables + + private static StringBuilder stringBuilder = new StringBuilder(64); + + #endregion + + #region Public methods + + #endregion #region Protected methods /// - protected override void updateOnce(Pointer pointer) + protected override void updateOnce(IPointer pointer) { base.updateOnce(pointer); @@ -35,26 +60,48 @@ protected override void updateOnce(Pointer pointer) gameObject.name = stringBuilder.ToString(); if (Text == null) return; - if (!ShowPointerId && !ShowFlags) + if (!shouldShowText()) { Text.text = ""; return; } stringBuilder.Length = 0; + generateText((T) pointer, stringBuilder); + + Text.text = stringBuilder.ToString(); + } + + protected virtual void generateText(T pointer, StringBuilder str) + { if (ShowPointerId) { - stringBuilder.Append("Id: "); - stringBuilder.Append(pointer.Id); + str.Append("Id: "); + str.Append(pointer.Id); } if (ShowFlags) { - if (stringBuilder.Length > 0) stringBuilder.Append("\n"); - stringBuilder.Append("Flags: "); - stringBuilder.Append(pointer.Flags); + if (str.Length > 0) str.Append("\n"); + str.Append("Flags: "); + BinaryUtils.ToBinaryString(pointer.Flags, str, 8); } + } - Text.text = stringBuilder.ToString(); + protected virtual bool shouldShowText() + { + return ShowPointerId || ShowFlags; + } + + protected virtual uint gethash(T pointer) + { + var hash = (uint) state; + if (ShowFlags) hash += pointer.Flags << 3; + return hash; + } + + protected sealed override uint getPointerHash(IPointer pointer) + { + return gethash((T) pointer); } #endregion @@ -63,40 +110,51 @@ protected override void updateOnce(Pointer pointer) /// /// Base class for cursors. /// - public class PointerProxyBase : MonoBehaviour + public class PointerProxy : MonoBehaviour { + #region Consts + + public enum ProxyState + { + Released, + Pressed, + Over, + OverPressed + } + + #endregion + #region Public properties /// /// Gets or sets cursor size. /// /// Cursor size in pixels. - public uint Size + public float Size { get { return size; } set { size = value; - rect.sizeDelta = Vector2.one * size; + if (size > 0) + { + rect.sizeDelta = Vector2.one * size; + } + else + { + size = 0; + rect.sizeDelta = Vector2.one * defaultSize; + } } } - /// - /// Gets or sets a value indicating whether pointer id text should be displayed on screen. - /// - /// true if pointer id text should be displayed on screen; otherwise, false. - public bool ShowPointerId { get; set; } - - /// - /// Gets or sets a value indicating whether pointer flags text should be displayed on screen. - /// - /// true if pointer flags text should be displayed on screen; otherwise, false. - public bool ShowFlags { get; set; } - #endregion #region Private variables + protected ProxyState state; + protected object stateData; + /// /// Cached RectTransform. /// @@ -105,7 +163,9 @@ public uint Size /// /// Cursor size. /// - protected uint size = 1; + protected float size = 0; + + protected float defaultSize; protected uint hash = uint.MaxValue; @@ -118,25 +178,41 @@ public uint Size /// /// Parent container. /// Pointer this cursor represents. - public void Init(RectTransform parent, Pointer pointer) + public void Init(RectTransform parent, IPointer pointer) { hash = uint.MaxValue; show(); rect.SetParent(parent); rect.SetAsLastSibling(); - update(pointer); + state = ProxyState.Released; + UpdatePointer(pointer); } /// /// Updates the pointer. This method is called when the pointer is moved. /// /// Pointer this cursor represents. - public void UpdatePointer(Pointer pointer) + public void UpdatePointer(IPointer pointer) { + rect.anchoredPosition = pointer.Position; + var newHash = getPointerHash(pointer); + if (newHash != hash) updateOnce(pointer); + hash = newHash; + update(pointer); } + public void SetState(IPointer pointer, ProxyState newState, object data = null) + { + state = newState; + stateData = data; + + var newHash = getPointerHash(pointer); + if (newHash != hash) updateOnce(pointer); + hash = newHash; + } + /// /// Hides this instance. /// @@ -159,6 +235,7 @@ private void Awake() return; } rect.anchorMin = rect.anchorMax = Vector2.zero; + defaultSize = rect.sizeDelta.x; } #endregion @@ -186,27 +263,17 @@ protected virtual void show() /// This method is called once when the cursor is initialized. /// /// The pointer. - protected virtual void updateOnce(Pointer pointer) {} + protected virtual void updateOnce(IPointer pointer) {} /// /// This method is called every time when the pointer changes. /// /// The pointer. - public virtual void update(Pointer pointer) - { - rect.anchoredPosition = pointer.Position; - var newHash = getPointerHash(pointer); - if (newHash != hash) updateOnce(pointer); - hash = newHash; - } - - #endregion - - #region Private functions + protected virtual void update(IPointer pointer) {} - private uint getPointerHash(Pointer pointer) + protected virtual uint getPointerHash(IPointer pointer) { - return pointer.Flags; + return (uint) state; } #endregion diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs index 6e64a6f31..7ff8b2f5c 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using TouchScript.Utils; +using TouchScript.Pointers; using TouchScript.Utils.Attributes; using UnityEngine; @@ -18,38 +19,28 @@ public class PointerVisualizer : MonoBehaviour { #region Public properties - /// - /// Gets or sets pointer UI element prefab which represents a pointer on screen. - /// - /// A prefab with a script derived from PointerProxyBase. - public PointerProxyBase PointerProxy + public PointerProxy MousePointerProxy { - get { return pointerProxy; } - set - { - pointerProxy = value; - updateDefaultSize(); - } + get { return mousePointerProxy; } + set { mousePointerProxy = value; } } - /// - /// Gets or sets a value indicating whether pointer id text should be displayed on screen. - /// - /// true if pointer id text should be displayed on screen; otherwise, false. - public bool ShowPointerId + public PointerProxy TouchPointerProxy { - get { return showPointerId; } - set { showPointerId = value; } + get { return touchPointerProxy; } + set { touchPointerProxy = value; } } - /// - /// Gets or sets a value indicating whether pointer flags text should be displayed on screen. - /// - /// true if pointer flags text should be displayed on screen; otherwise, false. - public bool ShowFlags + public PointerProxy PenPointerProxy + { + get { return penPointerProxy; } + set { penPointerProxy = value; } + } + + public PointerProxy ObjectPointerProxy { - get { return showFlags; } - set { showFlags = value; } + get { return objectPointerProxy; } + set { objectPointerProxy = value; } } /// @@ -76,22 +67,23 @@ public float PointerSize #region Private variables - [SerializeField] - private bool generalProps; // Used in the custom inspector + [SerializeField] + private bool generalProps; // Used in the custom inspector - [SerializeField] - private bool advancedProps; // Used in the custom inspector + [SerializeField] + private bool advancedProps; // Used in the custom inspector [SerializeField] - private PointerProxyBase pointerProxy; + private PointerProxy mousePointerProxy; [SerializeField] - [ToggleLeft] - private bool showPointerId = true; + private PointerProxy touchPointerProxy; [SerializeField] - [ToggleLeft] - private bool showFlags = true; + private PointerProxy penPointerProxy; + + [SerializeField] + private PointerProxy objectPointerProxy; [SerializeField] [ToggleLeft] @@ -100,10 +92,12 @@ public float PointerSize [SerializeField] private float pointerSize = 1f; - private uint defaultSize = 64; private RectTransform rect; - private ObjectPool pool; - private Dictionary proxies = new Dictionary(10); + private ObjectPool mousePool; + private ObjectPool touchPool; + private ObjectPool penPool; + private ObjectPool objectPool; + private Dictionary proxies = new Dictionary(10); #endregion @@ -111,20 +105,25 @@ public float PointerSize private void Awake() { - pool = new ObjectPool(10, instantiateProxy, null, clearProxy); + mousePool = new ObjectPool(2, instantiateMouseProxy, null, clearProxy); + touchPool = new ObjectPool(10, instantiateTouchProxy, null, clearProxy); + penPool = new ObjectPool(2, instantiatePenProxy, null, clearProxy); + objectPool = new ObjectPool(2, instantiateObjectProxy, null, clearProxy); + rect = transform as RectTransform; if (rect == null) { Debug.LogError("PointerVisualizer must be on an UI element!"); enabled = false; } - updateDefaultSize(); } private void OnEnable() { if (TouchManager.Instance != null) { + TouchManager.Instance.PointersAdded += pointersAddedHandler; + TouchManager.Instance.PointersRemoved += pointersRemovedHandler; TouchManager.Instance.PointersPressed += pointersPressedHandler; TouchManager.Instance.PointersReleased += pointersReleasedHandler; TouchManager.Instance.PointersUpdated += PointersUpdatedHandler; @@ -136,6 +135,8 @@ private void OnDisable() { if (TouchManager.Instance != null) { + TouchManager.Instance.PointersAdded -= pointersAddedHandler; + TouchManager.Instance.PointersRemoved -= pointersRemovedHandler; TouchManager.Instance.PointersPressed -= pointersPressedHandler; TouchManager.Instance.PointersReleased -= pointersReleasedHandler; TouchManager.Instance.PointersUpdated -= PointersUpdatedHandler; @@ -147,12 +148,27 @@ private void OnDisable() #region Private functions - private PointerProxyBase instantiateProxy() + private PointerProxy instantiateMouseProxy() + { + return Instantiate(mousePointerProxy); + } + + private PointerProxy instantiateTouchProxy() { - return Instantiate(pointerProxy); + return Instantiate(touchPointerProxy); } - private void clearProxy(PointerProxyBase proxy) + private PointerProxy instantiatePenProxy() + { + return Instantiate(penPointerProxy); + } + + private PointerProxy instantiateObjectProxy() + { + return Instantiate(objectPointerProxy); + } + + private void clearProxy(PointerProxy proxy) { proxy.Hide(); } @@ -160,36 +176,81 @@ private void clearProxy(PointerProxyBase proxy) private uint getPointerSize() { if (useDPI) return (uint) (pointerSize * TouchManager.Instance.DotsPerCentimeter); - return defaultSize; + return 0; } - private void updateDefaultSize() + #endregion + + #region Event handlers + + private void pointersAddedHandler(object sender, PointerEventArgs e) { - if (pointerProxy != null) + var count = e.Pointers.Count; + for (var i = 0; i < count; i++) { - var rt = pointerProxy.GetComponent(); - if (rt) defaultSize = (uint) rt.sizeDelta.x; + var pointer = e.Pointers[i]; + PointerProxy proxy; + switch (pointer.Type) + { + case Pointer.PointerType.Mouse: + proxy = mousePool.Get(); + break; + case Pointer.PointerType.Touch: + proxy = touchPool.Get(); + break; + case Pointer.PointerType.Pen: + proxy = penPool.Get(); + break; + case Pointer.PointerType.Object: + proxy = objectPool.Get(); + break; + default: + continue; + } + + proxy.Size = getPointerSize(); + proxy.Init(rect, pointer); + proxies.Add(pointer.Id, proxy); } } - #endregion + private void pointersRemovedHandler(object sender, PointerEventArgs e) + { + var count = e.Pointers.Count; + for (var i = 0; i < count; i++) + { + var pointer = e.Pointers[i]; + PointerProxy proxy; + if (!proxies.TryGetValue(pointer.Id, out proxy)) continue; + proxies.Remove(pointer.Id); - #region Event handlers + switch (pointer.Type) + { + case Pointer.PointerType.Mouse: + mousePool.Release(proxy); + break; + case Pointer.PointerType.Touch: + touchPool.Release(proxy); + break; + case Pointer.PointerType.Pen: + penPool.Release(proxy); + break; + case Pointer.PointerType.Object: + objectPool.Release(proxy); + break; + } + } + } private void pointersPressedHandler(object sender, PointerEventArgs e) { - if (pointerProxy == null) return; - var count = e.Pointers.Count; for (var i = 0; i < count; i++) { var pointer = e.Pointers[i]; - var proxy = pool.Get(); - proxy.Size = getPointerSize(); - proxy.ShowPointerId = showPointerId; - proxy.ShowFlags = showFlags; - proxy.Init(rect, pointer); - proxies.Add(pointer.Id, proxy); + PointerProxy proxy; + if (!proxies.TryGetValue(pointer.Id, out proxy)) continue; + proxy.SetState(pointer, PointerProxy.ProxyState.Pressed); } } @@ -199,7 +260,7 @@ private void PointersUpdatedHandler(object sender, PointerEventArgs e) for (var i = 0; i < count; i++) { var pointer = e.Pointers[i]; - PointerProxyBase proxy; + PointerProxy proxy; if (!proxies.TryGetValue(pointer.Id, out proxy)) continue; proxy.UpdatePointer(pointer); } @@ -211,16 +272,15 @@ private void pointersReleasedHandler(object sender, PointerEventArgs e) for (var i = 0; i < count; i++) { var pointer = e.Pointers[i]; - PointerProxyBase proxy; - if (!proxies.TryGetValue(pointer.Id, out proxy)) continue; - proxies.Remove(pointer.Id); - pool.Release(proxy); + PointerProxy proxy; + if (!proxies.TryGetValue(pointer.Id, out proxy)) continue; + proxy.SetState(pointer, PointerProxy.ProxyState.Released); } } private void pointersCancelledHandler(object sender, PointerEventArgs e) { - pointersReleasedHandler(sender, e); + pointersRemovedHandler(sender, e); } #endregion diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/TouchPointerProxy.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/TouchPointerProxy.cs new file mode 100644 index 000000000..2d6f02355 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/TouchPointerProxy.cs @@ -0,0 +1,61 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using System.Text; +using TouchScript.Pointers; + +namespace TouchScript.Behaviors.Visualizer +{ + public class TouchPointerProxy : TextPointerProxy + { + #region Public properties + + public bool ShowPressure = false; + + public bool ShowRotation = false; + + #endregion + + #region Public methods + + #endregion + + #region Protected methods + + protected override void generateText(TouchPointer pointer, StringBuilder str) + { + base.generateText(pointer, str); + + if (ShowPressure) + { + if (str.Length > 0) str.Append("\n"); + str.Append("Pressure: "); + str.AppendFormat("{0:0.000}", pointer.Pressure); + } + if (ShowRotation) + { + if (str.Length > 0) str.Append("\n"); + str.Append("Rotation: "); + str.Append(pointer.Rotation); + } + } + + protected override bool shouldShowText() + { + return base.shouldShowText() || ShowPressure || ShowRotation; + } + + protected override uint gethash(TouchPointer pointer) + { + var hash = base.gethash(pointer); + + if (ShowPressure == true) hash += (uint) (pointer.Pressure * 1024) << 8; + if (ShowRotation == true) hash += (uint) (pointer.Rotation * 1024) << 16; + + return hash; + } + + #endregion + } +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/TouchPointerProxy.cs.meta b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/TouchPointerProxy.cs.meta new file mode 100644 index 000000000..bbda5a136 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/TouchPointerProxy.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d3a5cfcc9939fb340b2c3ed29a3d0b5d +timeCreated: 1500144224 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From d38b02c050256d5b59516fcede263f46f81e6aa8 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 16 Jul 2017 16:05:38 +0300 Subject: [PATCH 05/58] Refactored Visualizer into CursorManager. Changed cursors into gradient textures. --- .../Behaviors/Transform.meta => Test.meta} | 4 +- ...alizerEditor.cs => CursorManagerEditor.cs} | 18 +- ...or.cs.meta => CursorManagerEditor.cs.meta} | 0 .../TouchScript/Examples/Camera/Camera.unity | 81 +++++- .../Cube/Scripts/CustomPointerProxy.cs | 3 +- .../TouchScript/Examples/Photos/Photos.unity | 272 +++++++++++++++++- .../TouchScript/Examples/Portal/Portal.unity | 250 +++++++++++++++- .../TouchScript/Examples/Taps/Taps.unity | 129 ++++++++- .../Examples/_misc/Scripts/Highlight.cs | 3 +- .../Examples/_prefabs/TouchScript.prefab | 46 ++- .../{Pointer Visualizer.meta => Cursors.meta} | 0 ...inter Visualizer.prefab => Cursors.prefab} | 12 +- ...alizer.prefab.meta => Cursors.prefab.meta} | 0 .../TouchScript/Prefabs/Cursors/Cursor.mat | 138 +++++++++ .../Prefabs/Cursors/Cursor.mat.meta | 8 + .../Mouse Cursor.prefab} | 204 ++++++++++--- .../Mouse Cursor.prefab.meta} | 0 .../Pen Cursor.prefab} | 184 +++++++++--- .../Pen Cursor.prefab.meta} | 0 .../Pointer.prefab | 171 +++++------ .../Pointer.prefab.meta | 0 .../Touch Cursor.prefab} | 94 ++++-- .../Touch Cursor.prefab.meta} | 0 .../{Visualizer.meta => Cursors.meta} | 0 .../CursorManager.cs} | 136 ++++----- .../CursorManager.cs.meta} | 0 .../MouseCursor.cs} | 4 +- .../MouseCursor.cs.meta} | 0 .../ObjectCursor.cs} | 4 +- .../ObjectCursor.cs.meta} | 0 .../PenCursor.cs} | 4 +- .../PenCursor.cs.meta} | 0 .../PointerCursor.cs} | 8 +- .../PointerCursor.cs.meta} | 0 .../TouchCursor.cs} | 4 +- .../TouchCursor.cs.meta} | 0 .../Scripts/Behaviors/Cursors/UI.meta | 9 + .../Behaviors/Cursors/UI/GradientTexture.cs | 85 ++++++ .../Cursors/UI/GradientTexture.cs.meta | 12 + .../TouchScript/Scripts/Behaviors/UI.meta | 9 + .../Scripts/Behaviors/{ => UI}/OverHelper.cs | 2 +- .../Behaviors/{ => UI}/OverHelper.cs.meta | 0 .../Assets/TouchScript/Shaders/Cursor.shader | 51 ++++ .../TouchScript/Shaders/Cursor.shader.meta | 9 + Source/Assets/TouchScript/Textures.meta | 2 - Source/Assets/TouchScript/Textures/Touch.png | Bin 7544 -> 0 bytes .../TouchScript/Textures/Touch.png.meta | 54 ---- 47 files changed, 1626 insertions(+), 384 deletions(-) rename Source/Assets/{TouchScript/Scripts/Behaviors/Transform.meta => Test.meta} (67%) rename Source/Assets/TouchScript/Editor/Behaviors/Visualizer/{TouchVisualizerEditor.cs => CursorManagerEditor.cs} (88%) rename Source/Assets/TouchScript/Editor/Behaviors/Visualizer/{TouchVisualizerEditor.cs.meta => CursorManagerEditor.cs.meta} (100%) rename Source/Assets/TouchScript/Prefabs/{Pointer Visualizer.meta => Cursors.meta} (100%) rename Source/Assets/TouchScript/Prefabs/{Pointer Visualizer.prefab => Cursors.prefab} (86%) rename Source/Assets/TouchScript/Prefabs/{Pointer Visualizer.prefab.meta => Cursors.prefab.meta} (100%) create mode 100644 Source/Assets/TouchScript/Prefabs/Cursors/Cursor.mat create mode 100644 Source/Assets/TouchScript/Prefabs/Cursors/Cursor.mat.meta rename Source/Assets/TouchScript/Prefabs/{Pointer Visualizer/Mouse Pointer.prefab => Cursors/Mouse Cursor.prefab} (69%) rename Source/Assets/TouchScript/Prefabs/{Pointer Visualizer/Mouse Pointer.prefab.meta => Cursors/Mouse Cursor.prefab.meta} (100%) rename Source/Assets/TouchScript/Prefabs/{Pointer Visualizer/Pen Pointer.prefab => Cursors/Pen Cursor.prefab} (68%) rename Source/Assets/TouchScript/Prefabs/{Pointer Visualizer/Pen Pointer.prefab.meta => Cursors/Pen Cursor.prefab.meta} (100%) rename Source/Assets/TouchScript/Prefabs/{Pointer Visualizer => Cursors}/Pointer.prefab (56%) rename Source/Assets/TouchScript/Prefabs/{Pointer Visualizer => Cursors}/Pointer.prefab.meta (100%) rename Source/Assets/TouchScript/Prefabs/{Pointer Visualizer/Touch Pointer.prefab => Cursors/Touch Cursor.prefab} (77%) rename Source/Assets/TouchScript/Prefabs/{Pointer Visualizer/Touch Pointer.prefab.meta => Cursors/Touch Cursor.prefab.meta} (100%) rename Source/Assets/TouchScript/Scripts/Behaviors/{Visualizer.meta => Cursors.meta} (100%) rename Source/Assets/TouchScript/Scripts/Behaviors/{Visualizer/PointerVisualizer.cs => Cursors/CursorManager.cs} (61%) rename Source/Assets/TouchScript/Scripts/Behaviors/{Visualizer/PointerVisualizer.cs.meta => Cursors/CursorManager.cs.meta} (100%) rename Source/Assets/TouchScript/Scripts/Behaviors/{Visualizer/MousePointerProxy.cs => Cursors/MouseCursor.cs} (94%) rename Source/Assets/TouchScript/Scripts/Behaviors/{Visualizer/MousePointerProxy.cs.meta => Cursors/MouseCursor.cs.meta} (100%) rename Source/Assets/TouchScript/Scripts/Behaviors/{Visualizer/ObjectPointerProxy.cs => Cursors/ObjectCursor.cs} (93%) rename Source/Assets/TouchScript/Scripts/Behaviors/{Visualizer/ObjectPointerProxy.cs.meta => Cursors/ObjectCursor.cs.meta} (100%) rename Source/Assets/TouchScript/Scripts/Behaviors/{Visualizer/PenPointerProxy.cs => Cursors/PenCursor.cs} (96%) rename Source/Assets/TouchScript/Scripts/Behaviors/{Visualizer/PenPointerProxy.cs.meta => Cursors/PenCursor.cs.meta} (100%) rename Source/Assets/TouchScript/Scripts/Behaviors/{Visualizer/PointerProxy.cs => Cursors/PointerCursor.cs} (96%) rename Source/Assets/TouchScript/Scripts/Behaviors/{Visualizer/PointerProxy.cs.meta => Cursors/PointerCursor.cs.meta} (100%) rename Source/Assets/TouchScript/Scripts/Behaviors/{Visualizer/TouchPointerProxy.cs => Cursors/TouchCursor.cs} (92%) rename Source/Assets/TouchScript/Scripts/Behaviors/{Visualizer/TouchPointerProxy.cs.meta => Cursors/TouchCursor.cs.meta} (100%) create mode 100644 Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI.meta create mode 100644 Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI/GradientTexture.cs create mode 100644 Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI/GradientTexture.cs.meta create mode 100644 Source/Assets/TouchScript/Scripts/Behaviors/UI.meta rename Source/Assets/TouchScript/Scripts/Behaviors/{ => UI}/OverHelper.cs (99%) rename Source/Assets/TouchScript/Scripts/Behaviors/{ => UI}/OverHelper.cs.meta (100%) create mode 100644 Source/Assets/TouchScript/Shaders/Cursor.shader create mode 100644 Source/Assets/TouchScript/Shaders/Cursor.shader.meta delete mode 100644 Source/Assets/TouchScript/Textures.meta delete mode 100644 Source/Assets/TouchScript/Textures/Touch.png delete mode 100644 Source/Assets/TouchScript/Textures/Touch.png.meta diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Transform.meta b/Source/Assets/Test.meta similarity index 67% rename from Source/Assets/TouchScript/Scripts/Behaviors/Transform.meta rename to Source/Assets/Test.meta index a6e0f489a..ed78c8085 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Transform.meta +++ b/Source/Assets/Test.meta @@ -1,7 +1,7 @@ fileFormatVersion: 2 -guid: 94c706edb4eee4fa8a0d0fa0aad1e396 +guid: 7e1fcc64fde35914b886872755292f44 folderAsset: yes -timeCreated: 1477922543 +timeCreated: 1490462516 licenseType: Pro DefaultImporter: userData: diff --git a/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs b/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/CursorManagerEditor.cs similarity index 88% rename from Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs rename to Source/Assets/TouchScript/Editor/Behaviors/Visualizer/CursorManagerEditor.cs index 182377f25..4a601e715 100644 --- a/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs +++ b/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/CursorManagerEditor.cs @@ -1,8 +1,8 @@ /* * @author Valentin Simonov / http://va.lent.in/ */ - -using TouchScript.Behaviors.Visualizer; + +using TouchScript.Behaviors.Cursors; using UnityEditor; using UnityEngine; using TouchScript.Editor.Utils; @@ -10,8 +10,8 @@ namespace TouchScript.Editor.Behaviors.Visualizer { - [CustomEditor(typeof(PointerVisualizer))] - internal sealed class TouchVisualizerEditor : UnityEditor.Editor + [CustomEditor(typeof(CursorManager))] + internal sealed class CursorManagerEditor : UnityEditor.Editor { public static readonly GUIContent TEXT_DPI_HEADER = new GUIContent("Use DPI", "Scale touch pointer based on DPI."); @@ -24,13 +24,13 @@ internal sealed class TouchVisualizerEditor : UnityEditor.Editor private void OnEnable() { - mousePointerProxy = serializedObject.FindProperty("mousePointerProxy"); - touchPointerProxy = serializedObject.FindProperty("touchPointerProxy"); - penPointerProxy = serializedObject.FindProperty("penPointerProxy"); - objectPointerProxy = serializedObject.FindProperty("objectPointerProxy"); + mousePointerProxy = serializedObject.FindProperty("mouseCursor"); + touchPointerProxy = serializedObject.FindProperty("touchCursor"); + penPointerProxy = serializedObject.FindProperty("penCursor"); + objectPointerProxy = serializedObject.FindProperty("objectCursor"); useDPI = serializedObject.FindProperty("useDPI"); - touchSize = serializedObject.FindProperty("pointerSize"); + touchSize = serializedObject.FindProperty("cursorSize"); advancedProps = serializedObject.FindProperty("advancedProps"); } diff --git a/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs.meta b/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/CursorManagerEditor.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs.meta rename to Source/Assets/TouchScript/Editor/Behaviors/Visualizer/CursorManagerEditor.cs.meta diff --git a/Source/Assets/TouchScript/Examples/Camera/Camera.unity b/Source/Assets/TouchScript/Examples/Camera/Camera.unity index aa5a1ebbd..9e3d40a05 100644 --- a/Source/Assets/TouchScript/Examples/Camera/Camera.unity +++ b/Source/Assets/TouchScript/Examples/Camera/Camera.unity @@ -352,6 +352,31 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &327566704 stripped +GameObject: + m_PrefabParentObject: {fileID: 100002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} + m_PrefabInternal: {fileID: 572399281} +--- !u!114 &327566705 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 327566704} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e276ccba4f7314d9988af19f9b3a611b, type: 3} + m_Name: + m_EditorClassIdentifier: + advancedProps: 0 + generalProps: 0 + windowsProps: 0 + windows8API: 0 + windows7API: 0 + webGLTouch: 1 + windows8Mouse: 1 + windows7Mouse: 1 + universalWindowsMouse: 1 + emulateSecondMousePointer: 1 --- !u!1 &567050689 GameObject: m_ObjectHideFlags: 0 @@ -486,7 +511,7 @@ Prefab: objectReference: {fileID: 0} - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: m_RootOrder - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: layers.Array.data[0] @@ -500,6 +525,10 @@ Prefab: propertyPath: m_IsActive value: 1 objectReference: {fileID: 0} + - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} + propertyPath: layers.Array.data[1] + value: + objectReference: {fileID: 0} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} m_IsPrefabParent: 0 @@ -749,7 +778,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 74ae431eff8434b0897d3f7f1cff4311, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 1 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 1 maxPointers: 1 @@ -758,8 +793,25 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnTransformStart: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransform: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransformComplete: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null type: 1 screenTransformThreshold: 0.05 minScreenPointsDistance: 0.5 @@ -819,7 +871,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 74ae431eff8434b0897d3f7f1cff4311, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 1 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 2 maxPointers: 10 @@ -828,8 +886,25 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnTransformStart: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransform: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransformComplete: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null type: 7 screenTransformThreshold: 0.2 minScreenPointsDistance: 0.5 diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs index c4d240eb1..e6d0e0de0 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs @@ -2,11 +2,12 @@ * @author Valentin Simonov / http://va.lent.in/ */ +using TouchScript.Behaviors.Cursors; using TouchScript.Pointers; namespace TouchScript.Examples.Cube { - public class CustomPointerProxy : Behaviors.Visualizer.PointerProxy + public class CustomPointerProxy : PointerCursor { protected override void updateOnce(IPointer pointer) { if (pointer.InputSource is RedirectInput) Hide(); diff --git a/Source/Assets/TouchScript/Examples/Photos/Photos.unity b/Source/Assets/TouchScript/Examples/Photos/Photos.unity index 79d8a9d36..47c3516d0 100644 --- a/Source/Assets/TouchScript/Examples/Photos/Photos.unity +++ b/Source/Assets/TouchScript/Examples/Photos/Photos.unity @@ -199,6 +199,7 @@ MonoBehaviour: m_EditorClassIdentifier: Name: Main Camera advancedProps: 0 + hitProps: 0 hit3DObjects: 0 hit2DObjects: 0 hitWorldSpaceUI: 1 @@ -939,7 +940,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -948,11 +955,29 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnTransformStart: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransform: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransformComplete: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null type: 7 screenTransformThreshold: 0.1 minScreenPointsDistance: 0.5 + projectionProps: 0 projection: 2 projectionPlaneNormal: {x: 0, y: 1, z: 0} --- !u!114 &238072902 @@ -966,7 +991,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -975,8 +1006,15 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnPress: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null ignoreChildren: 0 --- !u!114 &238072905 MonoBehaviour: @@ -1532,7 +1570,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1541,8 +1585,15 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnPress: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null ignoreChildren: 0 --- !u!114 &449324830 MonoBehaviour: @@ -1572,7 +1623,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1581,11 +1638,29 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnTransformStart: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransform: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransformComplete: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null type: 7 screenTransformThreshold: 0.1 minScreenPointsDistance: 0.5 + projectionProps: 0 projection: 2 projectionPlaneNormal: {x: 0, y: 1, z: 0} --- !u!114 &449324832 @@ -1752,7 +1827,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1761,8 +1842,15 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnPress: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null ignoreChildren: 0 --- !u!114 &536919391 MonoBehaviour: @@ -1792,7 +1880,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1801,11 +1895,29 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnTransformStart: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransform: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransformComplete: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null type: 7 screenTransformThreshold: 0.1 minScreenPointsDistance: 0.5 + projectionProps: 0 projection: 2 projectionPlaneNormal: {x: 0, y: 1, z: 0} --- !u!114 &536919393 @@ -1898,6 +2010,31 @@ Prefab: m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} m_IsPrefabParent: 0 +--- !u!1 &543251037 stripped +GameObject: + m_PrefabParentObject: {fileID: 100002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} + m_PrefabInternal: {fileID: 543251036} +--- !u!114 &543251038 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 543251037} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e276ccba4f7314d9988af19f9b3a611b, type: 3} + m_Name: + m_EditorClassIdentifier: + advancedProps: 0 + generalProps: 0 + windowsProps: 0 + windows8API: 0 + windows7API: 0 + webGLTouch: 1 + windows8Mouse: 1 + windows7Mouse: 1 + universalWindowsMouse: 1 + emulateSecondMousePointer: 1 --- !u!1 &551049734 GameObject: m_ObjectHideFlags: 0 @@ -2707,7 +2844,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -2716,8 +2859,15 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnPress: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null ignoreChildren: 0 --- !u!114 &886654114 MonoBehaviour: @@ -2747,7 +2897,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -2756,11 +2912,29 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnTransformStart: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransform: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransformComplete: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null type: 7 screenTransformThreshold: 0.1 minScreenPointsDistance: 0.5 + projectionProps: 0 projection: 2 projectionPlaneNormal: {x: 0, y: 1, z: 0} --- !u!114 &886654117 @@ -4532,7 +4706,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -4541,8 +4721,15 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnPress: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null ignoreChildren: 0 --- !u!114 &1485721905 MonoBehaviour: @@ -4572,7 +4759,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -4581,11 +4774,29 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnTransformStart: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransform: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransformComplete: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null type: 7 screenTransformThreshold: 0.1 minScreenPointsDistance: 0.5 + projectionProps: 0 projection: 2 projectionPlaneNormal: {x: 0, y: 1, z: 0} --- !u!114 &1485721907 @@ -5299,7 +5510,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -5308,8 +5525,15 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnPress: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null ignoreChildren: 0 --- !u!114 &1979821163 MonoBehaviour: @@ -5339,7 +5563,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -5348,11 +5578,29 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnTransformStart: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransform: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransformComplete: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null type: 7 screenTransformThreshold: 0.1 minScreenPointsDistance: 0.5 + projectionProps: 0 projection: 2 projectionPlaneNormal: {x: 0, y: 1, z: 0} --- !u!114 &1979821165 diff --git a/Source/Assets/TouchScript/Examples/Portal/Portal.unity b/Source/Assets/TouchScript/Examples/Portal/Portal.unity index e2096f8ba..75ee85946 100644 --- a/Source/Assets/TouchScript/Examples/Portal/Portal.unity +++ b/Source/Assets/TouchScript/Examples/Portal/Portal.unity @@ -132,6 +132,7 @@ MonoBehaviour: m_EditorClassIdentifier: Name: Camera advancedProps: 0 + hitProps: 0 hit3DObjects: 1 hit2DObjects: 0 hitWorldSpaceUI: 0 @@ -374,7 +375,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -383,11 +390,29 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnTransformStart: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransform: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransformComplete: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null type: 1 screenTransformThreshold: 0.1 minScreenPointsDistance: 0.5 + projectionProps: 0 projection: 1 projectionPlaneNormal: {x: 0, y: 0, z: 1} --- !u!114 &481822350 @@ -401,7 +426,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 141e75b9b7edb42df80a22a14f03ae4b, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -410,8 +441,15 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnRelease: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null ignoreChildren: 0 --- !u!114 &481822351 MonoBehaviour: @@ -424,7 +462,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -433,8 +477,15 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnPress: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null ignoreChildren: 0 --- !u!54 &481822352 Rigidbody: @@ -531,6 +582,31 @@ Prefab: m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} m_IsPrefabParent: 0 +--- !u!1 &543251037 stripped +GameObject: + m_PrefabParentObject: {fileID: 100002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} + m_PrefabInternal: {fileID: 543251036} +--- !u!114 &543251038 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 543251037} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e276ccba4f7314d9988af19f9b3a611b, type: 3} + m_Name: + m_EditorClassIdentifier: + advancedProps: 0 + generalProps: 0 + windowsProps: 0 + windows8API: 0 + windows7API: 0 + webGLTouch: 1 + windows8Mouse: 1 + windows7Mouse: 1 + universalWindowsMouse: 1 + emulateSecondMousePointer: 1 --- !u!1 &740851131 GameObject: m_ObjectHideFlags: 0 @@ -796,7 +872,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -805,11 +887,29 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnTransformStart: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransform: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransformComplete: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null type: 1 screenTransformThreshold: 0.1 minScreenPointsDistance: 0.5 + projectionProps: 0 projection: 1 projectionPlaneNormal: {x: 0, y: 0, z: 1} --- !u!135 &851559567 @@ -835,7 +935,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 141e75b9b7edb42df80a22a14f03ae4b, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -844,8 +950,15 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnRelease: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null ignoreChildren: 0 --- !u!114 &851559569 MonoBehaviour: @@ -858,7 +971,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -867,8 +986,15 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnPress: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null ignoreChildren: 0 --- !u!54 &851559570 Rigidbody: @@ -1009,7 +1135,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1018,11 +1150,29 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnTransformStart: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransform: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransformComplete: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null type: 1 screenTransformThreshold: 0.1 minScreenPointsDistance: 0.5 + projectionProps: 0 projection: 1 projectionPlaneNormal: {x: 0, y: 0, z: 1} --- !u!114 &893756813 @@ -1036,7 +1186,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 141e75b9b7edb42df80a22a14f03ae4b, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1045,8 +1201,15 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnRelease: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null ignoreChildren: 0 --- !u!114 &893756814 MonoBehaviour: @@ -1059,7 +1222,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1068,8 +1237,15 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnPress: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null ignoreChildren: 0 --- !u!54 &893756815 Rigidbody: @@ -1340,7 +1516,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1349,11 +1531,29 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnTransformStart: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransform: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransformComplete: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null type: 1 screenTransformThreshold: 0.1 minScreenPointsDistance: 0.5 + projectionProps: 0 projection: 1 projectionPlaneNormal: {x: 0, y: 0, z: 1} --- !u!114 &1166789659 @@ -1367,7 +1567,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 141e75b9b7edb42df80a22a14f03ae4b, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1376,8 +1582,15 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnRelease: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null ignoreChildren: 0 --- !u!114 &1166789660 MonoBehaviour: @@ -1390,7 +1603,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1399,8 +1618,15 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnPress: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null ignoreChildren: 0 --- !u!54 &1166789661 Rigidbody: diff --git a/Source/Assets/TouchScript/Examples/Taps/Taps.unity b/Source/Assets/TouchScript/Examples/Taps/Taps.unity index 9e8ec5d49..9a108d970 100644 --- a/Source/Assets/TouchScript/Examples/Taps/Taps.unity +++ b/Source/Assets/TouchScript/Examples/Taps/Taps.unity @@ -131,6 +131,7 @@ MonoBehaviour: m_EditorClassIdentifier: Name: Scene Camera advancedProps: 0 + hitProps: 0 hit3DObjects: 1 hit2DObjects: 0 hitWorldSpaceUI: 0 @@ -470,9 +471,38 @@ Prefab: propertyPath: m_Enabled value: 1 objectReference: {fileID: 0} + - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} m_IsPrefabParent: 0 +--- !u!1 &543251037 stripped +GameObject: + m_PrefabParentObject: {fileID: 100002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} + m_PrefabInternal: {fileID: 543251036} +--- !u!114 &543251038 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 543251037} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e276ccba4f7314d9988af19f9b3a611b, type: 3} + m_Name: + m_EditorClassIdentifier: + advancedProps: 0 + generalProps: 0 + windowsProps: 0 + windows8API: 0 + windows7API: 0 + webGLTouch: 1 + windows8Mouse: 1 + windows7Mouse: 1 + universalWindowsMouse: 1 + emulateSecondMousePointer: 1 --- !u!1 &584553676 stripped GameObject: m_PrefabParentObject: {fileID: 100004, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} @@ -492,7 +522,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 7a878a6ff128243dfb1d89ca0273f059, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -501,8 +537,15 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnTap: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null numberOfTapsRequired: 2 timeLimit: Infinity distanceLimit: Infinity @@ -529,15 +572,15 @@ Prefab: m_Modifications: - target: {fileID: 400004, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} propertyPath: m_LocalPosition.x - value: -.0399999991 + value: -0.04 objectReference: {fileID: 0} - target: {fileID: 400004, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} propertyPath: m_LocalPosition.y - value: -12.9700003 + value: -12.97 objectReference: {fileID: 0} - target: {fileID: 400004, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} propertyPath: m_LocalPosition.z - value: .25999999 + value: 0.26 objectReference: {fileID: 0} - target: {fileID: 400004, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} propertyPath: m_LocalRotation.x @@ -545,7 +588,7 @@ Prefab: objectReference: {fileID: 0} - target: {fileID: 400004, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} propertyPath: m_LocalRotation.y - value: .360566735 + value: 0.36056674 objectReference: {fileID: 0} - target: {fileID: 400004, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} propertyPath: m_LocalRotation.z @@ -553,7 +596,7 @@ Prefab: objectReference: {fileID: 0} - target: {fileID: 400004, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} propertyPath: m_LocalRotation.w - value: .932733476 + value: 0.9327335 objectReference: {fileID: 0} - target: {fileID: 400004, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} propertyPath: m_RootOrder @@ -1647,17 +1690,77 @@ Prefab: m_Modification: m_TransformParent: {fileID: 0} m_Modifications: - - target: {fileID: 11400000, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} - propertyPath: m_Enabled - value: 1 + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_LocalPosition.x + value: 0 objectReference: {fileID: 0} - - target: {fileID: 100000, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} - propertyPath: m_IsActive + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_LocalRotation.w value: 1 objectReference: {fileID: 0} - - target: {fileID: 400000, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} propertyPath: m_RootOrder - value: 1 + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_Pivot.y + value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} diff --git a/Source/Assets/TouchScript/Examples/_misc/Scripts/Highlight.cs b/Source/Assets/TouchScript/Examples/_misc/Scripts/Highlight.cs index a7d3e665f..b20d1eb8e 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Scripts/Highlight.cs +++ b/Source/Assets/TouchScript/Examples/_misc/Scripts/Highlight.cs @@ -3,8 +3,7 @@ */ using UnityEngine; -using System.Collections; -using TouchScript.Behaviors; +using TouchScript.Behaviors.UI; public class Highlight : MonoBehaviour { diff --git a/Source/Assets/TouchScript/Examples/_prefabs/TouchScript.prefab b/Source/Assets/TouchScript/Examples/_prefabs/TouchScript.prefab index 5c4f385ef..c6fe98145 100644 --- a/Source/Assets/TouchScript/Examples/_prefabs/TouchScript.prefab +++ b/Source/Assets/TouchScript/Examples/_prefabs/TouchScript.prefab @@ -25,6 +25,7 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 0} m_RootOrder: 0 @@ -39,13 +40,56 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 0dd4c394fe06f4ea49e03aaa5e7a8190, type: 3} m_Name: m_EditorClassIdentifier: + OnFrameStart: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.TouchManager+FrameEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnFrameFinish: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.TouchManager+FrameEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnPointersAdd: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.TouchManager+PointerEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnPointersUpdate: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.TouchManager+PointerEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnPointersPress: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.TouchManager+PointerEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnPointersRelease: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.TouchManager+PointerEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnPointersRemove: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.TouchManager+PointerEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnPointersCancel: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.TouchManager+PointerEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + advancedProps: 0 displayDevice: {fileID: 0} shouldCreateCameraLayer: 1 shouldCreateStandardInput: 1 useSendMessage: 0 sendMessageEvents: 60 sendMessageTarget: {fileID: 0} - layers: [] + useUnityEvents: 0 + layers: + - {fileID: 0} --- !u!1001 &100100000 Prefab: m_ObjectHideFlags: 1 diff --git a/Source/Assets/TouchScript/Prefabs/Pointer Visualizer.meta b/Source/Assets/TouchScript/Prefabs/Cursors.meta similarity index 100% rename from Source/Assets/TouchScript/Prefabs/Pointer Visualizer.meta rename to Source/Assets/TouchScript/Prefabs/Cursors.meta diff --git a/Source/Assets/TouchScript/Prefabs/Pointer Visualizer.prefab b/Source/Assets/TouchScript/Prefabs/Cursors.prefab similarity index 86% rename from Source/Assets/TouchScript/Prefabs/Pointer Visualizer.prefab rename to Source/Assets/TouchScript/Prefabs/Cursors.prefab index f12df3482..bf99bf1ff 100644 --- a/Source/Assets/TouchScript/Prefabs/Pointer Visualizer.prefab +++ b/Source/Assets/TouchScript/Prefabs/Cursors.prefab @@ -11,7 +11,7 @@ GameObject: - 114: {fileID: 11400000} - 223: {fileID: 22341586} m_Layer: 0 - m_Name: Pointer Visualizer + m_Name: Cursors m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -45,12 +45,12 @@ MonoBehaviour: m_EditorClassIdentifier: generalProps: 0 advancedProps: 0 - mousePointerProxy: {fileID: 11416202, guid: a71503570adc6194b9bbc69bf19cc2de, type: 2} - touchPointerProxy: {fileID: 11435582, guid: 7fd82b375cf1cdc45b55e2751d814207, type: 2} - penPointerProxy: {fileID: 11486812, guid: 7af150e8b98b05449aaf9462bd6c7109, type: 2} - objectPointerProxy: {fileID: 11468960, guid: 4230502e1973f4c9e9ef6767dcc8c602, type: 2} + mouseCursor: {fileID: 11416202, guid: a71503570adc6194b9bbc69bf19cc2de, type: 2} + touchCursor: {fileID: 11435582, guid: 7fd82b375cf1cdc45b55e2751d814207, type: 2} + penCursor: {fileID: 11486812, guid: 7af150e8b98b05449aaf9462bd6c7109, type: 2} + objectCursor: {fileID: 11468960, guid: 4230502e1973f4c9e9ef6767dcc8c602, type: 2} useDPI: 1 - pointerSize: 3 + cursorSize: 2 --- !u!1002 &11400001 EditorExtensionImpl: serializedVersion: 6 diff --git a/Source/Assets/TouchScript/Prefabs/Pointer Visualizer.prefab.meta b/Source/Assets/TouchScript/Prefabs/Cursors.prefab.meta similarity index 100% rename from Source/Assets/TouchScript/Prefabs/Pointer Visualizer.prefab.meta rename to Source/Assets/TouchScript/Prefabs/Cursors.prefab.meta diff --git a/Source/Assets/TouchScript/Prefabs/Cursors/Cursor.mat b/Source/Assets/TouchScript/Prefabs/Cursors/Cursor.mat new file mode 100644 index 000000000..6951e644f --- /dev/null +++ b/Source/Assets/TouchScript/Prefabs/Cursors/Cursor.mat @@ -0,0 +1,138 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: Cursor + m_Shader: {fileID: 4800000, guid: 2af36406130024644b499213db069f78, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 5 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + data: + first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + data: + first: + name: _SrcBlend + second: 1 + data: + first: + name: _DstBlend + second: 0 + data: + first: + name: _Cutoff + second: 0.5 + data: + first: + name: _Parallax + second: 0.02 + data: + first: + name: _ZWrite + second: 1 + data: + first: + name: _Glossiness + second: 0.5 + data: + first: + name: _BumpScale + second: 1 + data: + first: + name: _OcclusionStrength + second: 1 + data: + first: + name: _DetailNormalMapScale + second: 1 + data: + first: + name: _UVSec + second: 0 + data: + first: + name: _Mode + second: 0 + data: + first: + name: _Metallic + second: 0 + m_Colors: + data: + first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} + data: + first: + name: _Color + second: {r: 1, g: 1, b: 1, a: 1} diff --git a/Source/Assets/TouchScript/Prefabs/Cursors/Cursor.mat.meta b/Source/Assets/TouchScript/Prefabs/Cursors/Cursor.mat.meta new file mode 100644 index 000000000..814588848 --- /dev/null +++ b/Source/Assets/TouchScript/Prefabs/Cursors/Cursor.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 10886028a78e7634d8d44ee11f7b1c08 +timeCreated: 1500213727 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Mouse Pointer.prefab b/Source/Assets/TouchScript/Prefabs/Cursors/Mouse Cursor.prefab similarity index 69% rename from Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Mouse Pointer.prefab rename to Source/Assets/TouchScript/Prefabs/Cursors/Mouse Cursor.prefab index 4930b5a01..4375a8385 100644 --- a/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Mouse Pointer.prefab +++ b/Source/Assets/TouchScript/Prefabs/Cursors/Mouse Cursor.prefab @@ -27,7 +27,8 @@ GameObject: m_Component: - 224: {fileID: 22471328} - 222: {fileID: 22246154} - - 114: {fileID: 11454912} + - 114: {fileID: 11446800} + - 114: {fileID: 11419342} m_Layer: 0 m_Name: Pressed m_TagString: Untagged @@ -45,7 +46,7 @@ GameObject: - 224: {fileID: 22499528} - 114: {fileID: 11416202} m_Layer: 0 - m_Name: Mouse Pointer + m_Name: Mouse Cursor m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -60,7 +61,8 @@ GameObject: m_Component: - 224: {fileID: 22497446} - 222: {fileID: 22249184} - - 114: {fileID: 11412770} + - 114: {fileID: 11453278} + - 114: {fileID: 11448672} m_Layer: 0 m_Name: Default m_TagString: Untagged @@ -68,33 +70,6 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &11412770 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 189110} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 0.209} - m_RaycastTarget: 0 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 21300000, guid: f5c75ed8c6bed0f489d9003aa739aff7, type: 3} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 --- !u!114 &11415522 MonoBehaviour: m_ObjectHideFlags: 1 @@ -107,7 +82,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.003921569, g: 0.9960785, b: 0.9960785, a: 1} + m_Color: {r: 0, g: 1, b: 0, a: 1} m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: @@ -145,12 +120,68 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c8fbf4dedcb22ba4c955bd24592e0845, type: 3} m_Name: m_EditorClassIdentifier: - ShowPointerId: 1 - ShowFlags: 1 + ShowPointerId: 0 + ShowFlags: 0 Text: {fileID: 11415522} DefaultCursor: {fileID: 189110} PressedCursor: {fileID: 183852} - ShowButtons: 1 + ShowButtons: 0 +--- !u!114 &11419342 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 183852} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d78b78253cc71a64ca6bf0978d7ac99e, type: 3} + m_Name: + m_EditorClassIdentifier: + Gradient: + key0: + serializedVersion: 2 + rgba: 0 + key1: + serializedVersion: 2 + rgba: 1006698240 + key2: + serializedVersion: 2 + rgba: 1006698240 + key3: + serializedVersion: 2 + rgba: 4278190080 + key4: + serializedVersion: 2 + rgba: 4278190080 + key5: + serializedVersion: 2 + rgba: 1006632960 + key6: + serializedVersion: 2 + rgba: 1090519040 + key7: + serializedVersion: 2 + rgba: 0 + ctime0: 31905 + ctime1: 33371 + ctime2: 44754 + ctime3: 46306 + ctime4: 45875 + ctime5: 59068 + ctime6: 0 + ctime7: 0 + atime0: 17591 + atime1: 18712 + atime2: 25007 + atime3: 26042 + atime4: 55791 + atime5: 56826 + atime6: 64242 + atime7: 64571 + m_NumColorKeys: 4 + m_NumAlphaKeys: 8 + Name: Mouse Pressed + Resolution: 256 --- !u!114 &11446012 MonoBehaviour: m_ObjectHideFlags: 1 @@ -165,7 +196,7 @@ MonoBehaviour: m_EffectColor: {r: 0, g: 0, b: 0, a: 0.541} m_EffectDistance: {x: 1, y: -1} m_UseGraphicAlpha: 1 ---- !u!114 &11454912 +--- !u!114 &11446800 MonoBehaviour: m_ObjectHideFlags: 1 m_PrefabParentObject: {fileID: 0} @@ -173,10 +204,92 @@ MonoBehaviour: m_GameObject: {fileID: 183852} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Script: {fileID: -98529514, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} m_Name: m_EditorClassIdentifier: - m_Material: {fileID: 0} + m_Material: {fileID: 2100000, guid: 10886028a78e7634d8d44ee11f7b1c08, type: 2} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Texture: {fileID: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!114 &11448672 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 189110} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d78b78253cc71a64ca6bf0978d7ac99e, type: 3} + m_Name: + m_EditorClassIdentifier: + Gradient: + key0: + serializedVersion: 2 + rgba: 4278255360 + key1: + serializedVersion: 2 + rgba: 4278255360 + key2: + serializedVersion: 2 + rgba: 1006632960 + key3: + serializedVersion: 2 + rgba: 1006632960 + key4: + serializedVersion: 2 + rgba: 0 + key5: + serializedVersion: 2 + rgba: 0 + key6: + serializedVersion: 2 + rgba: 0 + key7: + serializedVersion: 2 + rgba: 0 + ctime0: 0 + ctime1: 9572 + ctime2: 10779 + ctime3: 46306 + ctime4: 45875 + ctime5: 59068 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 9658 + atime2: 11124 + atime3: 19229 + atime4: 20264 + atime5: 64571 + atime6: 64571 + atime7: 64571 + m_NumColorKeys: 3 + m_NumAlphaKeys: 5 + Name: Mouse Default + Resolution: 256 +--- !u!114 &11453278 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 189110} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -98529514, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 2100000, guid: 10886028a78e7634d8d44ee11f7b1c08, type: 2} m_Color: {r: 1, g: 1, b: 1, a: 1} m_RaycastTarget: 0 m_OnCullStateChanged: @@ -184,14 +297,13 @@ MonoBehaviour: m_Calls: [] m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 21300000, guid: f5c75ed8c6bed0f489d9003aa739aff7, type: 3} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 + m_Texture: {fileID: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 --- !u!222 &22246154 CanvasRenderer: m_ObjectHideFlags: 1 @@ -282,7 +394,7 @@ RectTransform: m_RootOrder: 0 m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 370, y: 402.78} + m_AnchoredPosition: {x: 500, y: 300} m_SizeDelta: {x: 64, y: 64} m_Pivot: {x: 0.5, y: 0.5} --- !u!1001 &100100000 diff --git a/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Mouse Pointer.prefab.meta b/Source/Assets/TouchScript/Prefabs/Cursors/Mouse Cursor.prefab.meta similarity index 100% rename from Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Mouse Pointer.prefab.meta rename to Source/Assets/TouchScript/Prefabs/Cursors/Mouse Cursor.prefab.meta diff --git a/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pen Pointer.prefab b/Source/Assets/TouchScript/Prefabs/Cursors/Pen Cursor.prefab similarity index 68% rename from Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pen Pointer.prefab rename to Source/Assets/TouchScript/Prefabs/Cursors/Pen Cursor.prefab index f450ca475..c9cc2cc4e 100644 --- a/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pen Pointer.prefab +++ b/Source/Assets/TouchScript/Prefabs/Cursors/Pen Cursor.prefab @@ -28,7 +28,7 @@ GameObject: - 224: {fileID: 22480400} - 114: {fileID: 11486812} m_Layer: 0 - m_Name: Pen Pointer + m_Name: Pen Cursor m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -43,7 +43,8 @@ GameObject: m_Component: - 224: {fileID: 22479482} - 222: {fileID: 22231526} - - 114: {fileID: 11430106} + - 114: {fileID: 11469244} + - 114: {fileID: 11473414} m_Layer: 0 m_Name: Default m_TagString: Untagged @@ -60,7 +61,8 @@ GameObject: m_Component: - 224: {fileID: 22408358} - 222: {fileID: 22255864} - - 114: {fileID: 11441420} + - 114: {fileID: 11426810} + - 114: {fileID: 11438738} m_Layer: 0 m_Name: Pressed m_TagString: Untagged @@ -82,33 +84,88 @@ MonoBehaviour: m_EffectColor: {r: 0, g: 0, b: 0, a: 0.541} m_EffectDistance: {x: 1, y: -1} m_UseGraphicAlpha: 1 ---- !u!114 &11430106 +--- !u!114 &11426810 MonoBehaviour: m_ObjectHideFlags: 1 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 133736} + m_GameObject: {fileID: 167092} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Script: {fileID: -98529514, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} m_Name: m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.07450981, g: 1, b: 0, a: 0.234} + m_Material: {fileID: 2100000, guid: 10886028a78e7634d8d44ee11f7b1c08, type: 2} + m_Color: {r: 1, g: 1, b: 1, a: 1} m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 21300000, guid: f5c75ed8c6bed0f489d9003aa739aff7, type: 3} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 + m_Texture: {fileID: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!114 &11438738 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 167092} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d78b78253cc71a64ca6bf0978d7ac99e, type: 3} + m_Name: + m_EditorClassIdentifier: + Gradient: + key0: + serializedVersion: 2 + rgba: 0 + key1: + serializedVersion: 2 + rgba: 1006693630 + key2: + serializedVersion: 2 + rgba: 1006693630 + key3: + serializedVersion: 2 + rgba: 4278190080 + key4: + serializedVersion: 2 + rgba: 4278190080 + key5: + serializedVersion: 2 + rgba: 1006632960 + key6: + serializedVersion: 2 + rgba: 1090519040 + key7: + serializedVersion: 2 + rgba: 0 + ctime0: 31905 + ctime1: 33371 + ctime2: 44754 + ctime3: 46306 + ctime4: 45875 + ctime5: 59068 + ctime6: 0 + ctime7: 0 + atime0: 17591 + atime1: 18712 + atime2: 25007 + atime3: 26042 + atime4: 55791 + atime5: 56826 + atime6: 64242 + atime7: 64571 + m_NumColorKeys: 4 + m_NumAlphaKeys: 8 + Name: Pen Pressed + Resolution: 256 --- !u!114 &11439998 MonoBehaviour: m_ObjectHideFlags: 1 @@ -121,7 +178,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.003921569, g: 0.9960785, b: 0.9960785, a: 1} + m_Color: {r: 0.99607843, g: 0.9254902, b: 0, a: 1} m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: @@ -148,33 +205,88 @@ MonoBehaviour: 3 4' ---- !u!114 &11441420 +--- !u!114 &11469244 MonoBehaviour: m_ObjectHideFlags: 1 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 167092} + m_GameObject: {fileID: 133736} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Script: {fileID: -98529514, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} m_Name: m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.07586217, g: 1, b: 0, a: 1} + m_Material: {fileID: 2100000, guid: 10886028a78e7634d8d44ee11f7b1c08, type: 2} + m_Color: {r: 1, g: 1, b: 1, a: 1} m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 21300000, guid: f5c75ed8c6bed0f489d9003aa739aff7, type: 3} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 + m_Texture: {fileID: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!114 &11473414 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 133736} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d78b78253cc71a64ca6bf0978d7ac99e, type: 3} + m_Name: + m_EditorClassIdentifier: + Gradient: + key0: + serializedVersion: 2 + rgba: 4278316542 + key1: + serializedVersion: 2 + rgba: 4278250750 + key2: + serializedVersion: 2 + rgba: 1006632960 + key3: + serializedVersion: 2 + rgba: 1006632960 + key4: + serializedVersion: 2 + rgba: 0 + key5: + serializedVersion: 2 + rgba: 0 + key6: + serializedVersion: 2 + rgba: 0 + key7: + serializedVersion: 2 + rgba: 0 + ctime0: 0 + ctime1: 9572 + ctime2: 10779 + ctime3: 46306 + ctime4: 45875 + ctime5: 59068 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 9572 + atime2: 11124 + atime3: 19229 + atime4: 20264 + atime5: 64571 + atime6: 64571 + atime7: 64571 + m_NumColorKeys: 3 + m_NumAlphaKeys: 5 + Name: Pen Default + Resolution: 256 --- !u!114 &11486812 MonoBehaviour: m_ObjectHideFlags: 1 @@ -186,14 +298,14 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 181d9c001cb470f44ac60c140a847605, type: 3} m_Name: m_EditorClassIdentifier: - ShowPointerId: 1 - ShowFlags: 1 + ShowPointerId: 0 + ShowFlags: 0 Text: {fileID: 11439998} DefaultCursor: {fileID: 133736} PressedCursor: {fileID: 167092} - ShowButtons: 1 - ShowPressure: 1 - ShowRotation: 1 + ShowButtons: 0 + ShowPressure: 0 + ShowRotation: 0 --- !u!222 &22231526 CanvasRenderer: m_ObjectHideFlags: 1 @@ -266,7 +378,7 @@ RectTransform: m_RootOrder: 0 m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 502.94275, y: 402.78043} + m_AnchoredPosition: {x: 500, y: 400} m_SizeDelta: {x: 64, y: 64} m_Pivot: {x: 0.5, y: 0.5} --- !u!224 &22483962 diff --git a/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pen Pointer.prefab.meta b/Source/Assets/TouchScript/Prefabs/Cursors/Pen Cursor.prefab.meta similarity index 100% rename from Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pen Pointer.prefab.meta rename to Source/Assets/TouchScript/Prefabs/Cursors/Pen Cursor.prefab.meta diff --git a/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pointer.prefab b/Source/Assets/TouchScript/Prefabs/Cursors/Pointer.prefab similarity index 56% rename from Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pointer.prefab rename to Source/Assets/TouchScript/Prefabs/Cursors/Pointer.prefab index c728b52ea..9d3c50d60 100644 --- a/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pointer.prefab +++ b/Source/Assets/TouchScript/Prefabs/Cursors/Pointer.prefab @@ -1,18 +1,18 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: ---- !u!1 &152322 +--- !u!1 &117830 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 100100000} serializedVersion: 4 m_Component: - - 224: {fileID: 22498922} - - 222: {fileID: 22253470} - - 114: {fileID: 11415522} - - 114: {fileID: 11446012} + - 224: {fileID: 22436736} + - 222: {fileID: 22287504} + - 114: {fileID: 11421528} + - 114: {fileID: 11442452} m_Layer: 0 - m_Name: Text + m_Name: Pressed m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -26,8 +26,6 @@ GameObject: serializedVersion: 4 m_Component: - 224: {fileID: 22471328} - - 222: {fileID: 22246154} - - 114: {fileID: 11454912} - 114: {fileID: 11468960} m_Layer: 0 m_Name: Pointer @@ -36,80 +34,89 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &11415522 +--- !u!114 &11421528 MonoBehaviour: m_ObjectHideFlags: 1 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 152322} + m_GameObject: {fileID: 117830} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Script: {fileID: -98529514, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} m_Name: m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.003921569, g: 0.9960785, b: 0.9960785, a: 1} + m_Material: {fileID: 2100000, guid: 10886028a78e7634d8d44ee11f7b1c08, type: 2} + m_Color: {r: 1, g: 1, b: 1, a: 1} m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 12 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 10 - m_MaxSize: 40 - m_Alignment: 3 - m_AlignByGeometry: 0 - m_RichText: 0 - m_HorizontalOverflow: 1 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: ---- !u!114 &11446012 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 152322} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -900027084, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_EffectColor: {r: 0, g: 0, b: 0, a: 0.541} - m_EffectDistance: {x: 1, y: -1} - m_UseGraphicAlpha: 1 ---- !u!114 &11454912 + m_Texture: {fileID: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!114 &11442452 MonoBehaviour: m_ObjectHideFlags: 1 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 183852} + m_GameObject: {fileID: 117830} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Script: {fileID: 11500000, guid: d78b78253cc71a64ca6bf0978d7ac99e, type: 3} m_Name: m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 0 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 21300000, guid: f5c75ed8c6bed0f489d9003aa739aff7, type: 3} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 + Gradient: + key0: + serializedVersion: 2 + rgba: 0 + key1: + serializedVersion: 2 + rgba: 1023344129 + key2: + serializedVersion: 2 + rgba: 1023344129 + key3: + serializedVersion: 2 + rgba: 4278190080 + key4: + serializedVersion: 2 + rgba: 4278190080 + key5: + serializedVersion: 2 + rgba: 1006632960 + key6: + serializedVersion: 2 + rgba: 1090519040 + key7: + serializedVersion: 2 + rgba: 0 + ctime0: 31905 + ctime1: 33371 + ctime2: 44754 + ctime3: 46306 + ctime4: 45875 + ctime5: 59068 + ctime6: 0 + ctime7: 0 + atime0: 17591 + atime1: 18712 + atime2: 25007 + atime3: 26042 + atime4: 55791 + atime5: 56826 + atime6: 64242 + atime7: 64571 + m_NumColorKeys: 4 + m_NumAlphaKeys: 8 + Name: Pointer Pressed + Resolution: 256 + texture: {fileID: 0} --- !u!114 &11468960 MonoBehaviour: m_ObjectHideFlags: 1 @@ -121,55 +128,49 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 7cb960f8e83f447beb42da7d064d77e2, type: 3} m_Name: m_EditorClassIdentifier: ---- !u!222 &22246154 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 183852} ---- !u!222 &22253470 +--- !u!222 &22287504 CanvasRenderer: m_ObjectHideFlags: 1 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 152322} ---- !u!224 &22471328 + m_GameObject: {fileID: 117830} +--- !u!224 &22436736 RectTransform: m_ObjectHideFlags: 1 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 183852} + m_GameObject: {fileID: 117830} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 22498922} - m_Father: {fileID: 0} + m_Children: [] + m_Father: {fileID: 22471328} m_RootOrder: 0 m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 472, y: 378} - m_SizeDelta: {x: 64, y: 64} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0.000091552734, y: 0} + m_SizeDelta: {x: -0.00005722046, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22498922 +--- !u!224 &22471328 RectTransform: m_ObjectHideFlags: 1 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 152322} + m_GameObject: {fileID: 183852} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_Children: [] - m_Father: {fileID: 22471328} + m_Children: + - {fileID: 22436736} + m_Father: {fileID: 0} m_RootOrder: 0 - m_AnchorMin: {x: 1, y: 0.5} - m_AnchorMax: {x: 1, y: 0.5} - m_AnchoredPosition: {x: 3, y: 0} - m_SizeDelta: {x: 100, y: 47} - m_Pivot: {x: 0, y: 0.5} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 500, y: 100} + m_SizeDelta: {x: 64, y: 64} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1001 &100100000 Prefab: m_ObjectHideFlags: 1 diff --git a/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pointer.prefab.meta b/Source/Assets/TouchScript/Prefabs/Cursors/Pointer.prefab.meta similarity index 100% rename from Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pointer.prefab.meta rename to Source/Assets/TouchScript/Prefabs/Cursors/Pointer.prefab.meta diff --git a/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Touch Pointer.prefab b/Source/Assets/TouchScript/Prefabs/Cursors/Touch Cursor.prefab similarity index 77% rename from Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Touch Pointer.prefab rename to Source/Assets/TouchScript/Prefabs/Cursors/Touch Cursor.prefab index 825d517e1..458085dc3 100644 --- a/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Touch Pointer.prefab +++ b/Source/Assets/TouchScript/Prefabs/Cursors/Touch Cursor.prefab @@ -27,7 +27,8 @@ GameObject: m_Component: - 224: {fileID: 22471328} - 222: {fileID: 22246154} - - 114: {fileID: 11454912} + - 114: {fileID: 11490436} + - 114: {fileID: 11433328} m_Layer: 0 m_Name: Pressed m_TagString: Untagged @@ -45,7 +46,7 @@ GameObject: - 224: {fileID: 22499528} - 114: {fileID: 11435582} m_Layer: 0 - m_Name: Touch Pointer + m_Name: Touch Cursor m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -90,6 +91,62 @@ MonoBehaviour: 3 4' +--- !u!114 &11433328 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 183852} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d78b78253cc71a64ca6bf0978d7ac99e, type: 3} + m_Name: + m_EditorClassIdentifier: + Gradient: + key0: + serializedVersion: 2 + rgba: 0 + key1: + serializedVersion: 2 + rgba: 1023344129 + key2: + serializedVersion: 2 + rgba: 1023344129 + key3: + serializedVersion: 2 + rgba: 4278190080 + key4: + serializedVersion: 2 + rgba: 4278190080 + key5: + serializedVersion: 2 + rgba: 1006632960 + key6: + serializedVersion: 2 + rgba: 1090519040 + key7: + serializedVersion: 2 + rgba: 0 + ctime0: 31905 + ctime1: 33371 + ctime2: 44754 + ctime3: 46306 + ctime4: 45875 + ctime5: 59068 + ctime6: 0 + ctime7: 0 + atime0: 17591 + atime1: 18712 + atime2: 25007 + atime3: 26042 + atime4: 55791 + atime5: 56826 + atime6: 64242 + atime7: 64571 + m_NumColorKeys: 4 + m_NumAlphaKeys: 8 + Name: Touch Pressed + Resolution: 256 --- !u!114 &11435582 MonoBehaviour: m_ObjectHideFlags: 1 @@ -101,11 +158,11 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: d3a5cfcc9939fb340b2c3ed29a3d0b5d, type: 3} m_Name: m_EditorClassIdentifier: - ShowPointerId: 1 - ShowFlags: 1 + ShowPointerId: 0 + ShowFlags: 0 Text: {fileID: 11415522} - ShowPressure: 1 - ShowOrientation: 1 + ShowPressure: 0 + ShowRotation: 0 --- !u!114 &11446012 MonoBehaviour: m_ObjectHideFlags: 1 @@ -120,7 +177,7 @@ MonoBehaviour: m_EffectColor: {r: 0, g: 0, b: 0, a: 0.541} m_EffectDistance: {x: 1, y: -1} m_UseGraphicAlpha: 1 ---- !u!114 &11454912 +--- !u!114 &11490436 MonoBehaviour: m_ObjectHideFlags: 1 m_PrefabParentObject: {fileID: 0} @@ -128,25 +185,24 @@ MonoBehaviour: m_GameObject: {fileID: 183852} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Script: {fileID: -98529514, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} m_Name: m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0, g: 0.37931037, b: 1, a: 1} + m_Material: {fileID: 2100000, guid: 10886028a78e7634d8d44ee11f7b1c08, type: 2} + m_Color: {r: 1, g: 1, b: 1, a: 1} m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 21300000, guid: f5c75ed8c6bed0f489d9003aa739aff7, type: 3} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 + m_Texture: {fileID: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 --- !u!222 &22246154 CanvasRenderer: m_ObjectHideFlags: 1 @@ -212,7 +268,7 @@ RectTransform: m_RootOrder: 0 m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 609.9613, y: 418.8903} + m_AnchoredPosition: {x: 500, y: 200} m_SizeDelta: {x: 64, y: 64} m_Pivot: {x: 0.5, y: 0.5} --- !u!1001 &100100000 diff --git a/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Touch Pointer.prefab.meta b/Source/Assets/TouchScript/Prefabs/Cursors/Touch Cursor.prefab.meta similarity index 100% rename from Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Touch Pointer.prefab.meta rename to Source/Assets/TouchScript/Prefabs/Cursors/Touch Cursor.prefab.meta diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer.meta b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/Behaviors/Visualizer.meta rename to Source/Assets/TouchScript/Scripts/Behaviors/Cursors.meta diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs similarity index 61% rename from Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs rename to Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs index 7ff8b2f5c..e2eb255fa 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs @@ -8,43 +8,43 @@ using TouchScript.Utils.Attributes; using UnityEngine; -namespace TouchScript.Behaviors.Visualizer +namespace TouchScript.Behaviors.Cursors { /// /// Pointer visualizer which shows pointer circles with debug text using Unity UI. /// The script should be placed on an element with RectTransform or a Canvas. A reference prefab is provided in TouchScript package. /// [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Behaviors_Visualizer_TouchVisualizer.htm")] - public class PointerVisualizer : MonoBehaviour + public class CursorManager : MonoBehaviour { #region Public properties - public PointerProxy MousePointerProxy + public PointerCursor MouseCursor { - get { return mousePointerProxy; } - set { mousePointerProxy = value; } + get { return mouseCursor; } + set { mouseCursor = value; } } - public PointerProxy TouchPointerProxy + public PointerCursor TouchCursor { - get { return touchPointerProxy; } - set { touchPointerProxy = value; } + get { return touchCursor; } + set { touchCursor = value; } } - public PointerProxy PenPointerProxy + public PointerCursor PenCursor { - get { return penPointerProxy; } - set { penPointerProxy = value; } + get { return penCursor; } + set { penCursor = value; } } - public PointerProxy ObjectPointerProxy + public PointerCursor ObjectCursor { - get { return objectPointerProxy; } - set { objectPointerProxy = value; } + get { return objectCursor; } + set { objectCursor = value; } } /// - /// Gets or sets whether is using DPI to scale pointer cursors. + /// Gets or sets whether is using DPI to scale pointer cursors. /// /// true if DPI value is used; otherwise, false. public bool UseDPI @@ -57,10 +57,10 @@ public bool UseDPI /// Gets or sets the size of pointer cursors in cm. This value is only used when is set to true. /// /// The size of pointer cursors in cm. - public float PointerSize + public float CursorSize { - get { return pointerSize; } - set { pointerSize = value; } + get { return cursorSize; } + set { cursorSize = value; } } #endregion @@ -74,30 +74,30 @@ public float PointerSize private bool advancedProps; // Used in the custom inspector [SerializeField] - private PointerProxy mousePointerProxy; + private PointerCursor mouseCursor; [SerializeField] - private PointerProxy touchPointerProxy; + private PointerCursor touchCursor; [SerializeField] - private PointerProxy penPointerProxy; + private PointerCursor penCursor; [SerializeField] - private PointerProxy objectPointerProxy; + private PointerCursor objectCursor; [SerializeField] [ToggleLeft] private bool useDPI = true; [SerializeField] - private float pointerSize = 1f; + private float cursorSize = 1f; private RectTransform rect; - private ObjectPool mousePool; - private ObjectPool touchPool; - private ObjectPool penPool; - private ObjectPool objectPool; - private Dictionary proxies = new Dictionary(10); + private ObjectPool mousePool; + private ObjectPool touchPool; + private ObjectPool penPool; + private ObjectPool objectPool; + private Dictionary cursors = new Dictionary(10); #endregion @@ -105,15 +105,15 @@ public float PointerSize private void Awake() { - mousePool = new ObjectPool(2, instantiateMouseProxy, null, clearProxy); - touchPool = new ObjectPool(10, instantiateTouchProxy, null, clearProxy); - penPool = new ObjectPool(2, instantiatePenProxy, null, clearProxy); - objectPool = new ObjectPool(2, instantiateObjectProxy, null, clearProxy); + mousePool = new ObjectPool(2, instantiateMouseProxy, null, clearProxy); + touchPool = new ObjectPool(10, instantiateTouchProxy, null, clearProxy); + penPool = new ObjectPool(2, instantiatePenProxy, null, clearProxy); + objectPool = new ObjectPool(2, instantiateObjectProxy, null, clearProxy); rect = transform as RectTransform; if (rect == null) { - Debug.LogError("PointerVisualizer must be on an UI element!"); + Debug.LogError("CursorManager must be on an UI element!"); enabled = false; } } @@ -148,34 +148,34 @@ private void OnDisable() #region Private functions - private PointerProxy instantiateMouseProxy() + private PointerCursor instantiateMouseProxy() { - return Instantiate(mousePointerProxy); + return Instantiate(mouseCursor); } - private PointerProxy instantiateTouchProxy() + private PointerCursor instantiateTouchProxy() { - return Instantiate(touchPointerProxy); + return Instantiate(touchCursor); } - private PointerProxy instantiatePenProxy() + private PointerCursor instantiatePenProxy() { - return Instantiate(penPointerProxy); + return Instantiate(penCursor); } - private PointerProxy instantiateObjectProxy() + private PointerCursor instantiateObjectProxy() { - return Instantiate(objectPointerProxy); + return Instantiate(objectCursor); } - private void clearProxy(PointerProxy proxy) + private void clearProxy(PointerCursor cursor) { - proxy.Hide(); + cursor.Hide(); } private uint getPointerSize() { - if (useDPI) return (uint) (pointerSize * TouchManager.Instance.DotsPerCentimeter); + if (useDPI) return (uint) (cursorSize * TouchManager.Instance.DotsPerCentimeter); return 0; } @@ -189,28 +189,28 @@ private void pointersAddedHandler(object sender, PointerEventArgs e) for (var i = 0; i < count; i++) { var pointer = e.Pointers[i]; - PointerProxy proxy; + PointerCursor cursor; switch (pointer.Type) { case Pointer.PointerType.Mouse: - proxy = mousePool.Get(); + cursor = mousePool.Get(); break; case Pointer.PointerType.Touch: - proxy = touchPool.Get(); + cursor = touchPool.Get(); break; case Pointer.PointerType.Pen: - proxy = penPool.Get(); + cursor = penPool.Get(); break; case Pointer.PointerType.Object: - proxy = objectPool.Get(); + cursor = objectPool.Get(); break; default: continue; } - proxy.Size = getPointerSize(); - proxy.Init(rect, pointer); - proxies.Add(pointer.Id, proxy); + cursor.Size = getPointerSize(); + cursor.Init(rect, pointer); + cursors.Add(pointer.Id, cursor); } } @@ -220,23 +220,23 @@ private void pointersRemovedHandler(object sender, PointerEventArgs e) for (var i = 0; i < count; i++) { var pointer = e.Pointers[i]; - PointerProxy proxy; - if (!proxies.TryGetValue(pointer.Id, out proxy)) continue; - proxies.Remove(pointer.Id); + PointerCursor cursor; + if (!cursors.TryGetValue(pointer.Id, out cursor)) continue; + cursors.Remove(pointer.Id); switch (pointer.Type) { case Pointer.PointerType.Mouse: - mousePool.Release(proxy); + mousePool.Release(cursor); break; case Pointer.PointerType.Touch: - touchPool.Release(proxy); + touchPool.Release(cursor); break; case Pointer.PointerType.Pen: - penPool.Release(proxy); + penPool.Release(cursor); break; case Pointer.PointerType.Object: - objectPool.Release(proxy); + objectPool.Release(cursor); break; } } @@ -248,9 +248,9 @@ private void pointersPressedHandler(object sender, PointerEventArgs e) for (var i = 0; i < count; i++) { var pointer = e.Pointers[i]; - PointerProxy proxy; - if (!proxies.TryGetValue(pointer.Id, out proxy)) continue; - proxy.SetState(pointer, PointerProxy.ProxyState.Pressed); + PointerCursor cursor; + if (!cursors.TryGetValue(pointer.Id, out cursor)) continue; + cursor.SetState(pointer, PointerCursor.ProxyState.Pressed); } } @@ -260,9 +260,9 @@ private void PointersUpdatedHandler(object sender, PointerEventArgs e) for (var i = 0; i < count; i++) { var pointer = e.Pointers[i]; - PointerProxy proxy; - if (!proxies.TryGetValue(pointer.Id, out proxy)) continue; - proxy.UpdatePointer(pointer); + PointerCursor cursor; + if (!cursors.TryGetValue(pointer.Id, out cursor)) continue; + cursor.UpdatePointer(pointer); } } @@ -272,9 +272,9 @@ private void pointersReleasedHandler(object sender, PointerEventArgs e) for (var i = 0; i < count; i++) { var pointer = e.Pointers[i]; - PointerProxy proxy; - if (!proxies.TryGetValue(pointer.Id, out proxy)) continue; - proxy.SetState(pointer, PointerProxy.ProxyState.Released); + PointerCursor cursor; + if (!cursors.TryGetValue(pointer.Id, out cursor)) continue; + cursor.SetState(pointer, PointerCursor.ProxyState.Released); } } diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs.meta b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs.meta rename to Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/MousePointerProxy.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/MouseCursor.cs similarity index 94% rename from Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/MousePointerProxy.cs rename to Source/Assets/TouchScript/Scripts/Behaviors/Cursors/MouseCursor.cs index e29bc55e8..cea422561 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/MousePointerProxy.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/MouseCursor.cs @@ -7,9 +7,9 @@ using TouchScript.Utils; using UnityEngine; -namespace TouchScript.Behaviors.Visualizer +namespace TouchScript.Behaviors.Cursors { - public class MousePointerProxy : TextPointerProxy + public class MouseCursor : TextPointerCursor { #region Public properties diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/MousePointerProxy.cs.meta b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/MouseCursor.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/MousePointerProxy.cs.meta rename to Source/Assets/TouchScript/Scripts/Behaviors/Cursors/MouseCursor.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/ObjectPointerProxy.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/ObjectCursor.cs similarity index 93% rename from Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/ObjectPointerProxy.cs rename to Source/Assets/TouchScript/Scripts/Behaviors/Cursors/ObjectCursor.cs index 7334abad5..65038732f 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/ObjectPointerProxy.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/ObjectCursor.cs @@ -5,9 +5,9 @@ using System.Text; using TouchScript.Pointers; -namespace TouchScript.Behaviors.Visualizer +namespace TouchScript.Behaviors.Cursors { - public class ObjectPointerProxy : TextPointerProxy + public class ObjectCursor : TextPointerCursor { #region Public properties diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/ObjectPointerProxy.cs.meta b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/ObjectCursor.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/ObjectPointerProxy.cs.meta rename to Source/Assets/TouchScript/Scripts/Behaviors/Cursors/ObjectCursor.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PenPointerProxy.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PenCursor.cs similarity index 96% rename from Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PenPointerProxy.cs rename to Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PenCursor.cs index 0845af809..34854c3e1 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PenPointerProxy.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PenCursor.cs @@ -7,9 +7,9 @@ using TouchScript.Utils; using UnityEngine; -namespace TouchScript.Behaviors.Visualizer +namespace TouchScript.Behaviors.Cursors { - public class PenPointerProxy : TextPointerProxy + public class PenCursor : TextPointerCursor { #region Public properties diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PenPointerProxy.cs.meta b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PenCursor.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PenPointerProxy.cs.meta rename to Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PenCursor.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PointerCursor.cs similarity index 96% rename from Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs rename to Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PointerCursor.cs index a7bc6a65b..b74632485 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PointerCursor.cs @@ -8,13 +8,13 @@ using UnityEngine; using UnityEngine.UI; -namespace TouchScript.Behaviors.Visualizer +namespace TouchScript.Behaviors.Cursors { /// /// Visual cursor implementation used by TouchScript. /// [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Behaviors_Visualizer_TouchProxy.htm")] - public abstract class TextPointerProxy : PointerProxy where T : IPointer + public abstract class TextPointerCursor : PointerCursor where T : IPointer { #region Public properties @@ -110,7 +110,7 @@ protected sealed override uint getPointerHash(IPointer pointer) /// /// Base class for cursors. /// - public class PointerProxy : MonoBehaviour + public class PointerCursor : MonoBehaviour { #region Consts @@ -230,7 +230,7 @@ private void Awake() rect = transform as RectTransform; if (rect == null) { - Debug.LogError("PointerProxy must be on an UI element!"); + Debug.LogError("PointerCursor must be on an UI element!"); enabled = false; return; } diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs.meta b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PointerCursor.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs.meta rename to Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PointerCursor.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/TouchPointerProxy.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/TouchCursor.cs similarity index 92% rename from Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/TouchPointerProxy.cs rename to Source/Assets/TouchScript/Scripts/Behaviors/Cursors/TouchCursor.cs index 2d6f02355..fb5bf4223 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/TouchPointerProxy.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/TouchCursor.cs @@ -5,9 +5,9 @@ using System.Text; using TouchScript.Pointers; -namespace TouchScript.Behaviors.Visualizer +namespace TouchScript.Behaviors.Cursors { - public class TouchPointerProxy : TextPointerProxy + public class TouchCursor : TextPointerCursor { #region Public properties diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/TouchPointerProxy.cs.meta b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/TouchCursor.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/TouchPointerProxy.cs.meta rename to Source/Assets/TouchScript/Scripts/Behaviors/Cursors/TouchCursor.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI.meta b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI.meta new file mode 100644 index 000000000..20a9f09b9 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e004f1e8c67a2194bbd272848892c468 +folderAsset: yes +timeCreated: 1500212489 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI/GradientTexture.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI/GradientTexture.cs new file mode 100644 index 000000000..635177054 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI/GradientTexture.cs @@ -0,0 +1,85 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.UI; + +namespace TouchScript.Behaviors.Cursors.UI +{ + public class GradientTexture : MonoBehaviour + { + + public enum Res + { + Pix16 = 16, + Pix32 = 32, + Pix64 = 64, + Pix128 = 128, + Pix256 = 256, + Pix512 = 512 + } + + public Gradient Gradient = new Gradient(); + public string Name = "Gradient"; + public Res Resolution = Res.Pix128; + + private Texture2D texture; + + private static Dictionary textureCache = new Dictionary(); + + public Texture2D Generate() + { + var res = (int) Resolution; + var tex = new Texture2D(res, 1, TextureFormat.ARGB32, false, true); + tex.name = Name; + tex.filterMode = FilterMode.Bilinear; + tex.wrapMode = TextureWrapMode.Clamp; + + Color[] colors = new Color[res]; + float div = res; + for (var i = 0; i < res; i++) + { + float t = i / div; + colors[i] = Gradient.Evaluate(t); + } + tex.SetPixels(colors); + tex.Apply(false, true); + + return tex; + } + + private void Start() + { + var hash = Name.GetHashCode(); + if (!textureCache.TryGetValue(hash, out texture)) + { + texture = Generate(); + textureCache.Add(hash, texture); + } + apply(); + } + + private void OnValidate() + { + refresh(); + } + + private void refresh() + { + if (texture != null) + DestroyImmediate(texture); + texture = Generate(); + apply(); + } + + private void apply() + { + var r = GetComponent(); + if (r == null) throw new Exception("GradientTexture must be on an UI element with RawImage component."); + r.texture = texture; + } + } +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI/GradientTexture.cs.meta b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI/GradientTexture.cs.meta new file mode 100644 index 000000000..35ce4ef3c --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI/GradientTexture.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d78b78253cc71a64ca6bf0978d7ac99e +timeCreated: 1500212518 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/UI.meta b/Source/Assets/TouchScript/Scripts/Behaviors/UI.meta new file mode 100644 index 000000000..39f8490be --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Behaviors/UI.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: fb6db513e55511045b8e5bf15efdb30d +folderAsset: yes +timeCreated: 1500209323 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/OverHelper.cs b/Source/Assets/TouchScript/Scripts/Behaviors/UI/OverHelper.cs similarity index 99% rename from Source/Assets/TouchScript/Scripts/Behaviors/OverHelper.cs rename to Source/Assets/TouchScript/Scripts/Behaviors/UI/OverHelper.cs index 8513f2553..b51108af1 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/OverHelper.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/UI/OverHelper.cs @@ -8,7 +8,7 @@ using TouchScript.Utils; using UnityEngine; -namespace TouchScript.Behaviors +namespace TouchScript.Behaviors.UI { /// diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/OverHelper.cs.meta b/Source/Assets/TouchScript/Scripts/Behaviors/UI/OverHelper.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/Behaviors/OverHelper.cs.meta rename to Source/Assets/TouchScript/Scripts/Behaviors/UI/OverHelper.cs.meta diff --git a/Source/Assets/TouchScript/Shaders/Cursor.shader b/Source/Assets/TouchScript/Shaders/Cursor.shader new file mode 100644 index 000000000..58696ce7e --- /dev/null +++ b/Source/Assets/TouchScript/Shaders/Cursor.shader @@ -0,0 +1,51 @@ +Shader "TouchScript/Cursor" +{ + Properties + { + _MainTex ("Texture", 2D) = "white" {} + } + SubShader + { + Tags { "Queue"="Transparent" "RenderType" = "Transparent" } + Blend SrcAlpha OneMinusSrcAlpha + + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + struct appdata + { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + }; + + struct v2f + { + float2 uv : TEXCOORD0; + float4 vertex : SV_POSITION; + }; + + sampler2D _MainTex; + + v2f vert (appdata v) + { + v2f o; + o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); + o.uv = v.uv; + return o; + } + + fixed4 frag (v2f i) : SV_Target + { + float2 uv = float2(length(i.uv - float2(.5, .5)) * 2, 0.5); + fixed4 col = tex2D(_MainTex, uv); + return col; + } + ENDCG + } + } +} diff --git a/Source/Assets/TouchScript/Shaders/Cursor.shader.meta b/Source/Assets/TouchScript/Shaders/Cursor.shader.meta new file mode 100644 index 000000000..768cb5d3e --- /dev/null +++ b/Source/Assets/TouchScript/Shaders/Cursor.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2af36406130024644b499213db069f78 +timeCreated: 1500210432 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Textures.meta b/Source/Assets/TouchScript/Textures.meta deleted file mode 100644 index d1da8e99d..000000000 --- a/Source/Assets/TouchScript/Textures.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 70849dd78e6c598468ae02cc30525a37 diff --git a/Source/Assets/TouchScript/Textures/Touch.png b/Source/Assets/TouchScript/Textures/Touch.png deleted file mode 100644 index da8ee91606ace33077dfe4167a33f824ec7bd04b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7544 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 SDWf*3z#CarnMx_M5B~w%osXpe diff --git a/Source/Assets/TouchScript/Textures/Touch.png.meta b/Source/Assets/TouchScript/Textures/Touch.png.meta deleted file mode 100644 index 34912225d..000000000 --- a/Source/Assets/TouchScript/Textures/Touch.png.meta +++ /dev/null @@ -1,54 +0,0 @@ -fileFormatVersion: 2 -guid: f5c75ed8c6bed0f489d9003aa739aff7 -TextureImporter: - fileIDToRecycleName: {} - serializedVersion: 2 - mipmaps: - mipMapMode: 0 - enableMipMap: 1 - linearTexture: 0 - correctGamma: 0 - fadeOut: 0 - borderMipMap: 0 - mipMapFadeDistanceStart: 1 - mipMapFadeDistanceEnd: 3 - bumpmap: - convertToNormalMap: 0 - externalNormalMap: 0 - heightScale: .25 - normalMapFilter: 0 - isReadable: 0 - grayScaleToAlpha: 0 - generateCubemap: 0 - cubemapConvolution: 0 - cubemapConvolutionSteps: 8 - cubemapConvolutionExponent: 1.5 - seamlessCubemap: 0 - textureFormat: -2 - maxTextureSize: 1024 - textureSettings: - filterMode: 1 - aniso: 0 - mipBias: -1 - wrapMode: 1 - nPOTScale: 0 - lightmap: 0 - rGBM: 0 - compressionQuality: 50 - allowsAlphaSplitting: 0 - spriteMode: 1 - spriteExtrude: 1 - spriteMeshType: 1 - alignment: 0 - spritePivot: {x: .5, y: .5} - spriteBorder: {x: 0, y: 0, z: 0, w: 0} - spritePixelsToUnits: 100 - alphaIsTransparency: 1 - textureType: 5 - buildTargetSettings: [] - spriteSheet: - sprites: [] - spritePackingTag: - userData: - assetBundleName: - assetBundleVariant: From ce8c83adecbd1f4005624da659aa49f97b9e6032 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 18 Jul 2017 19:58:32 +0300 Subject: [PATCH 06/58] Text on cursors is disabled by default. --- .../TouchScript/Prefabs/Cursors/Mouse Cursor.prefab | 10 ++-------- .../TouchScript/Prefabs/Cursors/Pen Cursor.prefab | 10 ++-------- .../TouchScript/Prefabs/Cursors/Touch Cursor.prefab | 10 ++-------- .../Scripts/Behaviors/Cursors/PointerCursor.cs | 5 ++++- 4 files changed, 10 insertions(+), 25 deletions(-) diff --git a/Source/Assets/TouchScript/Prefabs/Cursors/Mouse Cursor.prefab b/Source/Assets/TouchScript/Prefabs/Cursors/Mouse Cursor.prefab index 4375a8385..39f2a3ed6 100644 --- a/Source/Assets/TouchScript/Prefabs/Cursors/Mouse Cursor.prefab +++ b/Source/Assets/TouchScript/Prefabs/Cursors/Mouse Cursor.prefab @@ -17,7 +17,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!1 &183852 GameObject: m_ObjectHideFlags: 0 @@ -102,13 +102,7 @@ MonoBehaviour: m_HorizontalOverflow: 1 m_VerticalOverflow: 0 m_LineSpacing: 1 - m_Text: '1 - - 2 - - 3 - - 4' + m_Text: --- !u!114 &11416202 MonoBehaviour: m_ObjectHideFlags: 1 diff --git a/Source/Assets/TouchScript/Prefabs/Cursors/Pen Cursor.prefab b/Source/Assets/TouchScript/Prefabs/Cursors/Pen Cursor.prefab index c9cc2cc4e..bc58eddfe 100644 --- a/Source/Assets/TouchScript/Prefabs/Cursors/Pen Cursor.prefab +++ b/Source/Assets/TouchScript/Prefabs/Cursors/Pen Cursor.prefab @@ -17,7 +17,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!1 &118164 GameObject: m_ObjectHideFlags: 0 @@ -198,13 +198,7 @@ MonoBehaviour: m_HorizontalOverflow: 1 m_VerticalOverflow: 0 m_LineSpacing: 1 - m_Text: '1 - - 2 - - 3 - - 4' + m_Text: --- !u!114 &11469244 MonoBehaviour: m_ObjectHideFlags: 1 diff --git a/Source/Assets/TouchScript/Prefabs/Cursors/Touch Cursor.prefab b/Source/Assets/TouchScript/Prefabs/Cursors/Touch Cursor.prefab index 458085dc3..24c1dbe37 100644 --- a/Source/Assets/TouchScript/Prefabs/Cursors/Touch Cursor.prefab +++ b/Source/Assets/TouchScript/Prefabs/Cursors/Touch Cursor.prefab @@ -17,7 +17,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!1 &183852 GameObject: m_ObjectHideFlags: 0 @@ -84,13 +84,7 @@ MonoBehaviour: m_HorizontalOverflow: 1 m_VerticalOverflow: 0 m_LineSpacing: 1 - m_Text: '1 - - 2 - - 3 - - 4' + m_Text: --- !u!114 &11433328 MonoBehaviour: m_ObjectHideFlags: 1 diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PointerCursor.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PointerCursor.cs index b74632485..647dd07f9 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PointerCursor.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PointerCursor.cs @@ -54,18 +54,21 @@ protected override void updateOnce(IPointer pointer) { base.updateOnce(pointer); +#if UNITY_EDITOR stringBuilder.Length = 0; stringBuilder.Append("Pointer id: "); stringBuilder.Append(pointer.Id); gameObject.name = stringBuilder.ToString(); +#endif if (Text == null) return; if (!shouldShowText()) { - Text.text = ""; + Text.enabled = false; return; } + Text.enabled = true; stringBuilder.Length = 0; generateText((T) pointer, stringBuilder); From 020df5cdc6b7f9d8202c10345b246a81656cb8fe Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 18 Jul 2017 19:58:55 +0300 Subject: [PATCH 07/58] Fixed TUIO for the last refactoring. --- .../TUIO/Scripts/InputSources/TuioInput.cs | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs b/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs index 780f02620..f40eb3b36 100644 --- a/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs +++ b/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs @@ -13,7 +13,7 @@ using TUIOsharp.Entities; using UnityEngine; -namespace TouchScript.InputSources +namespace TouchScript.InputSources { /// /// Processes TUIO 1.1 input. @@ -108,8 +108,8 @@ public InputType SupportedInputs public TuioInput() { - touchPool = new ObjectPool(20, () => new TouchPointer(this), null, (t) => t.INTERNAL_Reset()); - objectPool = new ObjectPool(10, () => new ObjectPointer(this), null, (t) => t.INTERNAL_Reset()); + touchPool = new ObjectPool(20, () => new TouchPointer(this), null, resetPointer); + objectPool = new ObjectPool(10, () => new ObjectPointer(this), null, resetPointer); } #endregion @@ -117,11 +117,14 @@ public TuioInput() #region Public methods /// - public override void UpdateInput() + public override bool UpdateInput() { - base.UpdateInput(); + if (base.UpdateInput()) return true; + screenWidth = Screen.width; screenHeight = Screen.height; + + return true; } /// @@ -217,7 +220,8 @@ public override void INTERNAL_DiscardPointer(Pointer pointer) if (pointer.Type == Pointer.PointerType.Touch) { touchPool.Release(pointer as TouchPointer); - } else if (pointer.Type == Pointer.PointerType.Object) + } + else if (pointer.Type == Pointer.PointerType.Object) { objectPool.Release(pointer as ObjectPointer); } @@ -358,6 +362,11 @@ private void updateObjectProperties(ObjectPointer obj, TuioObject target) obj.Angle = target.Angle; } + private void resetPointer(Pointer p) + { + p.INTERNAL_Reset(); + } + #endregion #region Event handlers @@ -493,8 +502,7 @@ private void OnObjectRemoved(object sender, TuioObjectEventArgs e) #endregion } - } #endif - #endif \ No newline at end of file +#endif \ No newline at end of file From 68d9bbcb18eedfc384364059c82817a3f260d93d Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 18 Jul 2017 22:14:53 +0300 Subject: [PATCH 08/58] - Fixed cursor z sorting. - Turned off default mouse cursor. - Added FLAG_INTERNAL flag to mark touches which should not be shown. - Added cursor size in pixels to pointer visualizer. - Moved TouchManager prefab to Prefabs. Updated scenes with the new prefab. --- .../Visualizer/CursorManagerEditor.cs | 40 ++-- .../TouchScript/Examples/Camera/Camera.unity | 43 +---- .../Examples/Checkers/Checkers.unity | 59 +++--- .../TouchScript/Examples/Colors/Colors.unity | 45 +---- .../TouchScript/Examples/Cube/Cube.unity | 76 ++++---- .../Examples/Cube/Scripts/RedirectInput.cs | 2 +- .../Examples/Multiuser/Multiuser.unity | 180 ++++++++++++++---- .../TouchScript/Examples/Photos/Photos.unity | 45 +---- .../TouchScript/Examples/Portal/Portal.unity | 37 +--- .../Examples/RawInput/RawInput.unity | 36 +--- .../TouchScript/Examples/Taps/Taps.unity | 49 +---- .../Assets/TouchScript/Examples/_prefabs.meta | 5 - .../Prefabs/Cursors/Mouse Cursor.prefab | 8 +- .../Prefabs/Cursors/Pen Cursor.prefab | 2 +- .../Prefabs/Cursors/Touch Cursor.prefab | 2 +- .../TouchManager.prefab} | 24 ++- .../TouchManager.prefab.meta} | 0 .../Behaviors/Cursors/CursorManager.cs | 37 +++- .../Scripts/Behaviors/Visualizer.meta | 9 + .../TouchScript/Scripts/Pointers/Pointer.cs | 2 + .../Assets/TouchScript/Shaders/Cursor.shader | 1 + 21 files changed, 338 insertions(+), 364 deletions(-) delete mode 100644 Source/Assets/TouchScript/Examples/_prefabs.meta rename Source/Assets/TouchScript/{Examples/_prefabs/TouchScript.prefab => Prefabs/TouchManager.prefab} (84%) rename Source/Assets/TouchScript/{Examples/_prefabs/TouchScript.prefab.meta => Prefabs/TouchManager.prefab.meta} (100%) create mode 100644 Source/Assets/TouchScript/Scripts/Behaviors/Visualizer.meta diff --git a/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/CursorManagerEditor.cs b/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/CursorManagerEditor.cs index 4a601e715..d1f31d181 100644 --- a/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/CursorManagerEditor.cs +++ b/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/CursorManagerEditor.cs @@ -17,9 +17,10 @@ internal sealed class CursorManagerEditor : UnityEditor.Editor public static readonly GUIContent TEXT_DPI_HEADER = new GUIContent("Use DPI", "Scale touch pointer based on DPI."); public static readonly GUIContent TEXT_ADVANCED_HEADER = new GUIContent("Advanced", "Advanced settings."); public static readonly GUIContent TEXT_POINTER_SIZE = new GUIContent("Pointer size (cm)", "Pointer size in cm based on current DPI."); + public static readonly GUIContent TEXT_POINTER_PIXEL_SIZE = new GUIContent("Pointer size (px)", "Pointer size in pixels."); private SerializedProperty mousePointerProxy, touchPointerProxy, penPointerProxy, objectPointerProxy; - private SerializedProperty useDPI, touchSize; + private SerializedProperty useDPI, cursorSize, cursorPixelSize; private SerializedProperty advancedProps; private void OnEnable() @@ -30,9 +31,10 @@ private void OnEnable() objectPointerProxy = serializedObject.FindProperty("objectCursor"); useDPI = serializedObject.FindProperty("useDPI"); - touchSize = serializedObject.FindProperty("cursorSize"); + cursorSize = serializedObject.FindProperty("cursorSize"); + cursorPixelSize = serializedObject.FindProperty("cursorPixelSize"); - advancedProps = serializedObject.FindProperty("advancedProps"); + advancedProps = serializedObject.FindProperty("advancedProps"); } public override void OnInspectorGUI() @@ -41,18 +43,28 @@ public override void OnInspectorGUI() GUILayout.Space(5); - var display = GUIElements.Header(TEXT_DPI_HEADER, useDPI, useDPI); - if (display) - { - EditorGUI.indentLevel++; - using (new EditorGUI.DisabledGroupScope(!useDPI.boolValue)) - { - EditorGUILayout.PropertyField(touchSize, TEXT_POINTER_SIZE); - } - EditorGUI.indentLevel--; - } + // var display = GUIElements.Header(TEXT_DPI_HEADER, useDPI, useDPI); + // if (display) + // { + // EditorGUI.indentLevel++; + // using (new EditorGUI.DisabledGroupScope(!useDPI.boolValue)) + // { + // EditorGUILayout.PropertyField(useDPI, TEXT_DPI_HEADER); + // } + // EditorGUI.indentLevel--; + // } + + EditorGUILayout.PropertyField(useDPI, TEXT_DPI_HEADER); + if (useDPI.boolValue) + { + EditorGUILayout.PropertyField(cursorSize, TEXT_POINTER_SIZE); + } + else + { + EditorGUILayout.PropertyField(cursorPixelSize, TEXT_POINTER_PIXEL_SIZE); + } - display = GUIElements.Header(TEXT_ADVANCED_HEADER, advancedProps); + var display = GUIElements.Header(TEXT_ADVANCED_HEADER, advancedProps); if (display) { EditorGUI.indentLevel++; diff --git a/Source/Assets/TouchScript/Examples/Camera/Camera.unity b/Source/Assets/TouchScript/Examples/Camera/Camera.unity index 9e3d40a05..bb3a51a2f 100644 --- a/Source/Assets/TouchScript/Examples/Camera/Camera.unity +++ b/Source/Assets/TouchScript/Examples/Camera/Camera.unity @@ -352,31 +352,6 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &327566704 stripped -GameObject: - m_PrefabParentObject: {fileID: 100002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - m_PrefabInternal: {fileID: 572399281} ---- !u!114 &327566705 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 327566704} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e276ccba4f7314d9988af19f9b3a611b, type: 3} - m_Name: - m_EditorClassIdentifier: - advancedProps: 0 - generalProps: 0 - windowsProps: 0 - windows8API: 0 - windows7API: 0 - webGLTouch: 1 - windows8Mouse: 1 - windows7Mouse: 1 - universalWindowsMouse: 1 - emulateSecondMousePointer: 1 --- !u!1 &567050689 GameObject: m_ObjectHideFlags: 0 @@ -477,10 +452,6 @@ Prefab: m_Modification: m_TransformParent: {fileID: 0} m_Modifications: - - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - propertyPath: layers.Array.size - value: 1 - objectReference: {fileID: 0} - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: m_LocalPosition.x value: 0 @@ -511,24 +482,12 @@ Prefab: objectReference: {fileID: 0} - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: m_RootOrder - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: layers.Array.data[0] value: objectReference: {fileID: 930800605} - - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - propertyPath: m_Enabled - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 100002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - propertyPath: m_IsActive - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - propertyPath: layers.Array.data[1] - value: - objectReference: {fileID: 0} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} m_IsPrefabParent: 0 diff --git a/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity b/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity index 1e476ecba..99973bc75 100644 --- a/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity +++ b/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity @@ -185,6 +185,7 @@ MonoBehaviour: m_EditorClassIdentifier: Name: Camera advancedProps: 0 + hitProps: 0 hit3DObjects: 1 hit2DObjects: 0 hitWorldSpaceUI: 0 @@ -452,10 +453,6 @@ Prefab: m_Modification: m_TransformParent: {fileID: 0} m_Modifications: - - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - propertyPath: layers.Array.size - value: 1 - objectReference: {fileID: 0} - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: m_LocalPosition.x value: 0 @@ -488,37 +485,9 @@ Prefab: propertyPath: layers.Array.data[0] value: objectReference: {fileID: 62216953} - - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - propertyPath: m_Enabled - value: 1 - objectReference: {fileID: 0} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} m_IsPrefabParent: 0 ---- !u!1 &543251037 stripped -GameObject: - m_PrefabParentObject: {fileID: 100002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - m_PrefabInternal: {fileID: 543251036} ---- !u!114 &543251038 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 543251037} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e276ccba4f7314d9988af19f9b3a611b, type: 3} - m_Name: - m_EditorClassIdentifier: - advancedProps: 0 - windows8API: 0 - windows7API: 0 - webPlayerTouch: 1 - webGLTouch: 1 - windows8Mouse: 1 - windows7Mouse: 1 - universalWindowsMouse: 1 - emulateSecondMousePointer: 1 --- !u!1001 &556842199 Prefab: m_ObjectHideFlags: 0 @@ -2598,7 +2567,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 38e07bff8743d4ee38bf724a7a2b4cbb, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 1 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -2607,10 +2582,28 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnTransformStart: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransform: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransformComplete: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null type: 2 screenTransformThreshold: 0.1 + projectionProps: 0 projection: 2 projectionPlaneNormal: {x: 0, y: 1, z: 0} --- !u!114 &2027571737 diff --git a/Source/Assets/TouchScript/Examples/Colors/Colors.unity b/Source/Assets/TouchScript/Examples/Colors/Colors.unity index 7c3e45486..ac905627a 100644 --- a/Source/Assets/TouchScript/Examples/Colors/Colors.unity +++ b/Source/Assets/TouchScript/Examples/Colors/Colors.unity @@ -131,6 +131,7 @@ MonoBehaviour: m_EditorClassIdentifier: Name: Camera advancedProps: 0 + hitProps: 0 hit3DObjects: 0 hit2DObjects: 1 hitWorldSpaceUI: 0 @@ -285,10 +286,6 @@ Prefab: m_Modification: m_TransformParent: {fileID: 0} m_Modifications: - - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - propertyPath: layers.Array.size - value: 1 - objectReference: {fileID: 0} - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: m_LocalPosition.x value: 0 @@ -317,49 +314,17 @@ Prefab: propertyPath: m_LocalRotation.w value: 1 objectReference: {fileID: 0} + - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: layers.Array.data[0] value: objectReference: {fileID: 62216953} - - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - propertyPath: layers.Array.data[1] - value: - objectReference: {fileID: 0} - - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - propertyPath: layers.Array.data[2] - value: - objectReference: {fileID: 0} - - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - propertyPath: m_Enabled - value: 1 - objectReference: {fileID: 0} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} m_IsPrefabParent: 0 ---- !u!1 &543251037 stripped -GameObject: - m_PrefabParentObject: {fileID: 100002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - m_PrefabInternal: {fileID: 543251036} ---- !u!114 &543251038 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 543251037} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e276ccba4f7314d9988af19f9b3a611b, type: 3} - m_Name: - m_EditorClassIdentifier: - advancedProps: 0 - windows8API: 0 - windows7API: 0 - webPlayerTouch: 1 - webGLTouch: 1 - windows8Mouse: 1 - windows7Mouse: 1 - universalWindowsMouse: 1 - emulateSecondMousePointer: 1 --- !u!1 &602940322 GameObject: m_ObjectHideFlags: 0 diff --git a/Source/Assets/TouchScript/Examples/Cube/Cube.unity b/Source/Assets/TouchScript/Examples/Cube/Cube.unity index 0e64d6a14..d2e80c837 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Cube.unity +++ b/Source/Assets/TouchScript/Examples/Cube/Cube.unity @@ -131,6 +131,7 @@ MonoBehaviour: m_EditorClassIdentifier: Name: Camera advancedProps: 0 + hitProps: 0 hit3DObjects: 1 hit2DObjects: 0 hitWorldSpaceUI: 0 @@ -346,42 +347,14 @@ Prefab: - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: layers.Array.data[0] value: - objectReference: {fileID: 1459600544} + objectReference: {fileID: 62216953} - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: layers.Array.data[1] value: - objectReference: {fileID: 62216953} - - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - propertyPath: m_Enabled - value: 1 - objectReference: {fileID: 0} + objectReference: {fileID: 1459600544} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} m_IsPrefabParent: 0 ---- !u!1 &543251037 stripped -GameObject: - m_PrefabParentObject: {fileID: 100002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - m_PrefabInternal: {fileID: 543251036} ---- !u!114 &543251038 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 543251037} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e276ccba4f7314d9988af19f9b3a611b, type: 3} - m_Name: - m_EditorClassIdentifier: - advancedProps: 0 - windows8API: 0 - windows7API: 0 - webPlayerTouch: 1 - webGLTouch: 1 - windows8Mouse: 1 - windows7Mouse: 1 - universalWindowsMouse: 1 - emulateSecondMousePointer: 1 --- !u!1 &732284827 GameObject: m_ObjectHideFlags: 0 @@ -765,6 +738,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 978a486d8ecf8437cbb87e8534908895, type: 3} m_Name: m_EditorClassIdentifier: + enableSmoothing: 0 + smoothingFactor: 0.00001 + positionThreshold: 0.0001 + rotationThreshold: 0.01 + scaleThreshold: 0.0001 + allowChangingFromOutside: 0 --- !u!114 &963048129 MonoBehaviour: m_ObjectHideFlags: 0 @@ -776,7 +755,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -785,11 +770,29 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnTransformStart: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransform: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransformComplete: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null type: 7 screenTransformThreshold: 0.1 minScreenPointsDistance: 0.5 + projectionProps: 0 projection: 0 projectionPlaneNormal: {x: 0, y: 0, z: 1} --- !u!1 &1138005899 @@ -993,6 +996,7 @@ MonoBehaviour: m_EditorClassIdentifier: Name: RenderTexture Camera advancedProps: 0 + hitProps: 0 hit3DObjects: 1 hit2DObjects: 0 hitWorldSpaceUI: 0 @@ -1307,7 +1311,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 3fd90a8856e1a49eba25728d5aaac9f2, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1316,6 +1326,8 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] --- !u!23 &1880100170 diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs index 35628311b..54090315c 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs @@ -81,7 +81,7 @@ private void pointerPressedHandler(object sender, MetaGestureEventArgs metaGestu var newPointer = PointerFactory.Create(pointer.Type, this); newPointer.CopyFrom(pointer); newPointer.Position = processCoords(pointer.GetPressData().RaycastHit.textureCoord); - newPointer.Flags = pointer.Flags | Pointer.FLAG_ARTIFICIAL; + newPointer.Flags = pointer.Flags | Pointer.FLAG_ARTIFICIAL | Pointer.FLAG_INTERNAL; addPointer(newPointer); pressPointer(newPointer); map.Add(pointer.Id, newPointer); diff --git a/Source/Assets/TouchScript/Examples/Multiuser/Multiuser.unity b/Source/Assets/TouchScript/Examples/Multiuser/Multiuser.unity index be61f342d..a208c35ad 100644 --- a/Source/Assets/TouchScript/Examples/Multiuser/Multiuser.unity +++ b/Source/Assets/TouchScript/Examples/Multiuser/Multiuser.unity @@ -728,7 +728,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 7a878a6ff128243dfb1d89ca0273f059, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -737,8 +743,15 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnTap: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null numberOfTapsRequired: 1 timeLimit: Infinity distanceLimit: Infinity @@ -939,7 +952,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 7a878a6ff128243dfb1d89ca0273f059, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -948,8 +967,15 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnTap: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null numberOfTapsRequired: 1 timeLimit: Infinity distanceLimit: Infinity @@ -1074,37 +1100,9 @@ Prefab: propertyPath: layers.Array.data[4] value: objectReference: {fileID: 2041906757} - - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - propertyPath: m_Enabled - value: 1 - objectReference: {fileID: 0} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} m_IsPrefabParent: 0 ---- !u!1 &543251037 stripped -GameObject: - m_PrefabParentObject: {fileID: 100002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - m_PrefabInternal: {fileID: 543251036} ---- !u!114 &543251038 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 543251037} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e276ccba4f7314d9988af19f9b3a611b, type: 3} - m_Name: - m_EditorClassIdentifier: - advancedProps: 0 - windows8API: 0 - windows7API: 0 - webPlayerTouch: 1 - webGLTouch: 1 - windows8Mouse: 1 - windows7Mouse: 1 - universalWindowsMouse: 1 - emulateSecondMousePointer: 1 --- !u!1001 &583512110 Prefab: m_ObjectHideFlags: 0 @@ -1394,7 +1392,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1403,11 +1407,29 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnTransformStart: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransform: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransformComplete: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null type: 1 screenTransformThreshold: 0.1 minScreenPointsDistance: 0.5 + projectionProps: 0 projection: 0 projectionPlaneNormal: {x: 0, y: 0, z: 1} --- !u!4 &739470077 stripped @@ -1670,6 +1692,7 @@ MonoBehaviour: m_EditorClassIdentifier: Name: Right 3D Camera advancedProps: 0 + hitProps: 0 hit3DObjects: 1 hit2DObjects: 0 hitWorldSpaceUI: 0 @@ -2000,7 +2023,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 7a878a6ff128243dfb1d89ca0273f059, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -2009,8 +2038,15 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnTap: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null numberOfTapsRequired: 1 timeLimit: Infinity distanceLimit: Infinity @@ -2160,7 +2196,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 38e07bff8743d4ee38bf724a7a2b4cbb, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -2169,10 +2211,28 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnTransformStart: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransform: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransformComplete: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null type: 2 screenTransformThreshold: 0.05 + projectionProps: 0 projection: 2 projectionPlaneNormal: {x: 0, y: 1, z: 0} --- !u!114 &1164346784 @@ -2632,7 +2692,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 38e07bff8743d4ee38bf724a7a2b4cbb, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -2641,10 +2707,28 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnTransformStart: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransform: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransformComplete: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null type: 2 screenTransformThreshold: 0.05 + projectionProps: 0 projection: 2 projectionPlaneNormal: {x: 0, y: 1, z: 0} --- !u!114 &1388179444 @@ -2837,6 +2921,7 @@ MonoBehaviour: m_EditorClassIdentifier: Name: 2D Camera advancedProps: 0 + hitProps: 0 hit3DObjects: 0 hit2DObjects: 1 hitWorldSpaceUI: 0 @@ -3557,6 +3642,7 @@ MonoBehaviour: m_EditorClassIdentifier: Name: Left 3D Camera advancedProps: 0 + hitProps: 0 hit3DObjects: 1 hit2DObjects: 0 hitWorldSpaceUI: 0 @@ -3643,7 +3729,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -3652,11 +3744,29 @@ MonoBehaviour: useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] + OnTransformStart: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransform: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransformComplete: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null type: 1 screenTransformThreshold: 0.1 minScreenPointsDistance: 0.5 + projectionProps: 0 projection: 0 projectionPlaneNormal: {x: 0, y: 0, z: 1} --- !u!1001 &2057195942 diff --git a/Source/Assets/TouchScript/Examples/Photos/Photos.unity b/Source/Assets/TouchScript/Examples/Photos/Photos.unity index 47c3516d0..60982238f 100644 --- a/Source/Assets/TouchScript/Examples/Photos/Photos.unity +++ b/Source/Assets/TouchScript/Examples/Photos/Photos.unity @@ -1959,10 +1959,6 @@ Prefab: m_Modification: m_TransformParent: {fileID: 0} m_Modifications: - - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - propertyPath: layers.Array.size - value: 1 - objectReference: {fileID: 0} - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: m_LocalPosition.x value: 0 @@ -1991,50 +1987,17 @@ Prefab: propertyPath: m_LocalRotation.w value: 1 objectReference: {fileID: 0} + - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: layers.Array.data[0] value: objectReference: {fileID: 62216953} - - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - propertyPath: layers.Array.data[1] - value: - objectReference: {fileID: 62216953} - - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - propertyPath: layers.Array.data[2] - value: - objectReference: {fileID: 62216953} - - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - propertyPath: m_Enabled - value: 1 - objectReference: {fileID: 0} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} m_IsPrefabParent: 0 ---- !u!1 &543251037 stripped -GameObject: - m_PrefabParentObject: {fileID: 100002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - m_PrefabInternal: {fileID: 543251036} ---- !u!114 &543251038 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 543251037} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e276ccba4f7314d9988af19f9b3a611b, type: 3} - m_Name: - m_EditorClassIdentifier: - advancedProps: 0 - generalProps: 0 - windowsProps: 0 - windows8API: 0 - windows7API: 0 - webGLTouch: 1 - windows8Mouse: 1 - windows7Mouse: 1 - universalWindowsMouse: 1 - emulateSecondMousePointer: 1 --- !u!1 &551049734 GameObject: m_ObjectHideFlags: 0 diff --git a/Source/Assets/TouchScript/Examples/Portal/Portal.unity b/Source/Assets/TouchScript/Examples/Portal/Portal.unity index 75ee85946..2933a41b7 100644 --- a/Source/Assets/TouchScript/Examples/Portal/Portal.unity +++ b/Source/Assets/TouchScript/Examples/Portal/Portal.unity @@ -539,10 +539,6 @@ Prefab: m_Modification: m_TransformParent: {fileID: 0} m_Modifications: - - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - propertyPath: layers.Array.size - value: 1 - objectReference: {fileID: 0} - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: m_LocalPosition.x value: 0 @@ -571,42 +567,17 @@ Prefab: propertyPath: m_LocalRotation.w value: 1 objectReference: {fileID: 0} + - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: layers.Array.data[0] value: objectReference: {fileID: 62216953} - - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - propertyPath: m_Enabled - value: 1 - objectReference: {fileID: 0} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} m_IsPrefabParent: 0 ---- !u!1 &543251037 stripped -GameObject: - m_PrefabParentObject: {fileID: 100002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - m_PrefabInternal: {fileID: 543251036} ---- !u!114 &543251038 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 543251037} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e276ccba4f7314d9988af19f9b3a611b, type: 3} - m_Name: - m_EditorClassIdentifier: - advancedProps: 0 - generalProps: 0 - windowsProps: 0 - windows8API: 0 - windows7API: 0 - webGLTouch: 1 - windows8Mouse: 1 - windows7Mouse: 1 - universalWindowsMouse: 1 - emulateSecondMousePointer: 1 --- !u!1 &740851131 GameObject: m_ObjectHideFlags: 0 diff --git a/Source/Assets/TouchScript/Examples/RawInput/RawInput.unity b/Source/Assets/TouchScript/Examples/RawInput/RawInput.unity index 922e8cd9d..3ee57dcdf 100644 --- a/Source/Assets/TouchScript/Examples/RawInput/RawInput.unity +++ b/Source/Assets/TouchScript/Examples/RawInput/RawInput.unity @@ -279,16 +279,8 @@ Prefab: propertyPath: m_LocalRotation.w value: 1 objectReference: {fileID: 0} - - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - propertyPath: layers.Array.data[0] - value: - objectReference: {fileID: 0} - - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - propertyPath: m_Enabled - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - propertyPath: shouldCreateStandardInput + - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} + propertyPath: m_RootOrder value: 1 objectReference: {fileID: 0} - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} @@ -298,30 +290,6 @@ Prefab: m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} m_IsPrefabParent: 0 ---- !u!1 &543251037 stripped -GameObject: - m_PrefabParentObject: {fileID: 100002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - m_PrefabInternal: {fileID: 543251036} ---- !u!114 &543251038 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 543251037} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e276ccba4f7314d9988af19f9b3a611b, type: 3} - m_Name: - m_EditorClassIdentifier: - advancedProps: 0 - windows8API: 0 - windows7API: 0 - webPlayerTouch: 1 - webGLTouch: 1 - windows8Mouse: 1 - windows7Mouse: 1 - universalWindowsMouse: 1 - emulateSecondMousePointer: 1 --- !u!1 &740851131 GameObject: m_ObjectHideFlags: 0 diff --git a/Source/Assets/TouchScript/Examples/Taps/Taps.unity b/Source/Assets/TouchScript/Examples/Taps/Taps.unity index 9a108d970..90e8597f2 100644 --- a/Source/Assets/TouchScript/Examples/Taps/Taps.unity +++ b/Source/Assets/TouchScript/Examples/Taps/Taps.unity @@ -427,10 +427,6 @@ Prefab: m_Modification: m_TransformParent: {fileID: 0} m_Modifications: - - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - propertyPath: layers.Array.size - value: 1 - objectReference: {fileID: 0} - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: m_LocalPosition.x value: 0 @@ -459,50 +455,17 @@ Prefab: propertyPath: m_LocalRotation.w value: 1 objectReference: {fileID: 0} - - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - propertyPath: layers.Array.data[0] - value: - objectReference: {fileID: 62216953} - - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - propertyPath: layers.Array.data[1] - value: - objectReference: {fileID: 0} - - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - propertyPath: m_Enabled - value: 1 - objectReference: {fileID: 0} - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: m_RootOrder value: 1 objectReference: {fileID: 0} + - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} + propertyPath: layers.Array.data[0] + value: + objectReference: {fileID: 62216953} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} m_IsPrefabParent: 0 ---- !u!1 &543251037 stripped -GameObject: - m_PrefabParentObject: {fileID: 100002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} - m_PrefabInternal: {fileID: 543251036} ---- !u!114 &543251038 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 543251037} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e276ccba4f7314d9988af19f9b3a611b, type: 3} - m_Name: - m_EditorClassIdentifier: - advancedProps: 0 - generalProps: 0 - windowsProps: 0 - windows8API: 0 - windows7API: 0 - webGLTouch: 1 - windows8Mouse: 1 - windows7Mouse: 1 - universalWindowsMouse: 1 - emulateSecondMousePointer: 1 --- !u!1 &584553676 stripped GameObject: m_PrefabParentObject: {fileID: 100004, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} @@ -1762,6 +1725,10 @@ Prefab: propertyPath: m_Pivot.y value: 0 objectReference: {fileID: 0} + - target: {fileID: 11400000, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: useDPI + value: 1 + objectReference: {fileID: 0} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} m_IsPrefabParent: 0 diff --git a/Source/Assets/TouchScript/Examples/_prefabs.meta b/Source/Assets/TouchScript/Examples/_prefabs.meta deleted file mode 100644 index 6cc00175b..000000000 --- a/Source/Assets/TouchScript/Examples/_prefabs.meta +++ /dev/null @@ -1,5 +0,0 @@ -fileFormatVersion: 2 -guid: 007aa1b53f52c9440a4718611de401d4 -folderAsset: yes -DefaultImporter: - userData: diff --git a/Source/Assets/TouchScript/Prefabs/Cursors/Mouse Cursor.prefab b/Source/Assets/TouchScript/Prefabs/Cursors/Mouse Cursor.prefab index 39f2a3ed6..174ffb7eb 100644 --- a/Source/Assets/TouchScript/Prefabs/Cursors/Mouse Cursor.prefab +++ b/Source/Assets/TouchScript/Prefabs/Cursors/Mouse Cursor.prefab @@ -17,7 +17,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!1 &183852 GameObject: m_ObjectHideFlags: 0 @@ -76,7 +76,7 @@ MonoBehaviour: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 100100000} m_GameObject: {fileID: 152322} - m_Enabled: 1 + m_Enabled: 0 m_EditorHideFlags: 0 m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} m_Name: @@ -222,7 +222,7 @@ MonoBehaviour: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 100100000} m_GameObject: {fileID: 189110} - m_Enabled: 1 + m_Enabled: 0 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: d78b78253cc71a64ca6bf0978d7ac99e, type: 3} m_Name: @@ -278,7 +278,7 @@ MonoBehaviour: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 100100000} m_GameObject: {fileID: 189110} - m_Enabled: 1 + m_Enabled: 0 m_EditorHideFlags: 0 m_Script: {fileID: -98529514, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} m_Name: diff --git a/Source/Assets/TouchScript/Prefabs/Cursors/Pen Cursor.prefab b/Source/Assets/TouchScript/Prefabs/Cursors/Pen Cursor.prefab index bc58eddfe..bbbadb400 100644 --- a/Source/Assets/TouchScript/Prefabs/Cursors/Pen Cursor.prefab +++ b/Source/Assets/TouchScript/Prefabs/Cursors/Pen Cursor.prefab @@ -172,7 +172,7 @@ MonoBehaviour: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 100100000} m_GameObject: {fileID: 108352} - m_Enabled: 1 + m_Enabled: 0 m_EditorHideFlags: 0 m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} m_Name: diff --git a/Source/Assets/TouchScript/Prefabs/Cursors/Touch Cursor.prefab b/Source/Assets/TouchScript/Prefabs/Cursors/Touch Cursor.prefab index 24c1dbe37..f3397cc3e 100644 --- a/Source/Assets/TouchScript/Prefabs/Cursors/Touch Cursor.prefab +++ b/Source/Assets/TouchScript/Prefabs/Cursors/Touch Cursor.prefab @@ -58,7 +58,7 @@ MonoBehaviour: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 100100000} m_GameObject: {fileID: 152322} - m_Enabled: 1 + m_Enabled: 0 m_EditorHideFlags: 0 m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} m_Name: diff --git a/Source/Assets/TouchScript/Examples/_prefabs/TouchScript.prefab b/Source/Assets/TouchScript/Prefabs/TouchManager.prefab similarity index 84% rename from Source/Assets/TouchScript/Examples/_prefabs/TouchScript.prefab rename to Source/Assets/TouchScript/Prefabs/TouchManager.prefab index c6fe98145..14ff6ccf2 100644 --- a/Source/Assets/TouchScript/Examples/_prefabs/TouchScript.prefab +++ b/Source/Assets/TouchScript/Prefabs/TouchManager.prefab @@ -9,8 +9,9 @@ GameObject: m_Component: - 4: {fileID: 400002} - 114: {fileID: 11400000} + - 114: {fileID: 11478012} m_Layer: 0 - m_Name: TouchScript + m_Name: TouchManager m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -90,6 +91,27 @@ MonoBehaviour: useUnityEvents: 0 layers: - {fileID: 0} +--- !u!114 &11478012 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100002} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e276ccba4f7314d9988af19f9b3a611b, type: 3} + m_Name: + m_EditorClassIdentifier: + advancedProps: 0 + generalProps: 0 + windowsProps: 0 + windows8API: 0 + windows7API: 0 + webGLTouch: 1 + windows8Mouse: 1 + windows7Mouse: 1 + universalWindowsMouse: 1 + emulateSecondMousePointer: 1 --- !u!1001 &100100000 Prefab: m_ObjectHideFlags: 1 diff --git a/Source/Assets/TouchScript/Examples/_prefabs/TouchScript.prefab.meta b/Source/Assets/TouchScript/Prefabs/TouchManager.prefab.meta similarity index 100% rename from Source/Assets/TouchScript/Examples/_prefabs/TouchScript.prefab.meta rename to Source/Assets/TouchScript/Prefabs/TouchManager.prefab.meta diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs index e2eb255fa..f0ab826af 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs @@ -50,7 +50,11 @@ public PointerCursor ObjectCursor public bool UseDPI { get { return useDPI; } - set { useDPI = value; } + set + { + useDPI = value; + updateCursorSize(); + } } /// @@ -60,7 +64,21 @@ public bool UseDPI public float CursorSize { get { return cursorSize; } - set { cursorSize = value; } + set + { + cursorSize = value; + updateCursorSize(); + } + } + + public uint CursorPixelSize + { + get { return cursorPixelSize; } + set + { + cursorPixelSize = value; + updateCursorSize(); + } } #endregion @@ -92,6 +110,9 @@ public float CursorSize [SerializeField] private float cursorSize = 1f; + [SerializeField] + private uint cursorPixelSize = 64; + private RectTransform rect; private ObjectPool mousePool; private ObjectPool touchPool; @@ -110,6 +131,8 @@ private void Awake() penPool = new ObjectPool(2, instantiatePenProxy, null, clearProxy); objectPool = new ObjectPool(2, instantiateObjectProxy, null, clearProxy); + updateCursorSize(); + rect = transform as RectTransform; if (rect == null) { @@ -173,10 +196,9 @@ private void clearProxy(PointerCursor cursor) cursor.Hide(); } - private uint getPointerSize() + private void updateCursorSize() { - if (useDPI) return (uint) (cursorSize * TouchManager.Instance.DotsPerCentimeter); - return 0; + if (useDPI) cursorPixelSize = (uint)(cursorSize * TouchManager.Instance.DotsPerCentimeter); } #endregion @@ -189,6 +211,9 @@ private void pointersAddedHandler(object sender, PointerEventArgs e) for (var i = 0; i < count; i++) { var pointer = e.Pointers[i]; + // Don't show internal pointers + if ((pointer.Flags & Pointer.FLAG_INTERNAL) > 0) continue; + PointerCursor cursor; switch (pointer.Type) { @@ -208,7 +233,7 @@ private void pointersAddedHandler(object sender, PointerEventArgs e) continue; } - cursor.Size = getPointerSize(); + cursor.Size = cursorPixelSize; cursor.Init(rect, pointer); cursors.Add(pointer.Id, cursor); } diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer.meta b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer.meta new file mode 100644 index 000000000..8b8eeff86 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 13e39bb9814664e51bc4e78e8d16dc56 +folderAsset: yes +timeCreated: 1500402656 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs index 84644bfd3..f97661e15 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs @@ -33,6 +33,8 @@ public class Pointer : IPointer public const uint FLAG_RETURNED = 1 << 1; + public const uint FLAG_INTERNAL = 1 << 2; + /// /// Pointer type. /// diff --git a/Source/Assets/TouchScript/Shaders/Cursor.shader b/Source/Assets/TouchScript/Shaders/Cursor.shader index 58696ce7e..ddd5be1b4 100644 --- a/Source/Assets/TouchScript/Shaders/Cursor.shader +++ b/Source/Assets/TouchScript/Shaders/Cursor.shader @@ -8,6 +8,7 @@ { Tags { "Queue"="Transparent" "RenderType" = "Transparent" } Blend SrcAlpha OneMinusSrcAlpha + ZTest Always Pass { From 55fce35ee1cc160fcd7e810ec750fb3c4f7fbedb Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 18 Jul 2017 22:44:27 +0300 Subject: [PATCH 09/58] Upgraded to 5.6. --- .../Editor/Behaviors/TransformerEditor.cs | 6 +- .../Editor/Gestures/FlickGestureEditor.cs | 6 +- .../Editor/Gestures/GestureEditor.cs | 6 +- .../InputSources/StandardInputEditor.cs | 6 +- .../Editor/Layers/StandardLayerEditor.cs | 6 +- .../Examples/_misc/Shaders/UnlitColor.shader | 2 +- .../InputHandlers/MouseHandler.cs | 1 - .../Assets/TouchScript/Shaders/Cursor.shader | 2 +- Source/ProjectSettings/ProjectSettings.asset | 347 ++++++++++++------ Source/ProjectSettings/ProjectVersion.txt | 3 +- Source/ProjectSettings/UnityAdsSettings.asset | 11 - .../UnityConnectSettings.asset | 18 + 12 files changed, 290 insertions(+), 124 deletions(-) delete mode 100644 Source/ProjectSettings/UnityAdsSettings.asset diff --git a/Source/Assets/TouchScript/Editor/Behaviors/TransformerEditor.cs b/Source/Assets/TouchScript/Editor/Behaviors/TransformerEditor.cs index a3df54b65..be84c4e36 100644 --- a/Source/Assets/TouchScript/Editor/Behaviors/TransformerEditor.cs +++ b/Source/Assets/TouchScript/Editor/Behaviors/TransformerEditor.cs @@ -44,7 +44,11 @@ protected virtual void OnEnable() public override void OnInspectorGUI() { - serializedObject.UpdateIfDirtyOrScript(); +#if UNITY_5_6_OR_NEWER + serializedObject.UpdateIfRequiredOrScript(); +#else + serializedObject.UpdateIfDirtyOrScript(); +#endif GUILayout.Space(5); diff --git a/Source/Assets/TouchScript/Editor/Gestures/FlickGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/FlickGestureEditor.cs index 6765ed255..1ee424e7a 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/FlickGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/FlickGestureEditor.cs @@ -33,7 +33,11 @@ protected override void OnEnable() public override void OnInspectorGUI() { - serializedObject.UpdateIfDirtyOrScript(); +#if UNITY_5_6_OR_NEWER + serializedObject.UpdateIfRequiredOrScript(); +#else + serializedObject.UpdateIfDirtyOrScript(); +#endif EditorGUIUtility.labelWidth = 180; EditorGUILayout.PropertyField(direction, DIRECTION); diff --git a/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs index 0d4546cb7..25934c571 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs @@ -104,7 +104,11 @@ protected virtual void OnEnable() public override void OnInspectorGUI() { - serializedObject.UpdateIfDirtyOrScript(); +#if UNITY_5_6_OR_NEWER + serializedObject.UpdateIfRequiredOrScript(); +#else + serializedObject.UpdateIfDirtyOrScript(); +#endif GUILayout.Space(5); bool display; diff --git a/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs b/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs index c1c72b345..2fa033690 100644 --- a/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs +++ b/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs @@ -49,7 +49,11 @@ protected override void OnEnable() public override void OnInspectorGUI() { - serializedObject.UpdateIfDirtyOrScript(); +#if UNITY_5_6_OR_NEWER + serializedObject.UpdateIfRequiredOrScript(); +#else + serializedObject.UpdateIfDirtyOrScript(); +#endif GUILayout.Space(5); diff --git a/Source/Assets/TouchScript/Editor/Layers/StandardLayerEditor.cs b/Source/Assets/TouchScript/Editor/Layers/StandardLayerEditor.cs index 4f4c6ddc9..cceb98449 100644 --- a/Source/Assets/TouchScript/Editor/Layers/StandardLayerEditor.cs +++ b/Source/Assets/TouchScript/Editor/Layers/StandardLayerEditor.cs @@ -46,7 +46,11 @@ protected virtual void OnEnable() public override void OnInspectorGUI() { - serializedObject.UpdateIfDirtyOrScript(); +#if UNITY_5_6_OR_NEWER + serializedObject.UpdateIfRequiredOrScript(); +#else + serializedObject.UpdateIfDirtyOrScript(); +#endif GUILayout.Space(5); var display = GUIElements.Header(TEXT_HIT_HEADER, hit); diff --git a/Source/Assets/TouchScript/Examples/_misc/Shaders/UnlitColor.shader b/Source/Assets/TouchScript/Examples/_misc/Shaders/UnlitColor.shader index f5e7b3c2d..218e91400 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Shaders/UnlitColor.shader +++ b/Source/Assets/TouchScript/Examples/_misc/Shaders/UnlitColor.shader @@ -27,7 +27,7 @@ SubShader { v2f vert (appdata_t v) { v2f o; - o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); + o.vertex = UnityObjectToClipPos(v.vertex); return o; } diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs index d33f0c077..649e52b12 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs @@ -103,7 +103,6 @@ public MouseHandler(PointerDelegate addPointer, PointerDelegate updatePointer, P mousePool = new ObjectPool(4, () => new MousePointer(this), null, resetPointer); mousePointPos = Input.mousePosition; - Debug.Log(mousePointPos); mousePointer = internalAddPointer(remapCoordinates(mousePointPos)); stateMouse(); diff --git a/Source/Assets/TouchScript/Shaders/Cursor.shader b/Source/Assets/TouchScript/Shaders/Cursor.shader index ddd5be1b4..2e29950fc 100644 --- a/Source/Assets/TouchScript/Shaders/Cursor.shader +++ b/Source/Assets/TouchScript/Shaders/Cursor.shader @@ -35,7 +35,7 @@ v2f vert (appdata v) { v2f o; - o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); + o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } diff --git a/Source/ProjectSettings/ProjectSettings.asset b/Source/ProjectSettings/ProjectSettings.asset index 0dab5dcee..68627b0a0 100644 --- a/Source/ProjectSettings/ProjectSettings.asset +++ b/Source/ProjectSettings/ProjectSettings.asset @@ -3,7 +3,8 @@ --- !u!129 &1 PlayerSettings: m_ObjectHideFlags: 0 - serializedVersion: 8 + serializedVersion: 11 + productGUID: 0b2aa2b1c24cbc74ca2d27d2f6d0b8b4 AndroidProfiler: 0 defaultScreenOrientation: 3 targetDevice: 2 @@ -13,20 +14,46 @@ PlayerSettings: productName: TouchScript Examples defaultCursor: {fileID: 0} cursorHotspot: {x: 0, y: 0} + m_SplashScreenBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21176471, a: 1} m_ShowUnitySplashScreen: 1 + m_ShowUnitySplashLogo: 1 + m_SplashScreenOverlayOpacity: 1 + m_SplashScreenAnimation: 1 + m_SplashScreenLogoStyle: 1 + m_SplashScreenDrawMode: 0 + m_SplashScreenBackgroundAnimationZoom: 1 + m_SplashScreenLogoAnimationZoom: 1 + m_SplashScreenBackgroundLandscapeAspect: 1 + m_SplashScreenBackgroundPortraitAspect: 1 + m_SplashScreenBackgroundLandscapeUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenBackgroundPortraitUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenLogos: [] + m_SplashScreenBackgroundLandscape: {fileID: 0} + m_SplashScreenBackgroundPortrait: {fileID: 0} m_VirtualRealitySplashScreen: {fileID: 0} + m_HolographicTrackingLossScreen: {fileID: 0} defaultScreenWidth: 1024 defaultScreenHeight: 768 defaultScreenWidthWeb: 960 defaultScreenHeightWeb: 600 - m_RenderingPath: 1 - m_MobileRenderingPath: 1 + m_StereoRenderingPath: 0 m_ActiveColorSpace: 0 m_MTRendering: 1 m_MobileMTRendering: 0 - m_Stereoscopic3D: 0 + m_StackTraceTypes: 010000000100000001000000010000000100000001000000 iosShowActivityIndicatorOnLoading: -1 androidShowActivityIndicatorOnLoading: -1 + tizenShowActivityIndicatorOnLoading: -1 iosAppInBackgroundBehavior: 1 displayResolutionDialog: 1 iosAllowHTTPDownload: 1 @@ -41,7 +68,7 @@ PlayerSettings: defaultIsNativeResolution: 1 runInBackground: 1 captureSingleScreen: 0 - Override IPod Music: 0 + muteOtherAudioSources: 0 Prepare IOS For Recording: 0 submitAnalytics: 1 usePlayerLog: 1 @@ -49,7 +76,9 @@ PlayerSettings: forceSingleInstance: 0 resizableWindow: 0 useMacAppStoreValidation: 0 + macAppStoreCategory: public.app-category.games gpuSkinning: 1 + graphicsJobs: 0 xboxPIXTextureCapture: 0 xboxEnableAvatar: 0 xboxEnableKinect: 0 @@ -57,6 +86,7 @@ PlayerSettings: xboxEnableFitness: 0 visibleInBackground: 0 allowFullscreenSwitch: 1 + graphicsJobMode: 0 macFullscreenMode: 2 d3d9FullscreenMode: 1 d3d11FullscreenMode: 1 @@ -64,15 +94,13 @@ PlayerSettings: xboxEnableHeadOrientation: 0 xboxEnableGuest: 0 xboxEnablePIXSampling: 0 - xboxEnableEnableRenderThreadRunsJobs: 0 n3dsDisableStereoscopicView: 0 n3dsEnableSharedListOpt: 1 n3dsEnableVSync: 0 - uiUse16BitDepthBuffer: 0 ignoreAlphaClear: 0 xboxOneResolution: 0 xboxOneMonoLoggingLevel: 0 - ps3SplashScreen: {fileID: 0} + xboxOneLoggingLevel: 1 videoMemoryForVertexBuffers: 0 psp2PowerMode: 0 psp2AcquireBGM: 1 @@ -91,36 +119,53 @@ PlayerSettings: 16:10: 1 16:9: 1 Others: 1 - bundleIdentifier: ru.valyard.touchscript bundleVersion: 1.0 preloadedAssets: [] - metroEnableIndependentInputSource: 0 - metroEnableLowLatencyPresentationAPI: 0 + metroInputSource: 0 + m_HolographicPauseOnTrackingLoss: 1 xboxOneDisableKinectGpuReservation: 0 - virtualRealitySupported: 0 - productGUID: 0b2aa2b1c24cbc74ca2d27d2f6d0b8b4 + xboxOneEnable7thCore: 0 + vrSettings: + cardboard: + depthFormat: 0 + enableTransitionView: 0 + daydream: + depthFormat: 0 + useSustainedPerformanceMode: 0 + hololens: + depthFormat: 1 + protectGraphicsMemory: 0 + useHDRDisplay: 0 + applicationIdentifier: + Android: ru.valyard.touchscript + Standalone: unity.valyard.TouchScript Examples + Tizen: ru.valyard.touchscript + iOS: ru.valyard.touchscript + tvOS: ru.valyard.touchscript + buildNumber: + iOS: 0 AndroidBundleVersionCode: 1 - AndroidMinSdkVersion: 9 + AndroidMinSdkVersion: 16 + AndroidTargetSdkVersion: 0 AndroidPreferredInstallLocation: 1 aotOptions: - apiCompatibilityLevel: 2 stripEngineCode: 1 iPhoneStrippingLevel: 0 iPhoneScriptCallOptimization: 1 - iPhoneBuildNumber: 0 ForceInternetPermission: 0 ForceSDCardPermission: 0 CreateWallpaper: 0 APKExpansionFiles: 0 - preloadShaders: 0 + keepLoadedShadersAlive: 0 StripUnusedMeshComponents: 0 VertexChannelCompressionMask: serializedVersion: 2 m_Bits: 238 iPhoneSdkVersion: 988 - iPhoneTargetOSVersion: 28 + iOSTargetOSVersionString: 8.0 tvOSSdkVersion: 0 - tvOSTargetOSVersion: 900 + tvOSRequireExtendedGameController: 0 + tvOSTargetOSVersionString: 9.0 uIPrerenderedIcon: 0 uIRequiresPersistentWiFi: 0 uIRequiresFullScreen: 1 @@ -141,6 +186,7 @@ PlayerSettings: tvOSSmallIconLayers: [] tvOSLargeIconLayers: [] tvOSTopShelfImageLayers: [] + tvOSTopShelfImageWideLayers: [] iOSLaunchScreenType: 0 iOSLaunchScreenPortrait: {fileID: 0} iOSLaunchScreenLandscape: {fileID: 0} @@ -159,6 +205,16 @@ PlayerSettings: iOSLaunchScreeniPadSize: 100 iOSLaunchScreeniPadCustomXibPath: iOSDeviceRequirements: [] + iOSURLSchemes: [] + iOSBackgroundModes: 0 + iOSMetalForceHardShadows: 0 + metalEditorSupport: 0 + metalAPIValidation: 1 + iOSRenderExtraFrameOnPause: 1 + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: + appleEnableAutomaticSigning: 0 AndroidTargetDevice: 0 AndroidSplashScreenScale: 0 androidSplashScreen: {fileID: 0} @@ -188,6 +244,9 @@ PlayerSettings: - m_BuildTarget: AndroidPlayer m_APIs: 08000000 m_Automatic: 0 + m_BuildTargetVRSettings: [] + openGLRequireES31: 0 + openGLRequireES31AEP: 0 webPlayerTemplate: APPLICATION:Default m_TemplateCustomTags: {} wiiUTitleID: 0005000011000000 @@ -208,39 +267,121 @@ PlayerSettings: wiiUGamePadStartupScreen: {fileID: 0} wiiUDrcBufferDisabled: 0 wiiUProfilerLibPath: + playModeTestRunnerEnabled: 0 actionOnDotNetUnhandledException: 1 enableInternalProfiler: 0 logObjCUncaughtExceptions: 1 enableCrashReportAPI: 0 + cameraUsageDescription: locationUsageDescription: - XboxTitleId: - XboxImageXexPath: - XboxSpaPath: - XboxGenerateSpa: 0 - XboxDeployKinectResources: 0 - XboxSplashScreen: {fileID: 0} - xboxEnableSpeech: 0 - xboxAdditionalTitleMemorySize: 0 - xboxDeployKinectHeadOrientation: 0 - xboxDeployKinectHeadPosition: 0 - ps3TitleConfigPath: - ps3DLCConfigPath: - ps3ThumbnailPath: - ps3BackgroundPath: - ps3SoundPath: - ps3NPAgeRating: 12 - ps3TrophyCommId: - ps3NpCommunicationPassphrase: - ps3TrophyPackagePath: - ps3BootCheckMaxSaveGameSizeKB: 128 - ps3TrophyCommSig: - ps3SaveGameSlots: 1 - ps3TrialMode: 0 - ps3VideoMemoryForAudio: 0 - ps3EnableVerboseMemoryStats: 0 - ps3UseSPUForUmbra: 0 - ps3EnableMoveSupport: 1 - ps3DisableDolbyEncoding: 0 + microphoneUsageDescription: + switchNetLibKey: + switchSocketMemoryPoolSize: 6144 + switchSocketAllocatorPoolSize: 128 + switchSocketConcurrencyLimit: 14 + switchScreenResolutionBehavior: 2 + switchUseCPUProfiler: 0 + switchApplicationID: 0x01004b9000490000 + switchNSODependencies: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchIcons_0: {fileID: 0} + switchIcons_1: {fileID: 0} + switchIcons_2: {fileID: 0} + switchIcons_3: {fileID: 0} + switchIcons_4: {fileID: 0} + switchIcons_5: {fileID: 0} + switchIcons_6: {fileID: 0} + switchIcons_7: {fileID: 0} + switchIcons_8: {fileID: 0} + switchIcons_9: {fileID: 0} + switchIcons_10: {fileID: 0} + switchIcons_11: {fileID: 0} + switchSmallIcons_0: {fileID: 0} + switchSmallIcons_1: {fileID: 0} + switchSmallIcons_2: {fileID: 0} + switchSmallIcons_3: {fileID: 0} + switchSmallIcons_4: {fileID: 0} + switchSmallIcons_5: {fileID: 0} + switchSmallIcons_6: {fileID: 0} + switchSmallIcons_7: {fileID: 0} + switchSmallIcons_8: {fileID: 0} + switchSmallIcons_9: {fileID: 0} + switchSmallIcons_10: {fileID: 0} + switchSmallIcons_11: {fileID: 0} + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: + switchMainThreadStackSize: 1048576 + switchPresenceGroupId: + switchLogoHandling: 0 + switchReleaseVersion: 0 + switchDisplayVersion: 1.0.0 + switchStartupUserAccount: 0 + switchTouchScreenUsage: 0 + switchSupportedLanguagesMask: 0 + switchLogoType: 0 + switchApplicationErrorCodeCategory: + switchUserAccountSaveDataSize: 0 + switchUserAccountSaveDataJournalSize: 0 + switchApplicationAttribute: 0 + switchCardSpecSize: -1 + switchCardSpecClock: -1 + switchRatingsMask: 0 + switchRatingsInt_0: 0 + switchRatingsInt_1: 0 + switchRatingsInt_2: 0 + switchRatingsInt_3: 0 + switchRatingsInt_4: 0 + switchRatingsInt_5: 0 + switchRatingsInt_6: 0 + switchRatingsInt_7: 0 + switchRatingsInt_8: 0 + switchRatingsInt_9: 0 + switchRatingsInt_10: 0 + switchRatingsInt_11: 0 + switchLocalCommunicationIds_0: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: + switchParentalControl: 0 + switchAllowsScreenshot: 1 + switchDataLossConfirmation: 0 + switchSupportedNpadStyles: 3 + switchSocketConfigEnabled: 0 + switchTcpInitialSendBufferSize: 32 + switchTcpInitialReceiveBufferSize: 64 + switchTcpAutoSendBufferSizeMax: 256 + switchTcpAutoReceiveBufferSizeMax: 256 + switchUdpSendBufferSize: 9 + switchUdpReceiveBufferSize: 42 + switchSocketBufferEfficiency: 4 ps4NPAgeRating: 12 ps4NPTitleSecret: ps4NPTrophyPackPath: @@ -252,7 +393,9 @@ PlayerSettings: ps4AppType: 0 ps4ParamSfxPath: ps4VideoOutPixelFormat: 0 - ps4VideoOutResolution: 4 + ps4VideoOutInitialWidth: 1920 + ps4VideoOutBaseModeInitialWidth: 1920 + ps4VideoOutReprojectionRate: 120 ps4PronunciationXMLPath: ps4PronunciationSIGPath: ps4BackgroundImagePath: @@ -274,6 +417,7 @@ PlayerSettings: ps4ApplicationParam4: 0 ps4DownloadDataSize: 0 ps4GarlicHeapSize: 2048 + ps4ProGarlicHeapSize: 2560 ps4Passcode: 5xr84P2R391UXaLHbavJvFZGfO47XWS2 ps4UseDebugIl2cppLibs: 0 ps4pnSessions: 1 @@ -281,20 +425,27 @@ PlayerSettings: ps4pnFriends: 1 ps4pnGameCustomData: 1 playerPrefsSupport: 0 + restrictedAudioUsageRights: 0 + ps4UseResolutionFallback: 0 ps4ReprojectionSupport: 0 ps4UseAudio3dBackend: 0 ps4SocialScreenEnabled: 0 + ps4ScriptOptimizationLevel: 3 ps4Audio3dVirtualSpeakerCount: 14 ps4attribCpuUsage: 0 ps4PatchPkgPath: ps4PatchLatestPkgPath: ps4PatchChangeinfoPath: + ps4PatchDayOne: 0 ps4attribUserManagement: 0 ps4attribMoveSupport: 0 ps4attrib3DSupport: 0 ps4attribShareSupport: 0 ps4attribExclusiveVR: 0 ps4disableAutoHideSplash: 0 + ps4videoRecordingFeaturesUsed: 0 + ps4contentSearchFeaturesUsed: 0 + ps4attribEyeToEyeDistanceSettingVR: 0 ps4IncludedModules: [] monoEnv: psp2Splashimage: {fileID: 0} @@ -345,10 +496,39 @@ PlayerSettings: psp2InfoBarColor: 0 psp2UseDebugIl2cppLibs: 0 psmSplashimage: {fileID: 0} + splashScreenBackgroundSourceLandscape: {fileID: 0} + splashScreenBackgroundSourcePortrait: {fileID: 0} spritePackerPolicy: + webGLMemorySize: 256 + webGLExceptionSupport: 1 + webGLNameFilesAsHashes: 0 + webGLDataCaching: 0 + webGLDebugSymbols: 0 + webGLEmscriptenArgs: + webGLModulesDirectory: + webGLTemplate: APPLICATION:Default + webGLAnalyzeBuildSize: 0 + webGLUseEmbeddedResources: 0 + webGLUseWasm: 0 + webGLCompressionFormat: 1 scriptingDefineSymbols: 1: 4: + platformArchitecture: + iOS: 0 + scriptingBackend: + Android: 0 + Metro: 2 + Standalone: 0 + WP8: 2 + WebGL: 1 + iOS: 0 + incrementalIl2cppBuild: + iOS: 0 + additionalIl2CppArgs: + apiCompatibilityLevelPerPlatform: {} + m_RenderingPath: 1 + m_MobileRenderingPath: 1 metroPackageName: General Examples metroPackageVersion: metroCertificatePath: @@ -374,29 +554,14 @@ PlayerSettings: metroFTAFileTypes: [] metroProtocolName: metroCompilationOverrides: 1 - blackberryDeviceAddress: - blackberryDevicePassword: - blackberryTokenPath: - blackberryTokenExires: - blackberryTokenAuthor: - blackberryTokenAuthorId: - blackberryCskPassword: - blackberrySaveLogPath: - blackberrySharedPermissions: 0 - blackberryCameraPermissions: 0 - blackberryGPSPermissions: 0 - blackberryDeviceIDPermissions: 0 - blackberryMicrophonePermissions: 0 - blackberryGamepadSupport: 0 - blackberryBuildId: 0 - blackberryLandscapeSplashScreen: {fileID: 0} - blackberryPortraitSplashScreen: {fileID: 0} - blackberrySquareSplashScreen: {fileID: 0} tizenProductDescription: tizenProductURL: tizenSigningProfileName: tizenGPSPermissions: 0 tizenMicrophonePermissions: 0 + tizenDeploymentTarget: + tizenDeploymentTargetType: -1 + tizenMinOSVersion: 1 n3dsUseExtSaveData: 0 n3dsCompressStaticMem: 1 n3dsExtSaveDataNumber: 0x12345 @@ -426,50 +591,26 @@ PlayerSettings: XboxOnePackageEncryption: 0 XboxOnePackageUpdateGranularity: 2 XboxOneDescription: + XboxOneLanguage: + - enus + XboxOneCapability: [] + XboxOneGameRating: {} XboxOneIsContentPackage: 0 XboxOneEnableGPUVariability: 0 XboxOneSockets: {} XboxOneSplashScreen: {fileID: 0} XboxOneAllowedProductIds: [] XboxOnePersistentLocalStorageSize: 0 - intPropertyNames: - - Android::ScriptingBackend - - Metro::ScriptingBackend - - Standalone::ScriptingBackend - - WP8::ScriptingBackend - - WebGL::ScriptingBackend - - WebGL::audioCompressionFormat - - WebGL::exceptionSupport - - WebGL::memorySize - - iOS::Architecture - - iOS::EnableIncrementalBuildSupportForIl2cpp - - iOS::ScriptingBackend - Android::ScriptingBackend: 0 - Metro::ScriptingBackend: 2 - Standalone::ScriptingBackend: 0 - WP8::ScriptingBackend: 2 - WebGL::ScriptingBackend: 1 - WebGL::audioCompressionFormat: 4 - WebGL::exceptionSupport: 1 - WebGL::memorySize: 256 - iOS::Architecture: 0 - iOS::EnableIncrementalBuildSupportForIl2cpp: 0 - iOS::ScriptingBackend: 0 - boolPropertyNames: - - WebGL::analyzeBuildSize - - WebGL::dataCaching - - WebGL::useEmbeddedResources - WebGL::analyzeBuildSize: 0 - WebGL::dataCaching: 0 - WebGL::useEmbeddedResources: 0 - stringPropertyNames: - - WebGL::emscriptenArgs - - WebGL::template - - additionalIl2CppArgs::additionalIl2CppArgs - WebGL::emscriptenArgs: - WebGL::template: APPLICATION:Default - additionalIl2CppArgs::additionalIl2CppArgs: + xboxOneScriptCompiler: 0 + vrEditorSettings: + daydream: + daydreamIconForeground: {fileID: 0} + daydreamIconBackground: {fileID: 0} + cloudServicesEnabled: {} + facebookSdkVersion: 7.9.1 + apiCompatibilityLevel: 2 cloudProjectId: projectName: organizationId: cloudEnabled: 0 + enableNewInputSystem: 0 diff --git a/Source/ProjectSettings/ProjectVersion.txt b/Source/ProjectSettings/ProjectVersion.txt index d4ad3ce51..d542d5a64 100644 --- a/Source/ProjectSettings/ProjectVersion.txt +++ b/Source/ProjectSettings/ProjectVersion.txt @@ -1,2 +1 @@ -m_EditorVersion: 5.3.6f1 -m_StandardAssetsVersion: 0 +m_EditorVersion: 5.6.1p4 diff --git a/Source/ProjectSettings/UnityAdsSettings.asset b/Source/ProjectSettings/UnityAdsSettings.asset deleted file mode 100644 index 224050ce8..000000000 --- a/Source/ProjectSettings/UnityAdsSettings.asset +++ /dev/null @@ -1,11 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!292 &1 -UnityAdsSettings: - m_ObjectHideFlags: 0 - m_Enabled: 0 - m_InitializeOnStartup: 1 - m_TestMode: 0 - m_EnabledPlatforms: 4294967295 - m_IosGameId: - m_AndroidGameId: diff --git a/Source/ProjectSettings/UnityConnectSettings.asset b/Source/ProjectSettings/UnityConnectSettings.asset index 9b7a57834..ec1ab2929 100644 --- a/Source/ProjectSettings/UnityConnectSettings.asset +++ b/Source/ProjectSettings/UnityConnectSettings.asset @@ -3,6 +3,15 @@ --- !u!310 &1 UnityConnectSettings: m_ObjectHideFlags: 0 + m_Enabled: 0 + m_TestMode: 0 + m_TestEventUrl: + m_TestConfigUrl: + m_TestInitMode: 0 + CrashReportingSettings: + m_EventUrl: https://perf-events.cloud.unity3d.com/api/events/crashes + m_Enabled: 0 + m_CaptureEditorExceptions: 1 UnityPurchasingSettings: m_Enabled: 0 m_TestMode: 0 @@ -12,3 +21,12 @@ UnityConnectSettings: m_TestMode: 0 m_TestEventUrl: m_TestConfigUrl: + UnityAdsSettings: + m_Enabled: 0 + m_InitializeOnStartup: 1 + m_TestMode: 0 + m_EnabledPlatforms: 4294967295 + m_IosGameId: + m_AndroidGameId: + PerformanceReportingSettings: + m_Enabled: 0 From 013cd9cb7d8590046dc93427fdf20a0b6dd2fe07 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Thu, 20 Jul 2017 21:51:41 +0300 Subject: [PATCH 10/58] Added pointer debug window, refactored debug utils. --- .../Editor/Behaviors/TransformerEditor.cs | 2 +- .../Visualizer/CursorManagerEditor.cs | 2 +- .../Assets/TouchScript/Editor/Debugging.meta | 9 + .../Editor/Debugging/PointerDebuggerWindow.cs | 629 ++++++++++++++++++ .../Debugging/PointerDebuggerWindow.cs.meta | 12 + .../Assets/TouchScript/Editor/EditorUI.meta | 9 + .../Editor/{Utils => EditorUI}/GUIElements.cs | 2 +- .../{Utils => EditorUI}/GUIElements.cs.meta | 0 .../TouchScript/Editor/EditorUI/GUIUtils.cs | 34 + .../Editor/EditorUI/GUIUtils.cs.meta | 12 + .../TouchScript/Editor/EditorUI/PagedList.cs | 199 ++++++ .../Editor/EditorUI/PagedList.cs.meta | 12 + .../Editor/Gestures/GestureEditor.cs | 4 +- .../PinnedTransformGestureEditor.cs | 2 +- .../TransformGestureEditor.cs | 3 +- .../InputSources/StandardInputEditor.cs | 3 +- .../Editor/Layers/StandardLayerEditor.cs | 2 +- .../TouchScript/Editor/TouchManagerEditor.cs | 2 +- .../Editor/TouchScriptSettingsWindow.cs | 2 +- .../Examples/Checkers/Scripts/Exclusive.cs | 2 +- .../Scripts/Behaviors/Cursors/MouseCursor.cs | 2 +- .../Scripts/Behaviors/Cursors/PenCursor.cs | 2 +- .../Assets/TouchScript/Scripts/Debugging.meta | 9 + .../Scripts/Debugging/Filters.meta | 9 + .../Debugging/Filters/IPointerDataFilter.cs | 17 + .../Filters/IPointerDataFilter.cs.meta | 12 + .../Debugging/Filters/IPointerLogFilter.cs | 18 + .../Filters/IPointerLogFilter.cs.meta | 12 + .../Debugging/Filters/PointerLogFilter.cs | 32 + .../Filters/PointerLogFilter.cs.meta | 12 + .../DebugUtils.meta => Debugging/GL.meta} | 0 .../Scripts/Debugging/GL/DebugHelper.cs | 20 + .../Scripts/Debugging/GL/DebugHelper.cs.meta | 12 + .../Scripts/Debugging/GL/GLDebug.cs | 625 +++++++++++++++++ .../Scripts/Debugging/GL/GLDebug.cs.meta | 12 + .../Scripts/Debugging/Loggers.meta | 9 + .../Debugging/Loggers/IPointerLogger.cs | 67 ++ .../Debugging/Loggers/IPointerLogger.cs.meta | 12 + .../Debugging/Loggers/PointerLogger.cs | 110 +++ .../Debugging/Loggers/PointerLogger.cs.meta | 12 + .../Scripts/Debugging/TouchScriptDebugger.cs | 46 ++ .../Debugging/TouchScriptDebugger.cs.meta | 12 + .../Base/OnePointTrasformGestureBase.cs | 2 +- .../Base/TransformGestureBase.cs | 2 +- .../Base/TwoPointTransformGestureBase.cs | 2 +- .../PinnedTransformGesture.cs | 2 +- .../TransformGestures/TransformGesture.cs | 2 +- .../TouchScript/Scripts/Pointers/Pointer.cs | 2 + .../Scripts/TouchManagerInstance.cs | 61 +- .../TouchScript/Scripts/Utils/BinaryUtils.cs | 13 + .../Scripts/Utils/EventHandlerExtensions.cs | 5 +- .../TouchScript/Scripts/Utils/PointerUtils.cs | 55 +- .../Scripts/Utils/TransformUtils.cs | 27 +- 53 files changed, 2141 insertions(+), 36 deletions(-) create mode 100644 Source/Assets/TouchScript/Editor/Debugging.meta create mode 100644 Source/Assets/TouchScript/Editor/Debugging/PointerDebuggerWindow.cs create mode 100644 Source/Assets/TouchScript/Editor/Debugging/PointerDebuggerWindow.cs.meta create mode 100644 Source/Assets/TouchScript/Editor/EditorUI.meta rename Source/Assets/TouchScript/Editor/{Utils => EditorUI}/GUIElements.cs (98%) rename Source/Assets/TouchScript/Editor/{Utils => EditorUI}/GUIElements.cs.meta (100%) create mode 100644 Source/Assets/TouchScript/Editor/EditorUI/GUIUtils.cs create mode 100644 Source/Assets/TouchScript/Editor/EditorUI/GUIUtils.cs.meta create mode 100644 Source/Assets/TouchScript/Editor/EditorUI/PagedList.cs create mode 100644 Source/Assets/TouchScript/Editor/EditorUI/PagedList.cs.meta create mode 100644 Source/Assets/TouchScript/Scripts/Debugging.meta create mode 100644 Source/Assets/TouchScript/Scripts/Debugging/Filters.meta create mode 100644 Source/Assets/TouchScript/Scripts/Debugging/Filters/IPointerDataFilter.cs create mode 100644 Source/Assets/TouchScript/Scripts/Debugging/Filters/IPointerDataFilter.cs.meta create mode 100644 Source/Assets/TouchScript/Scripts/Debugging/Filters/IPointerLogFilter.cs create mode 100644 Source/Assets/TouchScript/Scripts/Debugging/Filters/IPointerLogFilter.cs.meta create mode 100644 Source/Assets/TouchScript/Scripts/Debugging/Filters/PointerLogFilter.cs create mode 100644 Source/Assets/TouchScript/Scripts/Debugging/Filters/PointerLogFilter.cs.meta rename Source/Assets/TouchScript/Scripts/{Utils/DebugUtils.meta => Debugging/GL.meta} (100%) create mode 100644 Source/Assets/TouchScript/Scripts/Debugging/GL/DebugHelper.cs create mode 100644 Source/Assets/TouchScript/Scripts/Debugging/GL/DebugHelper.cs.meta create mode 100644 Source/Assets/TouchScript/Scripts/Debugging/GL/GLDebug.cs create mode 100644 Source/Assets/TouchScript/Scripts/Debugging/GL/GLDebug.cs.meta create mode 100644 Source/Assets/TouchScript/Scripts/Debugging/Loggers.meta create mode 100644 Source/Assets/TouchScript/Scripts/Debugging/Loggers/IPointerLogger.cs create mode 100644 Source/Assets/TouchScript/Scripts/Debugging/Loggers/IPointerLogger.cs.meta create mode 100644 Source/Assets/TouchScript/Scripts/Debugging/Loggers/PointerLogger.cs create mode 100644 Source/Assets/TouchScript/Scripts/Debugging/Loggers/PointerLogger.cs.meta create mode 100644 Source/Assets/TouchScript/Scripts/Debugging/TouchScriptDebugger.cs create mode 100644 Source/Assets/TouchScript/Scripts/Debugging/TouchScriptDebugger.cs.meta diff --git a/Source/Assets/TouchScript/Editor/Behaviors/TransformerEditor.cs b/Source/Assets/TouchScript/Editor/Behaviors/TransformerEditor.cs index be84c4e36..56ddcff5f 100644 --- a/Source/Assets/TouchScript/Editor/Behaviors/TransformerEditor.cs +++ b/Source/Assets/TouchScript/Editor/Behaviors/TransformerEditor.cs @@ -6,7 +6,7 @@ using UnityEditor; using UnityEngine; using System.Reflection; -using TouchScript.Editor.Utils; +using TouchScript.Editor.EditorUI; namespace TouchScript.Editor.Behaviors { diff --git a/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/CursorManagerEditor.cs b/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/CursorManagerEditor.cs index d1f31d181..88cd877fa 100644 --- a/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/CursorManagerEditor.cs +++ b/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/CursorManagerEditor.cs @@ -5,7 +5,7 @@ using TouchScript.Behaviors.Cursors; using UnityEditor; using UnityEngine; -using TouchScript.Editor.Utils; +using TouchScript.Editor.EditorUI; namespace TouchScript.Editor.Behaviors.Visualizer { diff --git a/Source/Assets/TouchScript/Editor/Debugging.meta b/Source/Assets/TouchScript/Editor/Debugging.meta new file mode 100644 index 000000000..8c2b9493d --- /dev/null +++ b/Source/Assets/TouchScript/Editor/Debugging.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 81e4112b0ec1b439595cbb4384be9b70 +folderAsset: yes +timeCreated: 1500410739 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Editor/Debugging/PointerDebuggerWindow.cs b/Source/Assets/TouchScript/Editor/Debugging/PointerDebuggerWindow.cs new file mode 100644 index 000000000..3504cbf05 --- /dev/null +++ b/Source/Assets/TouchScript/Editor/Debugging/PointerDebuggerWindow.cs @@ -0,0 +1,629 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +#if TOUCHSCRIPT_DEBUG + +using System; +using System.Collections.Generic; +using TouchScript.Debugging; +using TouchScript.Debugging.Filters; +using TouchScript.Debugging.GL; +using TouchScript.Debugging.Loggers; +using TouchScript.Editor.EditorUI; +using TouchScript.Utils; +using UnityEditor; +using UnityEngine; + +namespace TouchScript.Editor.Debugging +{ + public class PointerDebuggerWindow : EditorWindow + { + private class Styles : IDisposable + { + + public Texture2D BG; + + public int Padding = 5; + public int GlobalPadding = 10; + + public int TabHeight = 20; + public int TabWidth = 80; + public int TabPadding = 10; + + public int TopWindowHeight = 240; + public int RefreshHeight = 30; + + public int PointerItemHeight = 22; + public Color PointerItemSelected = new Color(.86f, .86f, .86f, 1f); + public Color PointerItemEmpty = new Color(.7f, .7f, .7f, .2f); + + public GUIStyle PointerItemStyle; + public GUIStyle EnterPlayModeText; + public GUIStyle SmallText; + public GUIStyle FilterToggle; + + public Styles() + { + BG = CreateColorTexture(new Color(0, 0, 0, 0.05f)); + + PointerItemStyle = new GUIStyle("ShurikenModuleTitle") + { + font = (new GUIStyle("Label")).font, + border = new RectOffset(15, 7, 4, 4), + fixedHeight = 22, + contentOffset = new Vector2(20f, -2f), + }; + + EnterPlayModeText = new GUIStyle("miniLabel") + { + alignment = TextAnchor.MiddleCenter, + }; + + SmallText = new GUIStyle("miniLabel") + { + alignment = TextAnchor.UpperLeft, + }; + + FilterToggle = new GUIStyle("ShurikenToggle") + { }; + } + + public void Dispose() + { + DestroyImmediate(BG); + } + + public static Texture2D CreateColorTexture(Color color) + { + var texture = new Texture2D(1, 1); + texture.hideFlags = HideFlags.HideAndDontSave; + texture.name = "Color " + color; + texture.SetPixel(0, 0, color); + texture.Apply(); + return texture; + } + } + + // sec + private const float UPDATE_INTERVAL = 1f; + + private enum Tab + { + Pointers, + Event, + Filters + } + + [MenuItem("Window/TouchScript/Debug", false, 0)] + static void createWindow() + { + EditorWindow window = GetWindow(false, "TSDebugger", true); + window.minSize = new Vector2(300, 600); + + window.Show(); + } + + [NonSerialized] + private bool initializedForPlayMode = false; + + private Styles styles; + + private IPointerLogger pLogger; + private PointerVisualizer pointerVisualizer; + private PagedList pointerList; + private PagedList eventList; + + [NonSerialized] + private Tab activeTab; + + [NonSerialized] + private int pointerDataCount = 0; + [NonSerialized] + private List pointerData = new List(); + [NonSerialized] + private List pointerStrings = new List(); + [NonSerialized] + private List pointerEvents = new List(); + [NonSerialized] + private PointerLog selectedEvent; + [NonSerialized] + private Dictionary pointerEventStrings = new Dictionary(); + [NonSerialized] + private PointerLogFilter logFilter; + private FilterState filterState; + //private Vector2 filterScroll; + + private bool autoRefresh = true; + [NonSerialized] + private float refreshTime; + + private void OnEnable() + { + if (filterState == null) + { + filterState = new FilterState(); + filterState.Load(); + } + } + + private void OnDisable() + { + if (styles != null) styles.Dispose(); + + EditorApplication.update -= updateHandler; + } + + private void updateHandler() + { + if (!Application.isPlaying) return; + + if (pLogger.PointerCount != pointerDataCount) + { + updatePointers(); + } + if (autoRefresh) + { + var time = Time.unscaledTime; + if (time > refreshTime) + { + refreshTime = time + UPDATE_INTERVAL; + updateEventList(); + } + } + } + + #region Update + + private void initPlayMode() + { + if (initializedForPlayMode || !Application.isPlaying) return; + + pLogger = TouchScriptDebugger.Instance.PointerLogger; + pointerVisualizer = new PointerVisualizer(); + pointerList = new PagedList(styles.PointerItemHeight, drawPointerItem, pointerSelectionChangeHandler); + eventList = new PagedList(styles.PointerItemHeight, drawEventItem, eventSelectionChangeHandler); + logFilter = new PointerLogFilter(); + + EditorApplication.update += updateHandler; + + initializedForPlayMode = true; + } + + private void updatePointers() + { + pointerData = pLogger.GetFilteredPointerData(); + pointerList.Count = pointerData.Count; + pointerDataCount = pointerData.Count; + + pointerStrings.Clear(); + foreach (var data in pointerData) + { + pointerStrings.Add(string.Format("{0} (id: {1})", data.Type, data.Id)); + } + + Repaint(); + } + + private void updateEventList() + { + if (pointerList.SelectedId == -1) + { + pointerEvents.Clear(); + eventList.Count = 0; + } + else + { + var id = pointerData[pointerList.SelectedId].Id; + syncFilter(); + pointerEvents = pLogger.GetFilteredLogsForPointer(id, logFilter); + eventList.Count = pointerEvents.Count; + } + + Repaint(); + } + + private void selectPointer() + { + updateEventList(); + pointerVisualizer.Hide(); + } + + private void selectEvent() + { + if (eventList.SelectedId == -1) + { + pointerVisualizer.Hide(); + return; + } + + selectedEvent = pointerEvents[eventList.SelectedId]; + pointerVisualizer.Show(selectedEvent.State.Position); + switchTab(Tab.Event); + } + + private void syncFilter() + { + logFilter.EventMask = filterState.PointerEventMask; + } + + private string getEventString(int id) + { + var evt = pointerEvents[id]; + string str = null; + if (!pointerEventStrings.TryGetValue(evt.Id, out str)) + { + DateTime time = new DateTime(evt.Tick); + str = string.Format("{0} > {1}", time.ToString("HH:mm:ss.ffffff"), evt.Event); + pointerEventStrings.Add(evt.Id, str); + } + return str; + } + + #endregion + + #region Misc + + private void switchTab(Tab newTab) + { + activeTab = newTab; + + //if (activeTab == Tab.Filters) + //{ + // filterScroll = Vector2.zero; + //} + + Repaint(); + } + + #endregion + + #region Drawing + + private void OnGUI() + { + if (styles == null) styles = new Styles(); + + var playmode = Application.isPlaying; + if (playmode) initPlayMode(); + + int height = styles.TopWindowHeight; + //int height = pointerList.FitHeight(10); + + var rect = GUIUtils.GetPaddedRect(height + styles.GlobalPadding * 2, styles.Padding); + + GUI.DrawTexture(rect, styles.BG); + GUIUtils.ContractRect(ref rect, styles.GlobalPadding); + + switch (activeTab) + { + case Tab.Pointers: + if (playmode) + pointerList.Draw(rect); + else + drawPlaymodeText(rect); + break; + case Tab.Event: + if (playmode) + drawSelectedEvent(rect); + else + drawPlaymodeText(rect); + break; + case Tab.Filters: + drawFilters(rect); + break; + } + + drawTabs(); + drawRefresh(); + + //eventList.Count = 100; + rect = GUIUtils.GetPaddedRect(0, styles.Padding, true); + + GUI.DrawTexture(rect, styles.BG); + GUIUtils.ContractRect(ref rect, styles.GlobalPadding); + + if (playmode) + eventList.Draw(rect); + else + drawPlaymodeText(rect); + } + + private void drawFilters(Rect rect) + { + //GUI.Toggle(rect, true, " Test", styles.FilterToggle); + + GUI.Label(rect, "Show pointer events:"); + + rect.y += 20; rect.height -= 20; + var scrollRect = new Rect(rect); + scrollRect.height *= 2; + scrollRect.width -= 40; + //scrollRect.x = 0; + //scrollRect.y = 0; + + //using (var scope = new GUI.ScrollViewScope(rect, filterScroll, scrollRect)) + //{ + scrollRect.height = 14; + var names = Enum.GetNames(typeof(PointerEvent)); + using (var changeScope = new EditorGUI.ChangeCheckScope()) + { + for (var i = 1; i < names.Length; i++) + { + var evt = (PointerEvent)i; + filterState.SetEventValue(evt, + GUI.Toggle(scrollRect, filterState.IsEventEnabled(evt), " " + names[i], styles.FilterToggle)); + scrollRect.y += scrollRect.height; + } + if (changeScope.changed) filterState.Save(); + } + // filterScroll = scope.scrollPosition; + //} + + using (var scope = new EditorGUI.DisabledScope(!Application.isPlaying)) + { + if (GUI.Button(scrollRect, "Apply filter")) + { + updateEventList(); + } + } + } + + private void drawTabs() + { + var rect = GUILayoutUtility.GetRect(0, styles.TabHeight, GUILayout.ExpandWidth(true)); + rect.x += styles.Padding; + rect.y -= styles.Padding; + + rect.width = styles.TabWidth; + if (drawTab(rect, "Pointers", activeTab == Tab.Pointers)) + activeTab = Tab.Pointers; + rect.x += rect.width; + if (drawTab(rect, "Event", activeTab == Tab.Event)) + activeTab = Tab.Event; + rect.x += rect.width; + if (drawTab(rect, "Filters", activeTab == Tab.Filters)) + activeTab = Tab.Filters; + } + + private void drawRefresh() + { + var rect = GUILayoutUtility.GetRect(0, styles.RefreshHeight, GUILayout.ExpandWidth(true)); + GUIUtils.ContractRect(ref rect, styles.Padding); + + var refreshRect = new Rect(rect); + refreshRect.x = refreshRect.width - 100 - 60; + refreshRect.width = 100; + autoRefresh = GUI.Toggle(refreshRect, autoRefresh, " Auto Refresh", styles.FilterToggle); + + using (var scope = new EditorGUI.DisabledScope(autoRefresh)) + { + rect.x = rect.width - 60; + rect.width = 60; + rect.height = 20; + rect.y -= 4; + if (GUI.Button(rect, "Refresh")) + { + updateEventList(); + } + } + } + + private void drawSelectedEvent(Rect rect) + { + if (eventList.SelectedId == -1) + { + GUI.Label(rect, "No event selected.", styles.EnterPlayModeText); + return; + } + + var transform = selectedEvent.State.Target; + var path = selectedEvent.State.TargetPath; + + GUI.Label(rect, string.Format("{0}\nPosition: {1}\nPrevious: {2}\nFlags: {3}, Buttons: {4}", + getEventString(eventList.SelectedId), selectedEvent.State.Position, + selectedEvent.State.PreviousPosition, selectedEvent.State.Flags, + PointerUtils.ButtonsToString(selectedEvent.State.Buttons))); + rect.y += 64; + rect.height = 20; + GUI.Label(rect, "Target: "); + using (var scope = new EditorGUI.DisabledScope(true)) + { + var fieldRect = new Rect(rect); + fieldRect.x += 50; + fieldRect.width -= 50; + EditorGUI.ObjectField(fieldRect, transform, typeof(Transform), true); + } + + if (path != null) + { + rect.y += 20; + rect.height = 16; + GUI.Label(rect, path, styles.SmallText); + } + } + + private bool drawTab(Rect rect, string content, bool selected) + { + switch (Event.current.type) + { + case EventType.MouseDown: + if (rect.Contains(Event.current.mousePosition)) + { + Event.current.Use(); + return true; + } + break; + case EventType.Layout: + case EventType.Repaint: + if (selected) GUI.DrawTexture(rect, styles.BG); + rect.x += styles.TabPadding; + GUI.Label(rect, content); + break; + } + + return false; + } + + private void drawPlaymodeText(Rect rect) + { + GUI.Label(rect, "Data is only available in Play Mode.", styles.EnterPlayModeText); + } + + private void drawPointerItem(int id, Rect rect, bool selected) + { + var bg = GUI.backgroundColor; + if (id == -1) + { + GUI.backgroundColor = styles.PointerItemEmpty; + GUI.Box(rect, "", styles.PointerItemStyle); + GUI.backgroundColor = bg; + return; + } + + if (selected) + { + GUI.backgroundColor = styles.PointerItemSelected; + } + + GUI.Box(rect, pointerStrings[id], styles.PointerItemStyle); + GUI.backgroundColor = bg; + } + + private void drawEventItem(int id, Rect rect, bool selected) + { + var bg = GUI.backgroundColor; + if (id == -1) + { + GUI.backgroundColor = styles.PointerItemEmpty; + GUI.Box(rect, "", styles.PointerItemStyle); + GUI.backgroundColor = bg; + return; + } + + if (selected) + { + GUI.backgroundColor = styles.PointerItemSelected; + } + + GUI.Box(rect, getEventString(id), styles.PointerItemStyle); + GUI.backgroundColor = bg; + + } + + #endregion + + #region List handlers + + private void pointerSelectionChangeHandler(int id) + { + selectPointer(); + } + + private void eventSelectionChangeHandler(int id) + { + selectEvent(); + } + + #endregion + + private class PointerVisualizer : UnityEngine.Object + { + + private int currentDebugId = -1; + + public PointerVisualizer() + { + } + + public void Show(Vector2 position) + { + if (currentDebugId != -1) Hide(); + currentDebugId = GLDebug.DrawSquareScreenSpace(position, 0, Vector2.one * 20, GLDebug.MULTIPLY, float.MaxValue); + } + + public void Hide() + { + GLDebug.RemoveFigure(currentDebugId); + currentDebugId = -1; + } + + } + + [Serializable] + private class FilterState : ISerializationCallbackReceiver + { + + private const string KEY = "TouchScript:Debugger:FilterState"; + + [SerializeField] + private List pointerEvents; + + public uint PointerEventMask + { + get + { + return BinaryUtils.ToBinaryMask(pointerEvents); + } + } + + public FilterState() + { + var eventsCount = Enum.GetValues(typeof(PointerEvent)).Length; + pointerEvents = new List(eventsCount); + syncPointerEvents(eventsCount); + } + + public bool IsEventEnabled(PointerEvent evt) + { + var id = (int)evt; + if (id >= pointerEvents.Count) return false; + return pointerEvents[id]; + } + + public void SetEventValue(PointerEvent evt, bool value) + { + pointerEvents[(int)evt] = value; + } + + public void Save() + { + var json = JsonUtility.ToJson(this); + EditorPrefs.SetString(KEY, json); + } + + public void Load() + { + if (!EditorPrefs.HasKey(KEY)) return; + var json = EditorPrefs.GetString(KEY); + JsonUtility.FromJsonOverwrite(json, this); + } + + private void syncPointerEvents(int count) + { + for (var i = pointerEvents.Count; i < count; i++) pointerEvents.Add(true); + } + + public void OnBeforeSerialize() + { + } + + public void OnAfterDeserialize() + { + var eventsCount = Enum.GetValues(typeof(PointerEvent)).Length; + if (pointerEvents.Count != eventsCount) + { + Debug.Log("FilterState serialization error!"); + if (pointerEvents.Count > eventsCount) + { + pointerEvents = new List(eventsCount); + } + syncPointerEvents(eventsCount); + } + } + } + + } +} + +#endif \ No newline at end of file diff --git a/Source/Assets/TouchScript/Editor/Debugging/PointerDebuggerWindow.cs.meta b/Source/Assets/TouchScript/Editor/Debugging/PointerDebuggerWindow.cs.meta new file mode 100644 index 000000000..f147fa5be --- /dev/null +++ b/Source/Assets/TouchScript/Editor/Debugging/PointerDebuggerWindow.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1684ac3d3422e4b458a73b6955a0cae3 +timeCreated: 1500410762 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Editor/EditorUI.meta b/Source/Assets/TouchScript/Editor/EditorUI.meta new file mode 100644 index 000000000..f8c1b5255 --- /dev/null +++ b/Source/Assets/TouchScript/Editor/EditorUI.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 3b24d098c65af4192a812e7d9e2862ef +folderAsset: yes +timeCreated: 1500501530 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Editor/Utils/GUIElements.cs b/Source/Assets/TouchScript/Editor/EditorUI/GUIElements.cs similarity index 98% rename from Source/Assets/TouchScript/Editor/Utils/GUIElements.cs rename to Source/Assets/TouchScript/Editor/EditorUI/GUIElements.cs index 26550800a..8c2642aae 100644 --- a/Source/Assets/TouchScript/Editor/Utils/GUIElements.cs +++ b/Source/Assets/TouchScript/Editor/EditorUI/GUIElements.cs @@ -6,7 +6,7 @@ using UnityEditor; using System.Reflection; -namespace TouchScript.Editor.Utils +namespace TouchScript.Editor.EditorUI { internal static class GUIElements { diff --git a/Source/Assets/TouchScript/Editor/Utils/GUIElements.cs.meta b/Source/Assets/TouchScript/Editor/EditorUI/GUIElements.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Editor/Utils/GUIElements.cs.meta rename to Source/Assets/TouchScript/Editor/EditorUI/GUIElements.cs.meta diff --git a/Source/Assets/TouchScript/Editor/EditorUI/GUIUtils.cs b/Source/Assets/TouchScript/Editor/EditorUI/GUIUtils.cs new file mode 100644 index 000000000..61c1e7ca3 --- /dev/null +++ b/Source/Assets/TouchScript/Editor/EditorUI/GUIUtils.cs @@ -0,0 +1,34 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using UnityEngine; + +namespace TouchScript.Editor.EditorUI +{ + + public static class GUIUtils + { + + public static Rect GetPaddedRect(int minHeight, int padding, bool expandHeight = false) + { + Rect rect; + if (expandHeight) + rect = GUILayoutUtility.GetRect(padding * 2, minHeight + padding * 2, GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true)); + else + rect = GUILayoutUtility.GetRect(padding * 2, minHeight + padding * 2, GUILayout.ExpandWidth(true)); + ContractRect(ref rect, padding); + return rect; + } + + public static void ContractRect(ref Rect rect, int delta) + { + rect.x += delta; + rect.y += delta; + rect.width -= delta * 2; + rect.height -= delta * 2; + } + + } + +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Editor/EditorUI/GUIUtils.cs.meta b/Source/Assets/TouchScript/Editor/EditorUI/GUIUtils.cs.meta new file mode 100644 index 000000000..79a3041ab --- /dev/null +++ b/Source/Assets/TouchScript/Editor/EditorUI/GUIUtils.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e4af8ab947e1c4b959f59dba2bce9dc3 +timeCreated: 1500502342 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Editor/EditorUI/PagedList.cs b/Source/Assets/TouchScript/Editor/EditorUI/PagedList.cs new file mode 100644 index 000000000..cddeae0ca --- /dev/null +++ b/Source/Assets/TouchScript/Editor/EditorUI/PagedList.cs @@ -0,0 +1,199 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using System; +using UnityEditor; +using UnityEngine; + +namespace TouchScript.Editor.EditorUI +{ + + public class PagedList + { + + private class Styles + { + public int HeaderHeight = 0; + public int FooterHeight = 20; + + public int FooterButtonWidth = 60; + public int FooterButtonHeight = 20; + public int FooterButtonSpace = 10; + public int FooterTextWidth = 8; + + public GUIContent TextPrev = new GUIContent("< Prev"); + public GUIContent TextNext = new GUIContent("Next >"); + + public int GetIntFieldSize(int value) + { + if (value < 10) return FooterTextWidth + 8; + if (value < 100) return 2 * FooterTextWidth + 8; + if (value < 1000) return 3 * FooterTextWidth + 8; + return 4; + } + } + + public int ItemHeight { get; set; } + public int Count + { + get + { + return count; + } + set + { + if (count == value) return; + count = value; + reset(); + } + } + public int PagesTotal + { + get + { + return pagesTotal; + } + } + public int SelectedId + { + get + { + return selectedId; + } + } + + private static Styles styles; + + private Action onSelectionChange; + private Action drawItem; + + private int count = 0; + // Starts from 1 + private int page = 1; + private int pagesTotal = 1; + private int itemsPerPage = 1; + + private int selectedId = -1; + private int oldSelectedId = -1; + + public PagedList(int itemHeight, Action drawItem, Action onSelectionChange) + { + if (styles == null) styles = new Styles(); + + ItemHeight = itemHeight; + this.onSelectionChange = onSelectionChange; + this.drawItem = drawItem; + } + + public int FitHeight(int numberOfItems) + { + return ItemHeight * numberOfItems + styles.FooterHeight + styles.HeaderHeight; + } + + public void Draw(Rect rect) + { + var h = rect.height; + h -= styles.HeaderHeight + styles.FooterHeight; + if (h < 0) return; + rect.y += styles.HeaderHeight; + rect.height = ItemHeight; + + itemsPerPage = Mathf.FloorToInt(h / 22f); + pagesTotal = Mathf.CeilToInt((float)count / itemsPerPage); + + int start = (Count - 1) - (page - 1) * itemsPerPage; + if (start < 0) return; + + var i = start; + var t = 0; + while (t < itemsPerPage) + { + if (i < 0) draw(-1, rect); + else draw(i, rect); + rect.y += ItemHeight; + i--; + t++; + } + + rect.height = styles.FooterHeight; + drawFooter(rect); + + if (oldSelectedId != selectedId) + { + oldSelectedId = selectedId; + onSelectionChange(selectedId); + } + } + + private void drawFooter(Rect parentRect) + { + parentRect.y += 5; + parentRect.height -= 5; + + var rect = new Rect(parentRect.x, parentRect.y, styles.FooterButtonWidth, styles.FooterButtonHeight); + if (GUI.Button(rect, styles.TextPrev)) + { + setPage(page - 1); + } + + rect.x += rect.width + styles.FooterButtonSpace; + rect.width = styles.GetIntFieldSize(page); + var newPage = EditorGUI.DelayedIntField(rect, page); + if (page != newPage) setPage(newPage); + + rect.x += rect.width + styles.FooterButtonSpace; + rect.width = 16; + GUI.Label(rect, "of"); + + rect.x += rect.width + styles.FooterButtonSpace; + rect.width = styles.GetIntFieldSize(page); + + using (var scope = new EditorGUI.DisabledScope(true)) + { + EditorGUI.IntField(rect, PagesTotal); + } + + rect.x += rect.width + styles.FooterButtonSpace; + rect.width = styles.FooterButtonWidth; + if (GUI.Button(rect, styles.TextNext)) + { + setPage(page + 1); + } + } + + private void draw(int id, Rect rect) + { + switch (Event.current.type) + { + case EventType.Repaint: + case EventType.Layout: + drawItem(id, rect, selectedId == id); + break; + case EventType.MouseDown: + if (rect.Contains(Event.current.mousePosition)) + { + selectedId = id; + Event.current.Use(); + //GUI.changed = true; + } + break; + } + } + + private void setPage(int newPage) + { + if (newPage < 1) newPage = 1; + else if (newPage > PagesTotal) newPage = PagesTotal; + page = newPage; + } + + private void reset() + { + page = 1; + selectedId = -1; + oldSelectedId = -1; + } + + } +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Editor/EditorUI/PagedList.cs.meta b/Source/Assets/TouchScript/Editor/EditorUI/PagedList.cs.meta new file mode 100644 index 000000000..5d52de706 --- /dev/null +++ b/Source/Assets/TouchScript/Editor/EditorUI/PagedList.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 52832a1748b2b4dfaae6bcec7cf1721e +timeCreated: 1500501497 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs index 25934c571..165867da8 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs @@ -3,7 +3,7 @@ */ using System; -using TouchScript.Editor.Utils; +using TouchScript.Editor.EditorUI; using TouchScript.Gestures; using UnityEditor; using UnityEditorInternal; @@ -83,7 +83,7 @@ protected virtual void OnEnable() maxPointersFloat = maxPointers.intValue; friendlyGesturesList = new ReorderableList(serializedObject, friendlyGestures, false, true, false, true); - friendlyGesturesList.drawHeaderCallback += (rect) => GUI.Label(rect, TEXT_FRIENDLY); + friendlyGesturesList.drawHeaderCallback += (rect) => GUI.Label(rect, TEXT_FRIENDLY); friendlyGesturesList.drawElementCallback += (rect, index, active, focused) => { rect.height = 16; diff --git a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/PinnedTransformGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/PinnedTransformGestureEditor.cs index e1317e19c..f451f970b 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/PinnedTransformGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/PinnedTransformGestureEditor.cs @@ -6,7 +6,7 @@ using TouchScript.Gestures.TransformGestures; using UnityEditor; using UnityEngine; -using TouchScript.Editor.Utils; +using TouchScript.Editor.EditorUI; namespace TouchScript.Editor.Gestures.TransformGestures { diff --git a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/TransformGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/TransformGestureEditor.cs index d6be51588..026973fa1 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/TransformGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/TransformGestureEditor.cs @@ -5,8 +5,7 @@ using TouchScript.Editor.Gestures.TransformGestures.Base; using TouchScript.Gestures.TransformGestures; using UnityEditor; -using UnityEngine; -using TouchScript.Editor.Utils; +using TouchScript.Editor.EditorUI; namespace TouchScript.Editor.Gestures.TransformGestures { diff --git a/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs b/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs index 2fa033690..1011c4169 100644 --- a/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs +++ b/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs @@ -5,8 +5,7 @@ using TouchScript.InputSources; using UnityEditor; using UnityEngine; -using TouchScript.Editor.Utils; -using System.Reflection; +using TouchScript.Editor.EditorUI; namespace TouchScript.Editor.InputSources { diff --git a/Source/Assets/TouchScript/Editor/Layers/StandardLayerEditor.cs b/Source/Assets/TouchScript/Editor/Layers/StandardLayerEditor.cs index cceb98449..0fa210c2b 100644 --- a/Source/Assets/TouchScript/Editor/Layers/StandardLayerEditor.cs +++ b/Source/Assets/TouchScript/Editor/Layers/StandardLayerEditor.cs @@ -2,7 +2,7 @@ * @author Valentin Simonov / http://va.lent.in/ */ -using TouchScript.Editor.Utils; +using TouchScript.Editor.EditorUI; using TouchScript.Layers; using UnityEditor; using UnityEngine; diff --git a/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs b/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs index 4b72c1343..c62f60271 100644 --- a/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs +++ b/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs @@ -5,7 +5,7 @@ using System.Collections.Generic; using System.Linq; using TouchScript.Devices.Display; -using TouchScript.Editor.Utils; +using TouchScript.Editor.EditorUI; using TouchScript.Layers; using UnityEditor; using UnityEditorInternal; diff --git a/Source/Assets/TouchScript/Editor/TouchScriptSettingsWindow.cs b/Source/Assets/TouchScript/Editor/TouchScriptSettingsWindow.cs index e61eae7ec..0afdc12a7 100644 --- a/Source/Assets/TouchScript/Editor/TouchScriptSettingsWindow.cs +++ b/Source/Assets/TouchScript/Editor/TouchScriptSettingsWindow.cs @@ -79,7 +79,7 @@ private void OnGUI() init(); var headerRect = GUILayoutUtility.GetRect(width, 165); - GUI.Box(headerRect, "v. " + TouchManager.VERSION + GUI.Box(headerRect, "v. " + TouchManager.VERSION + (string.IsNullOrEmpty(TouchManager.VERSION_SUFFIX) ? "" : " " + TouchManager.VERSION_SUFFIX), header); EditorGUILayout.BeginHorizontal(); diff --git a/Source/Assets/TouchScript/Examples/Checkers/Scripts/Exclusive.cs b/Source/Assets/TouchScript/Examples/Checkers/Scripts/Exclusive.cs index dd94ceb07..d4c978979 100644 --- a/Source/Assets/TouchScript/Examples/Checkers/Scripts/Exclusive.cs +++ b/Source/Assets/TouchScript/Examples/Checkers/Scripts/Exclusive.cs @@ -27,7 +27,7 @@ private void Awake() private void Update() { - if (UnityEngine.Input.GetKey(KeyCode.Space)) + if (Input.GetKey(KeyCode.Space)) { exclusive = true; cachedRenderer.material.SetColor("_SpecColor", Color); diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/MouseCursor.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/MouseCursor.cs index cea422561..a41f4bd7e 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/MouseCursor.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/MouseCursor.cs @@ -53,7 +53,7 @@ protected override void generateText(MousePointer pointer, StringBuilder str) { if (str.Length > 0) str.Append("\n"); str.Append("Buttons: "); - PointerUtils.ButtonsToString(pointer.Buttons, str); + PointerUtils.PressedButtonsToString(pointer.Buttons, str); } } diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PenCursor.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PenCursor.cs index 34854c3e1..9df51a562 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PenCursor.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PenCursor.cs @@ -57,7 +57,7 @@ protected override void generateText(PenPointer pointer, StringBuilder str) { if (str.Length > 0) str.Append("\n"); str.Append("Buttons: "); - PointerUtils.ButtonsToString(pointer.Buttons, str); + PointerUtils.PressedButtonsToString(pointer.Buttons, str); } if (ShowPressure) { diff --git a/Source/Assets/TouchScript/Scripts/Debugging.meta b/Source/Assets/TouchScript/Scripts/Debugging.meta new file mode 100644 index 000000000..ee42eb880 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Debugging.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a5ad27a8cf0eb496896014e5ba7e3064 +folderAsset: yes +timeCreated: 1500411050 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Debugging/Filters.meta b/Source/Assets/TouchScript/Scripts/Debugging/Filters.meta new file mode 100644 index 000000000..331e6e464 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Debugging/Filters.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 3c6e68831a3cb493b92de8387c4bc2e5 +folderAsset: yes +timeCreated: 1500522281 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Debugging/Filters/IPointerDataFilter.cs b/Source/Assets/TouchScript/Scripts/Debugging/Filters/IPointerDataFilter.cs new file mode 100644 index 000000000..4127ec98f --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Debugging/Filters/IPointerDataFilter.cs @@ -0,0 +1,17 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +#if TOUCHSCRIPT_DEBUG + +using UnityEngine; + +namespace TouchScript.Debugging.Filters +{ + public interface IPointerDataFilter + { + + } +} + +#endif \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Debugging/Filters/IPointerDataFilter.cs.meta b/Source/Assets/TouchScript/Scripts/Debugging/Filters/IPointerDataFilter.cs.meta new file mode 100644 index 000000000..701149ead --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Debugging/Filters/IPointerDataFilter.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9538172481b6a4ba4920474db907b74f +timeCreated: 1500511734 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Debugging/Filters/IPointerLogFilter.cs b/Source/Assets/TouchScript/Scripts/Debugging/Filters/IPointerLogFilter.cs new file mode 100644 index 000000000..7c729e03c --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Debugging/Filters/IPointerLogFilter.cs @@ -0,0 +1,18 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +#if TOUCHSCRIPT_DEBUG + +using TouchScript.Debugging.Loggers; +using UnityEngine; + +namespace TouchScript.Debugging.Filters +{ + public interface IPointerLogFilter + { + bool Applies(ref PointerLog log); + } +} + +#endif \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Debugging/Filters/IPointerLogFilter.cs.meta b/Source/Assets/TouchScript/Scripts/Debugging/Filters/IPointerLogFilter.cs.meta new file mode 100644 index 000000000..078e12061 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Debugging/Filters/IPointerLogFilter.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e5a25273a78344e5688902b5d13e9a38 +timeCreated: 1500513432 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Debugging/Filters/PointerLogFilter.cs b/Source/Assets/TouchScript/Scripts/Debugging/Filters/PointerLogFilter.cs new file mode 100644 index 000000000..df285cc2a --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Debugging/Filters/PointerLogFilter.cs @@ -0,0 +1,32 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +#if TOUCHSCRIPT_DEBUG + +using TouchScript.Debugging.Loggers; + +namespace TouchScript.Debugging.Filters +{ + public class PointerLogFilter : IPointerLogFilter + { + + public uint EventMask { get; set; } + + public PointerLogFilter() + { + EventMask = uint.MaxValue; + } + + public bool Applies(ref PointerLog log) + { + var evt = (int)log.Event; + if ((EventMask & (uint)(1 << evt)) == 0) return false; + + return true; + } + + } +} + +#endif \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Debugging/Filters/PointerLogFilter.cs.meta b/Source/Assets/TouchScript/Scripts/Debugging/Filters/PointerLogFilter.cs.meta new file mode 100644 index 000000000..9ba0124f0 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Debugging/Filters/PointerLogFilter.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ce62e2e87231b4fdc83e8c56eeb08b89 +timeCreated: 1500522632 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Utils/DebugUtils.meta b/Source/Assets/TouchScript/Scripts/Debugging/GL.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/Utils/DebugUtils.meta rename to Source/Assets/TouchScript/Scripts/Debugging/GL.meta diff --git a/Source/Assets/TouchScript/Scripts/Debugging/GL/DebugHelper.cs b/Source/Assets/TouchScript/Scripts/Debugging/GL/DebugHelper.cs new file mode 100644 index 000000000..53423adb1 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Debugging/GL/DebugHelper.cs @@ -0,0 +1,20 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +#if TOUCHSCRIPT_DEBUG + +using UnityEngine; + +namespace TouchScript.Debugging.GL +{ + public static class DebugHelper + { + public static int GetDebugId(Object obj) + { + return int.MinValue + (obj.GetInstanceID() << 10); + } + } +} + +#endif \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Debugging/GL/DebugHelper.cs.meta b/Source/Assets/TouchScript/Scripts/Debugging/GL/DebugHelper.cs.meta new file mode 100644 index 000000000..5b1668f61 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Debugging/GL/DebugHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 62efb084f73cc4f86b954d1a5109e015 +timeCreated: 1447582130 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Debugging/GL/GLDebug.cs b/Source/Assets/TouchScript/Scripts/Debugging/GL/GLDebug.cs new file mode 100644 index 000000000..19ad71363 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Debugging/GL/GLDebug.cs @@ -0,0 +1,625 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + * Based on http://pastebin.com/69QP1s45 + */ + + +#if TOUCHSCRIPT_DEBUG + +using System.Collections.Generic; +using UnityEngine; + +namespace TouchScript.Debugging.GL +{ + public class GLDebug : MonoBehaviour + { + + public static readonly Color MULTIPLY = new Color(0, 0, 0, 0); + public static readonly Vector2 DEFAULT_SCREEN_SPACE_SCALE = new Vector2(10, 10); + + private static GLDebug instance + { + get + { + if (!_instance && Application.isPlaying) + { + if (Camera.main) + { + _instance = Camera.main.gameObject.AddComponent(); + } + else + { + var go = new GameObject("GLDebug"); + var camera = go.AddComponent(); + camera.clearFlags = CameraClearFlags.Nothing; + camera.depth = 9000; + _instance = go.AddComponent(); + } + } + return _instance; + } + } + + public KeyCode ToggleKey; + public bool DisplayLines = true; + + private static GLDebug _instance; + + private static int nextFigureId = 1; + private Material materialDepthTest; + private Material materialNoDepthTest; + private Material materialMultiplyDepthTest; + private Material materialMultiplyNoDepthTest; + private Dictionary figuresDepthTest; + private Dictionary figuresMultiplyDepthTest; + private Dictionary figuresNoDepthTest; + private Dictionary figuresMultiplyNoDepthTest; + private Dictionary figuresScreenSpace; + private Dictionary figuresMultiplyScreenSpace; + private Dictionary figuresTmp; + + #region Public methods + + public static void RemoveFigure(int id) + { + instance.figuresDepthTest.Remove(id); + instance.figuresNoDepthTest.Remove(id); + instance.figuresScreenSpace.Remove(id); + instance.figuresMultiplyDepthTest.Remove(id); + instance.figuresMultiplyNoDepthTest.Remove(id); + instance.figuresMultiplyScreenSpace.Remove(id); + } + + #region Line + + public static int DrawLine(Vector3 start, Vector3 end, Color? color = null, float duration = 0, bool depthTest = false) + { + return DrawLine(null, start, end, color, duration, depthTest); + } + + public static int DrawLine(int? id, Vector3 start, Vector3 end, Color? color = null, float duration = 0, bool depthTest = false) + { + return drawFigure(id, new List() { new Line(start, end) }, color ?? Color.white, duration, depthTest); + } + + public static int DrawLineScreenSpace(Vector2 start, Vector2 end, Color? color = null, float duration = 0) + { + return DrawLineScreenSpace(null, start, end, color, duration); + } + + public static int DrawLineScreenSpace(int? id, Vector2 start, Vector2 end, Color? color = null, float duration = 0) + { + return drawFigureScreenSpace(id, new List() { new Line(start, end) }, color ?? Color.white, duration); + } + + #endregion + + #region Ray + + public static int DrawRay(Vector3 start, Vector3 dir, Color? color = null, float duration = 0, bool depthTest = false) + { + return DrawRay(null, start, dir, color, duration, depthTest); + } + + public static int DrawRay(int? id, Vector3 start, Vector3 dir, Color? color = null, float duration = 0, bool depthTest = false) + { + if (dir == Vector3.zero) + return 0; + return DrawLine(start, start + dir, color, duration, depthTest); + } + + #endregion + + #region Cross + + public static int DrawCross(Vector3 pos, Quaternion? rot = null, Vector3? scale = null, Color? color = null, float duration = 0, bool depthTest = false) + { + return DrawCross(null, Matrix4x4.TRS(pos, rot ?? Quaternion.identity, scale ?? Vector3.one), color, duration, depthTest); + } + + public static int DrawCross(int? id, Vector3 pos, Quaternion? rot = null, Vector3? scale = null, Color? color = null, float duration = 0, bool depthTest = false) + { + return DrawCross(id, Matrix4x4.TRS(pos, rot ?? Quaternion.identity, scale ?? Vector3.one), color, duration, depthTest); + } + + public static int DrawCross(Matrix4x4 matrix, Color? color = null, float duration = 0, bool depthTest = false) + { + return DrawCross(null, matrix, color, duration, depthTest); + } + + public static int DrawCross(int? id, Matrix4x4 matrix, Color? color = null, float duration = 0, bool depthTest = false) + { + return drawFigure(id, createCrossLines(matrix), color ?? Color.white, duration, depthTest); + } + + public static int DrawCrossScreenSpace(Vector2 pos, float rot = 0, Vector2? scale = null, Color? color = null, float duration = 0) + { + return DrawCrossScreenSpace(null, pos, rot, scale, color, duration); + } + + public static int DrawCrossScreenSpace(int? id, Vector2 pos, float rot = 0, Vector2? scale = null, Color? color = null, float duration = 0) + { + return drawFigureScreenSpace(id, createScreenSpaceCrossLines(pos, rot, scale ?? DEFAULT_SCREEN_SPACE_SCALE), color ?? Color.white, duration); + } + + #endregion + + #region Arrow + + public static int DrawArrow(Vector3 start, Vector3 end, float arrowHeadLength = 0.25f, float arrowHeadAngle = 20, Color? color = null, float duration = 0, bool depthTest = false) + { + return DrawArrow(null, start, end, arrowHeadLength, arrowHeadAngle, color, duration, depthTest); + } + + public static int DrawArrow(int? id, Vector3 start, Vector3 end, float arrowHeadLength = 0.25f, float arrowHeadAngle = 20, Color? color = null, float duration = 0, bool depthTest = false) + { + if (start == end) + return 0; + + return drawFigure(id, createArrowLines(start, end, arrowHeadLength, arrowHeadAngle), color ?? Color.white, duration, depthTest); + } + + #endregion + + #region Plane with normal + + public static int DrawPlaneWithNormal(Vector3 pos, Vector3 normal, float scale = 1f, Color? color = null, float duration = 0, bool depthTest = false) + { + return DrawPlaneWithNormal(null, pos, normal, scale, color, duration, depthTest); + } + + public static int DrawPlaneWithNormal(int? id, Vector3 pos, Vector3 normal, float scale = 1f, Color? color = null, float duration = 0, bool depthTest = false) + { + var lines = createArrowLines(pos, pos + normal); + lines.AddRange(createCrossLines(Matrix4x4.TRS(pos, Quaternion.LookRotation(normal) * Quaternion.Euler(0, 0, 45f), Vector3.one))); + lines.AddRange(createSquareLines(Matrix4x4.TRS(pos, Quaternion.FromToRotation(Vector3.up, normal), Vector3.one * scale))); + return drawFigure(id, lines, color ?? Color.white, duration, depthTest); + } + + #endregion + + #region Line with cross + + public static int DrawLineWithCross(Vector3 start, Vector3 end, float crossRelativePosition = 0.5f, Vector3? scale = null, Color? color = null, float duration = 0, bool depthTest = false) + { + return DrawLineWithCross(null, start, end, crossRelativePosition, scale, color, duration, depthTest); + } + + public static int DrawLineWithCross(int? id, Vector3 start, Vector3 end, float crossRelativePosition = 0.5f, Vector3? scale = null, Color? color = null, float duration = 0, bool depthTest = false) + { + var lines = new List() {new Line(start, end)}; + // TODO: Calculate cross rotation + lines.AddRange(createCrossLines(Matrix4x4.TRS(Vector3.Lerp(start, end, crossRelativePosition), Quaternion.identity, scale ?? Vector3.one))); + return drawFigure(id, lines, color ?? Color.white, duration, depthTest); + } + + public static int DrawLineWithCrossScreenSpace(Vector2 start, Vector2 end, float crossRelativePosition, Vector2? scale = null, Color? color = null, float duration = 0) + { + return DrawLineWithCrossScreenSpace(null, start, end, crossRelativePosition, scale, color, duration); + } + + public static int DrawLineWithCrossScreenSpace(int? id, Vector2 start, Vector2 end, float crossRelativePosition, Vector2? scale = null, Color? color = null, float duration = 0) + { + var lines = new List() {new Line(start, end)}; + lines.AddRange(createScreenSpaceCrossLines(Vector2.Lerp(start, end, crossRelativePosition), Mathf.Atan2(end.y - start.y, end.x - start.x) * Mathf.Rad2Deg + 45f, scale ?? Vector2.one * 10)); + return drawFigureScreenSpace(id, lines, color ?? Color.white, duration); + } + + #endregion + + #region Square + + public static int DrawSquare(Vector3 pos, Quaternion? rot = null, Vector3? scale = null, Color? color = null, float duration = 0, bool depthTest = false) + { + return DrawSquare(null, pos, rot, scale, color, duration, depthTest); + } + + public static int DrawSquare(int? id, Vector3 pos, Quaternion? rot = null, Vector3? scale = null, Color? color = null, float duration = 0, bool depthTest = false) + { + return DrawSquare(Matrix4x4.TRS(pos, rot ?? Quaternion.identity, scale ?? Vector3.one), color, duration, depthTest); + } + + public static int DrawSquare(Matrix4x4 matrix, Color? color = null, float duration = 0, bool depthTest = false) + { + return DrawSquare(null, matrix, color, duration, depthTest); + } + + public static int DrawSquare(int? id, Matrix4x4 matrix, Color? color = null, float duration = 0, bool depthTest = false) + { + return drawFigure(id, createSquareLines(matrix), color ?? Color.white, duration, depthTest); + } + + public static int DrawSquareScreenSpace(Vector2 pos, float rot = 0, Vector2? scale = null, Color? color = null, float duration = 0) + { + return DrawSquareScreenSpace(null, pos, rot, scale, color, duration); + } + + public static int DrawSquareScreenSpace(int? id, Vector2 pos, float rot = 0, Vector2? scale = null, Color? color = null, float duration = 0) + { + return drawFigureScreenSpace(id, createScreenSpaceSquareLines(pos, rot, scale ?? DEFAULT_SCREEN_SPACE_SCALE), color ?? Color.white, duration); + } + + #endregion + + #region Cube + + public static int DrawCube(Vector3 pos, Quaternion? rot = null, Vector3? scale = null, Color? color = null, float duration = 0, bool depthTest = false) + { + return DrawCube(null, pos, rot, scale, color, duration, depthTest); + } + + public static int DrawCube(int? id, Vector3 pos, Quaternion? rot = null, Vector3? scale = null, Color? color = null, float duration = 0, bool depthTest = false) + { + return DrawCube(Matrix4x4.TRS(pos, rot ?? Quaternion.identity, scale ?? Vector3.one), color, duration, depthTest); + } + + public static int DrawCube(Matrix4x4 matrix, Color? color = null, float duration = 0, bool depthTest = false) + { + return DrawCube(null, matrix, color, duration, depthTest); + } + + public static int DrawCube(int? id, Matrix4x4 matrix, Color? color = null, float duration = 0, bool depthTest = false) + { + return drawFigure(id, createCubeLines(matrix), color ?? Color.white, duration, depthTest); + } + + #endregion + + #endregion + + #region Unity methods + + private void Awake() + { + if (_instance) + { + Destroy(this); + return; + } + + _instance = this; + figuresDepthTest = new Dictionary(); + figuresNoDepthTest = new Dictionary(); + figuresScreenSpace = new Dictionary(); + figuresMultiplyDepthTest = new Dictionary(); + figuresMultiplyNoDepthTest = new Dictionary(); + figuresMultiplyScreenSpace = new Dictionary(); + figuresTmp = new Dictionary(); + + setMaterials(); + } + + private void Update() + { + if (Input.GetKeyDown(ToggleKey)) + DisplayLines = !DisplayLines; + } + + private void OnPostRender() + { + if (!DisplayLines) return; + + materialDepthTest.SetPass(0); + UnityEngine.GL.Begin(UnityEngine.GL.LINES); + figuresDepthTest = draw(figuresDepthTest); + UnityEngine.GL.End(); + + materialMultiplyDepthTest.SetPass(0); + UnityEngine.GL.Begin(UnityEngine.GL.LINES); + figuresMultiplyDepthTest = draw(figuresMultiplyDepthTest); + UnityEngine.GL.End(); + + materialNoDepthTest.SetPass(0); + UnityEngine.GL.Begin(UnityEngine.GL.LINES); + figuresNoDepthTest = draw(figuresNoDepthTest); + UnityEngine.GL.End(); + + materialMultiplyNoDepthTest.SetPass(0); + UnityEngine.GL.Begin(UnityEngine.GL.LINES); + figuresMultiplyNoDepthTest = draw(figuresMultiplyNoDepthTest); + UnityEngine.GL.End(); + + UnityEngine.GL.PushMatrix(); + UnityEngine.GL.LoadPixelMatrix(); + + materialNoDepthTest.SetPass(0); + UnityEngine.GL.Begin(UnityEngine.GL.LINES); + figuresScreenSpace = draw(figuresScreenSpace); + UnityEngine.GL.End(); + + materialMultiplyNoDepthTest.SetPass(0); + UnityEngine.GL.Begin(UnityEngine.GL.LINES); + figuresMultiplyScreenSpace = draw(figuresMultiplyScreenSpace); + UnityEngine.GL.End(); + UnityEngine.GL.PopMatrix(); + } + + #endregion + + #region Private functions + + #region Misc + + private Dictionary draw(Dictionary figures) + { + figuresTmp.Clear(); + var newFigures = figuresTmp; + foreach (var key in figures.Keys) + { + var value = figures[key]; + value.Duration = value.Draw(); + if (value.Duration > 0) + { + newFigures[key] = value; + } + } + figuresTmp = figures; + return newFigures; + } + + private void setMaterials() + { + materialDepthTest = new Material(Shader.Find("Hidden/DebugDepthTest")); + materialNoDepthTest = new Material(Shader.Find("Hidden/DebugNoDepthTest")); + materialMultiplyDepthTest = new Material(Shader.Find("Hidden/DebugMultiplyDepthTest")); + materialMultiplyNoDepthTest = new Material(Shader.Find("Hidden/DebugMultiplyNoDepthTest")); + materialDepthTest.hideFlags = HideFlags.HideAndDontSave; + materialNoDepthTest.hideFlags = HideFlags.HideAndDontSave; + materialMultiplyDepthTest.hideFlags = HideFlags.HideAndDontSave; + materialMultiplyNoDepthTest.hideFlags = HideFlags.HideAndDontSave; + } + + #endregion + + #region Figure creation + + private static int drawFigure(int? id, List lines, Color color, float duration = 0, bool depthTest = false) + { + if (duration == 0 && !instance.DisplayLines) + return 0; + + int figureId; + if (id.HasValue) + { + figureId = id.Value; + RemoveFigure(figureId); + } + else + { + figureId = nextFigureId++; + } + if (depthTest) + { + if (color == MULTIPLY) instance.figuresMultiplyDepthTest.Add(figureId, new Figure(figureId, lines, Color.white, duration)); + else instance.figuresDepthTest.Add(figureId, new Figure(figureId, lines, color, duration)); + } + else + { + if (color == MULTIPLY) instance.figuresMultiplyNoDepthTest.Add(figureId, new Figure(figureId, lines, Color.white, duration)); + else instance.figuresNoDepthTest.Add(figureId, new Figure(figureId, lines, color, duration)); + } + return figureId; + } + + private static int drawFigureScreenSpace(int? id, List lines, Color color, float duration = 0) + { + if (duration == 0 && !instance.DisplayLines) + return 0; + + int figureId; + if (id.HasValue) + { + figureId = id.Value; + RemoveFigure(figureId); + } + else + { + figureId = nextFigureId++; + } + + if (color == MULTIPLY) instance.figuresMultiplyScreenSpace.Add(figureId, new Figure(figureId, lines, Color.white, duration)); + else instance.figuresScreenSpace.Add(figureId, new Figure(figureId, lines, color, duration)); + return figureId; + } + + #endregion + + #region Line helpers + + private static List createCrossLines(Matrix4x4 matrix) + { + Vector3 + p_1 = matrix.MultiplyPoint3x4(new Vector3(-.5f, 0, 0)), + p_2 = matrix.MultiplyPoint3x4(new Vector3(.5f, 0, 0)), + p_3 = matrix.MultiplyPoint3x4(new Vector3(0, -.5f, 0)), + p_4 = matrix.MultiplyPoint3x4(new Vector3(0, .5f, 0)); + + return new List() + { + new Line(p_1, p_2), + new Line(p_3, p_4), + }; + } + + private static List createScreenSpaceCrossLines(Vector2 pos, float rot, Vector2 scale) + { + Vector2 p_1, p_2, p_3, p_4; + float x = .5f * scale.x; + float y = .5f * scale.y; + + if (rot == 0) + { + p_1 = new Vector2(-x, 0) + pos; + p_2 = new Vector2(x, 0) + pos; + p_3 = new Vector2(0, -y) + pos; + p_4 = new Vector2(0, y) + pos; + } + else + { + var cos = Mathf.Cos(rot * Mathf.Deg2Rad); + var sin = Mathf.Sin(rot * Mathf.Deg2Rad); + + p_1 = new Vector2(-x * cos, -x * sin) + pos; + p_2 = new Vector2(x * cos, x * sin) + pos; + p_3 = new Vector2(y * sin, -y * cos) + pos; + p_4 = new Vector2(-y * sin, y * cos) + pos; + } + + return new List() + { + new Line(p_1, p_2), + new Line(p_3, p_4), + }; + } + + private static List createArrowLines(Vector3 start, Vector3 end, float arrowHeadLength = 0.25f, float arrowHeadAngle = 20) + { + var dir = end - start; + Vector3 right = Quaternion.LookRotation(dir) * Quaternion.Euler(0, 180 + arrowHeadAngle, 0) * Vector3.forward; + Vector3 left = Quaternion.LookRotation(dir) * Quaternion.Euler(0, 180 - arrowHeadAngle, 0) * Vector3.forward; + + return new List() + { + new Line(start, end), + new Line(end, end + right * arrowHeadLength), + new Line(end, end + left * arrowHeadLength) + }; + } + + private static List createSquareLines(Matrix4x4 matrix) + { + Vector3 + p_1 = matrix.MultiplyPoint3x4(new Vector3(.5f, 0, .5f)), + p_2 = matrix.MultiplyPoint3x4(new Vector3(.5f, 0, -.5f)), + p_3 = matrix.MultiplyPoint3x4(new Vector3(-.5f, 0, -.5f)), + p_4 = matrix.MultiplyPoint3x4(new Vector3(-.5f, 0, .5f)); + + return new List() + { + new Line(p_1, p_2), + new Line(p_2, p_3), + new Line(p_3, p_4), + new Line(p_4, p_1) + }; + } + + private static List createScreenSpaceSquareLines(Vector2 pos, float rot, Vector2 scale) + { + Vector2 p_1, p_2, p_3, p_4; + float x = .5f * scale.x; + float y = .5f * scale.y; + + if (rot == 0) + { + p_1 = new Vector2(x, y) + pos; + p_2 = new Vector2(x, -y) + pos; + p_3 = new Vector2(-x, -y) + pos; + p_4 = new Vector2(-x, y) + pos; + } + else + { + var cos = Mathf.Cos(rot * Mathf.Deg2Rad); + var sin = Mathf.Sin(rot * Mathf.Deg2Rad); + + p_1 = new Vector2(x * cos - y * sin, x * sin + y * cos) + pos; + p_2 = new Vector2(x * cos + y * sin, x * sin - y * cos) + pos; + p_3 = new Vector2(-x * cos + y * sin, -x * sin - y * cos) + pos; + p_4 = new Vector2(-x * cos - y * sin, -x * sin + y * cos) + pos; + } + + return new List() + { + new Line(p_1, p_2), + new Line(p_2, p_3), + new Line(p_3, p_4), + new Line(p_4, p_1) + }; + } + + private static List createCubeLines(Matrix4x4 matrix) + { + Vector3 + down_1 = matrix.MultiplyPoint3x4(new Vector3(.5f, -.5f, .5f)), + down_2 = matrix.MultiplyPoint3x4(new Vector3(.5f, -.5f, -.5f)), + down_3 = matrix.MultiplyPoint3x4(new Vector3(-.5f, -.5f, -.5f)), + down_4 = matrix.MultiplyPoint3x4(new Vector3(-.5f, -.5f, .5f)), + up_1 = matrix.MultiplyPoint3x4(new Vector3(.5f, .5f, .5f)), + up_2 = matrix.MultiplyPoint3x4(new Vector3(.5f, .5f, -.5f)), + up_3 = matrix.MultiplyPoint3x4(new Vector3(-.5f, .5f, -.5f)), + up_4 = matrix.MultiplyPoint3x4(new Vector3(-.5f, .5f, .5f)); + + return new List() + { + new Line(down_1, down_2), + new Line(down_2, down_3), + new Line(down_3, down_4), + new Line(down_4, down_1), + + new Line(down_1, up_1), + new Line(down_2, up_2), + new Line(down_3, up_3), + new Line(down_4, up_4), + + new Line(up_1, up_2), + new Line(up_2, up_3), + new Line(up_3, up_4), + new Line(up_4, up_1) + }; + } + + #endregion + + #endregion + + #region Structs + + private struct Figure + { + public int Id; + public Color Color; + public float Duration; + public List Lines; + + public Figure(int id, List lines, Color color, float duration) + { + Id = id; + Color = color; + Duration = duration; + Lines = lines; + } + + public float Draw() + { + UnityEngine.GL.Color(Color); + for (var i = 0; i < Lines.Count; i++) + { + Lines[i].Draw(); + } + return Duration - Time.deltaTime; + } + } + + private struct Line + { + public Vector3 start; + public Vector3 end; + + public Line(Vector3 start, Vector3 end) + { + this.start = start; + this.end = end; + } + + public void Draw() + { + UnityEngine.GL.Vertex(start); + UnityEngine.GL.Vertex(end); + } + } + + #endregion + + } +} + +#endif \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Debugging/GL/GLDebug.cs.meta b/Source/Assets/TouchScript/Scripts/Debugging/GL/GLDebug.cs.meta new file mode 100644 index 000000000..35dd6354f --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Debugging/GL/GLDebug.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d2d72c9d6bd55482db3ece50442c7353 +timeCreated: 1447582131 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Debugging/Loggers.meta b/Source/Assets/TouchScript/Scripts/Debugging/Loggers.meta new file mode 100644 index 000000000..c939545fc --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Debugging/Loggers.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 8610da401c05e4500ab00da47d037853 +folderAsset: yes +timeCreated: 1500522275 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Debugging/Loggers/IPointerLogger.cs b/Source/Assets/TouchScript/Scripts/Debugging/Loggers/IPointerLogger.cs new file mode 100644 index 000000000..53d0dda63 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Debugging/Loggers/IPointerLogger.cs @@ -0,0 +1,67 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +#if TOUCHSCRIPT_DEBUG + +using System; +using System.Collections.Generic; +using TouchScript.Debugging.Filters; +using TouchScript.InputSources; +using TouchScript.Pointers; +using UnityEngine; + +namespace TouchScript.Debugging.Loggers +{ + public interface IPointerLogger + { + int PointerCount { get; } + + void Log(Pointer pointer, PointerEvent evt); + List GetFilteredPointerData(IPointerDataFilter filter = null); + List GetFilteredLogsForPointer(int id, IPointerLogFilter filter = null); + } + + [Serializable] + public struct PointerLog + { + public int Id; + public long Tick; + public int PointerId; + public PointerEvent Event; + public PointerState State; + } + + [Serializable] + public struct PointerState + { + public Pointer.PointerButtonState Buttons; + public Vector2 Position; + public Vector2 PreviousPosition; + public uint Flags; + public Transform Target; + public string TargetPath; + } + + [Serializable] + public struct PointerData + { + public int Id; + public Pointer.PointerType Type; + public IInputSource InputSource; + } + + public enum PointerEvent + { + None, + IDAllocated, + Added, + Updated, + Pressed, + Released, + Removed, + Cancelled + } +} + +#endif \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Debugging/Loggers/IPointerLogger.cs.meta b/Source/Assets/TouchScript/Scripts/Debugging/Loggers/IPointerLogger.cs.meta new file mode 100644 index 000000000..4064d563b --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Debugging/Loggers/IPointerLogger.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 36c90388cb60e47178ac7aeb22358611 +timeCreated: 1500411210 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Debugging/Loggers/PointerLogger.cs b/Source/Assets/TouchScript/Scripts/Debugging/Loggers/PointerLogger.cs new file mode 100644 index 000000000..dc1282b91 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Debugging/Loggers/PointerLogger.cs @@ -0,0 +1,110 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +#if TOUCHSCRIPT_DEBUG + +using System; +using System.Collections.Generic; +using TouchScript.Debugging.Filters; +using TouchScript.Pointers; +using TouchScript.Utils; + +namespace TouchScript.Debugging.Loggers +{ + public class PointerLogger : IPointerLogger + { + + private const int MIN_POINTER_LIST_SIZE = 1000; + + public int PointerCount + { + get + { + return pointerCount; + } + } + + + private int pointerCount = 0; + private int eventCount = 0; + + private List data = new List(1); + private List> events = new List>(1); + + public void Log(Pointer pointer, PointerEvent evt) + { + var id = checkId(pointer); + + var list = getPointerList(id); + list.Add(new PointerLog() + { + Id = eventCount, + Tick = DateTime.Now.Ticks, + PointerId = id, + Event = evt, + State = new PointerState() + { + Buttons = pointer.Buttons, + Position = pointer.Position, + PreviousPosition = pointer.PreviousPosition, + Flags = pointer.Flags, + Target = pointer.GetPressData().Target, + TargetPath = TransformUtils.GetHeirarchyPath(pointer.GetPressData().Target), + } + }); + eventCount++; + } + + public List GetFilteredPointerData(IPointerDataFilter filter = null) + { + //if (filter == null) + return new List(data); + } + + public List GetFilteredLogsForPointer(int id, IPointerLogFilter filter = null) + { + if (id < 0 || id >= pointerCount) + return new List(); + + List list = events[id]; + if (filter == null) + return new List(list); + + var count = list.Count; + List filtered = new List(count); + for (var i = 0; i < count; i++) + { + var item = list[i]; + if (filter.Applies(ref item)) filtered.Add(item); + } + return filtered; + } + + private IList getPointerList(int id) + { + return events[id]; + } + + private int checkId(Pointer pointer) + { + var id = pointer.Id; + if (id > pointerCount) throw new InvalidOperationException("Pointer id desync!"); + else if (id == pointerCount) + { + var list = new List(MIN_POINTER_LIST_SIZE); + events.Add(list); + data.Add(new PointerData() + { + Id = id, + Type = pointer.Type, + }); + pointerCount++; + } + + return id; + } + } +} + +#endif \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Debugging/Loggers/PointerLogger.cs.meta b/Source/Assets/TouchScript/Scripts/Debugging/Loggers/PointerLogger.cs.meta new file mode 100644 index 000000000..ce961f2d5 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Debugging/Loggers/PointerLogger.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c562664b792404515b96fe4cbbc06988 +timeCreated: 1500522240 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Debugging/TouchScriptDebugger.cs b/Source/Assets/TouchScript/Scripts/Debugging/TouchScriptDebugger.cs new file mode 100644 index 000000000..253743ed2 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Debugging/TouchScriptDebugger.cs @@ -0,0 +1,46 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +#if TOUCHSCRIPT_DEBUG + +using UnityEngine; +using UnityEditor; +using TouchScript.Debugging.Loggers; + +namespace TouchScript.Debugging +{ + public class TouchScriptDebugger + { + + public static TouchScriptDebugger Instance + { + get + { + if (!Application.isPlaying) return null; + if (instance == null) + { + instance = new TouchScriptDebugger(); + } + return instance; + } + } + + private static TouchScriptDebugger instance; + + public IPointerLogger PointerLogger + { + get { return pointerLogger; } + } + + private IPointerLogger pointerLogger; + + public TouchScriptDebugger() + { + pointerLogger = new PointerLogger(); + } + + } +} + +#endif \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Debugging/TouchScriptDebugger.cs.meta b/Source/Assets/TouchScript/Scripts/Debugging/TouchScriptDebugger.cs.meta new file mode 100644 index 000000000..6d43f116a --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Debugging/TouchScriptDebugger.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: feb5ce0eed35041f6a2db91bce359f03 +timeCreated: 1500411179 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/OnePointTrasformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/OnePointTrasformGestureBase.cs index 94edb7991..ab5d161e5 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/OnePointTrasformGestureBase.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/OnePointTrasformGestureBase.cs @@ -10,7 +10,7 @@ #if TOUCHSCRIPT_DEBUG using System.Collections; -using TouchScript.Utils.DebugUtils; +using TouchScript.Debugging.GL; #endif namespace TouchScript.Gestures.TransformGestures.Base diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs index 5538a5513..f03784d9e 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs @@ -9,7 +9,7 @@ using UnityEngine; #if TOUCHSCRIPT_DEBUG -using TouchScript.Utils.DebugUtils; +using TouchScript.Debugging.GL; #endif namespace TouchScript.Gestures.TransformGestures.Base diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TwoPointTransformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TwoPointTransformGestureBase.cs index 02f95f4c1..5094971dd 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TwoPointTransformGestureBase.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TwoPointTransformGestureBase.cs @@ -10,7 +10,7 @@ #if TOUCHSCRIPT_DEBUG using System.Collections; -using TouchScript.Utils.DebugUtils; +using TouchScript.Debugging.GL; #endif namespace TouchScript.Gestures.TransformGestures.Base diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs index 28d44e217..54a8bf645 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs @@ -8,7 +8,7 @@ using TouchScript.Utils.Geom; using TouchScript.Pointers; #if TOUCHSCRIPT_DEBUG -using TouchScript.Utils.DebugUtils; +using TouchScript.Debugging.GL; #endif using UnityEngine; diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs index 95929d26a..7f0fb56a1 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs @@ -9,7 +9,7 @@ using TouchScript.Utils; using TouchScript.Pointers; #if TOUCHSCRIPT_DEBUG -using TouchScript.Utils.DebugUtils; +using TouchScript.Debugging.GL; #endif using UnityEngine; diff --git a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs index f97661e15..0f2add4f8 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs @@ -304,6 +304,8 @@ public override string ToString() builder.Append(Type); builder.Append(", id: "); builder.Append(Id); + builder.Append(", buttons: "); + PointerUtils.PressedButtonsToString(Buttons, builder); builder.Append(", flags: "); BinaryUtils.ToBinaryString(Flags, builder, 8); builder.Append(", position: "); diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs index bf6969af7..0617763ee 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs @@ -14,7 +14,8 @@ using UnityEngine; #if TOUCHSCRIPT_DEBUG -using TouchScript.Utils.DebugUtils; +using TouchScript.Debugging.GL; +using TouchScript.Debugging.Loggers; #endif #if UNITY_5_4_OR_NEWER @@ -210,7 +211,11 @@ public IList PressedPointers #region Private variables - private static bool shuttingDown = false; +#if TOUCHSCRIPT_DEBUG + private TouchScript.Debugging.Loggers.IPointerLogger pLogger; +#endif + + private static bool shuttingDown = false; private static TouchManagerInstance instance; private bool shouldCreateCameraLayer = true; private bool shouldCreateStandardInput = true; @@ -369,12 +374,15 @@ internal void INTERNAL_AddPointer(Pointer pointer) { lock (pointerLock) { - pointer.INTERNAL_Init(nextPointerId++); + pointer.INTERNAL_Init(nextPointerId); pointersAdded.Add(pointer); #if TOUCHSCRIPT_DEBUG - if (DebugMode) Debug.Log("TouchScript > Pointer Added: " + pointer); + pLogger.Log(pointer, PointerEvent.IDAllocated); + if (DebugMode) Debug.Log("TouchScript > Pointer Added: " + pointer); #endif + + nextPointerId++; } } @@ -556,8 +564,12 @@ private void Awake() return; } +#if TOUCHSCRIPT_DEBUG + pLogger = Debugging.TouchScriptDebugger.Instance.PointerLogger; +#endif + #if UNITY_5_4_OR_NEWER - SceneManager.sceneLoaded += sceneLoadedHandler; + SceneManager.sceneLoaded += sceneLoadedHandler; #endif gameObject.hideFlags = HideFlags.HideInHierarchy; @@ -684,7 +696,11 @@ private void updateAdded(List pointers) this.pointers.Add(pointer); idToPointer.Add(pointer.Id, pointer); - for (var j = 0; j < layerCount; j++) +#if TOUCHSCRIPT_DEBUG + pLogger.Log(pointer, PointerEvent.Added); +#endif + + for (var j = 0; j < layerCount; j++) { var touchLayer = layers[j]; if (touchLayer == null) continue; @@ -718,7 +734,12 @@ private void updateUpdated(List pointers) continue; } list.Add(pointer); - var layer = pointer.GetPressData().Layer; + +#if TOUCHSCRIPT_DEBUG + pLogger.Log(pointer, PointerEvent.Updated); +#endif + + var layer = pointer.GetPressData().Layer; if (layer != null) layer.INTERNAL_UpdatePointer(pointer); else { @@ -758,6 +779,7 @@ private void updatePressed(List pointers) } list.Add(pointer); pressedPointers.Add(pointer); + HitData hit = pointer.GetOverData(); if (hit.Layer != null) { @@ -766,7 +788,11 @@ private void updatePressed(List pointers) } #if TOUCHSCRIPT_DEBUG - if (DebugMode) addDebugFigureForPointer(pointer); + pLogger.Log(pointer, PointerEvent.Pressed); +#endif + +#if TOUCHSCRIPT_DEBUG + if (DebugMode) addDebugFigureForPointer(pointer); #endif } @@ -792,7 +818,12 @@ private void updateReleased(List pointers) } list.Add(pointer); pressedPointers.Remove(pointer); - var layer = pointer.GetPressData().Layer; + +#if TOUCHSCRIPT_DEBUG + pLogger.Log(pointer, PointerEvent.Released); +#endif + + var layer = pointer.GetPressData().Layer; if (layer != null) layer.INTERNAL_ReleasePointer(pointer); #if TOUCHSCRIPT_DEBUG @@ -832,7 +863,11 @@ private void updateRemoved(List pointers) pressedPointers.Remove(pointer); list.Add(pointer); - for (var j = 0; j < layerCount; j++) +#if TOUCHSCRIPT_DEBUG + pLogger.Log(pointer, PointerEvent.Removed); +#endif + + for (var j = 0; j < layerCount; j++) { var touchLayer = layers[j]; if (touchLayer == null) continue; @@ -877,7 +912,11 @@ private void updateCancelled(List pointers) pressedPointers.Remove(pointer); list.Add(pointer); - for (var j = 0; j < layerCount; j++) +#if TOUCHSCRIPT_DEBUG + pLogger.Log(pointer, PointerEvent.Cancelled); +#endif + + for (var j = 0; j < layerCount; j++) { var touchLayer = layers[j]; if (touchLayer == null) continue; diff --git a/Source/Assets/TouchScript/Scripts/Utils/BinaryUtils.cs b/Source/Assets/TouchScript/Scripts/Utils/BinaryUtils.cs index 02914f396..e33149d2b 100644 --- a/Source/Assets/TouchScript/Scripts/Utils/BinaryUtils.cs +++ b/Source/Assets/TouchScript/Scripts/Utils/BinaryUtils.cs @@ -2,6 +2,7 @@ * @author Valentin Simonov / http://va.lent.in/ */ +using System.Collections.Generic; using System.Text; namespace TouchScript.Utils @@ -25,5 +26,17 @@ public static string ToBinaryString(uint value, int digits = 32) ToBinaryString(value, sb, digits); return sb.ToString(); } + + public static uint ToBinaryMask(IEnumerable collection) + { + uint mask = 0; + var count = 0; + foreach (bool value in collection) + { + if (value) mask |= (uint)(1 << count); + if (++count >= 32) break; + } + return mask; + } } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Utils/EventHandlerExtensions.cs b/Source/Assets/TouchScript/Scripts/Utils/EventHandlerExtensions.cs index 13b631fba..d01778537 100644 --- a/Source/Assets/TouchScript/Scripts/Utils/EventHandlerExtensions.cs +++ b/Source/Assets/TouchScript/Scripts/Utils/EventHandlerExtensions.cs @@ -4,6 +4,7 @@ */ using System; +using UnityEngine; namespace TouchScript.Utils { @@ -29,7 +30,7 @@ public static Exception InvokeHandleExceptions(this EventHandler handler, } catch (Exception ex) { - UnityEngine.Debug.LogException(ex); + Debug.LogException(ex); return ex; } return null; @@ -50,7 +51,7 @@ public static Exception InvokeHandleExceptions(this EventHandler handler, object } catch (Exception ex) { - UnityEngine.Debug.LogException(ex); + Debug.LogException(ex); return ex; } return null; diff --git a/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs b/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs index c82816b33..910b537e8 100644 --- a/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs +++ b/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs @@ -14,6 +14,9 @@ namespace TouchScript.Utils /// public static class PointerUtils { + + private static StringBuilder sb; + /// /// Determines whether the pointer is over its target GameObject. /// @@ -53,7 +56,15 @@ public static bool IsPointerOnTarget(IPointer pointer, Transform target, out Hit return hit.Target.IsChildOf(target); } - public static void ButtonsToString(Pointer.PointerButtonState buttons, StringBuilder builder) + public static string PressedButtonsToString(Pointer.PointerButtonState buttons) + { + initStringBuilder(); + + PressedButtonsToString(buttons, sb); + return sb.ToString(); + } + + public static void PressedButtonsToString(Pointer.PointerButtonState buttons, StringBuilder builder) { if ((buttons & Pointer.PointerButtonState.FirstButtonPressed) != 0) builder.Append("1"); else builder.Append("_"); @@ -67,6 +78,42 @@ public static void ButtonsToString(Pointer.PointerButtonState buttons, StringBui else builder.Append("_"); } + public static string ButtonsToString(Pointer.PointerButtonState buttons) + { + initStringBuilder(); + + ButtonsToString(buttons, sb); + return sb.ToString(); + } + + public static void ButtonsToString(Pointer.PointerButtonState buttons, StringBuilder builder) + { + if ((buttons & Pointer.PointerButtonState.FirstButtonDown) != 0) builder.Append("v"); + else if ((buttons & Pointer.PointerButtonState.FirstButtonUp) != 0) builder.Append("^"); + else if ((buttons & Pointer.PointerButtonState.FirstButtonPressed) != 0) builder.Append("1"); + else builder.Append("_"); + + if ((buttons & Pointer.PointerButtonState.SecondButtonDown) != 0) builder.Append("v"); + else if ((buttons & Pointer.PointerButtonState.SecondButtonUp) != 0) builder.Append("^"); + else if ((buttons & Pointer.PointerButtonState.SecondButtonPressed) != 0) builder.Append("2"); + else builder.Append("_"); + + if ((buttons & Pointer.PointerButtonState.ThirdButtonDown) != 0) builder.Append("v"); + else if ((buttons & Pointer.PointerButtonState.ThirdButtonUp) != 0) builder.Append("^"); + else if ((buttons & Pointer.PointerButtonState.ThirdButtonPressed) != 0) builder.Append("3"); + else builder.Append("_"); + + if ((buttons & Pointer.PointerButtonState.FourthButtonDown) != 0) builder.Append("v"); + else if ((buttons & Pointer.PointerButtonState.FourthButtonUp) != 0) builder.Append("^"); + else if ((buttons & Pointer.PointerButtonState.FourthButtonPressed) != 0) builder.Append("4"); + else builder.Append("_"); + + if ((buttons & Pointer.PointerButtonState.FifthButtonDown) != 0) builder.Append("v"); + else if ((buttons & Pointer.PointerButtonState.FifthButtonUp) != 0) builder.Append("^"); + else if ((buttons & Pointer.PointerButtonState.FifthButtonPressed) != 0) builder.Append("5"); + else builder.Append("_"); + } + public static Pointer.PointerButtonState DownPressedButtons(Pointer.PointerButtonState buttons) { var btns = buttons & Pointer.PointerButtonState.AnyButtonPressed; @@ -114,5 +161,11 @@ public static Pointer.PointerButtonState UpPressedButtons(Pointer.PointerButtonS btns |= Pointer.PointerButtonState.FifthButtonUp; return btns; } + + private static void initStringBuilder() + { + if (sb == null) sb = new StringBuilder(); + sb.Length = 0; + } } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Utils/TransformUtils.cs b/Source/Assets/TouchScript/Scripts/Utils/TransformUtils.cs index cd76b87d2..4e1bcbbc7 100644 --- a/Source/Assets/TouchScript/Scripts/Utils/TransformUtils.cs +++ b/Source/Assets/TouchScript/Scripts/Utils/TransformUtils.cs @@ -2,12 +2,16 @@ * @author Valentin Simonov / http://va.lent.in/ */ +using System.Text; using UnityEngine; namespace TouchScript.Utils { - internal static class TransformUtils + public static class TransformUtils { + + private static StringBuilder sb; + public static Vector3 GlobalToLocalPosition(Transform transform, Vector3 global) { if (transform.parent == null) return global; @@ -34,5 +38,26 @@ public static Vector3 GlobalToLocalVector(Transform transform, Vector3 global) return vector; } + + public static string GetHeirarchyPath(Transform transform) + { + initStringBuilder(); + + if (transform == null) return null; + + while (transform != null) + { + sb.Insert(0, transform.name); + sb.Insert(0, "/"); + transform = transform.parent; + } + return sb.ToString(); + } + + private static void initStringBuilder() + { + if (sb == null) sb = new StringBuilder(); + sb.Length = 0; + } } } \ No newline at end of file From ce7ed20edc9cbd3222c3e5032d572f4cebf42a9d Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Thu, 20 Jul 2017 21:54:31 +0300 Subject: [PATCH 11/58] Fixed interaction with UI Masks. --- Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs index d612be1d6..9c573d0ef 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs @@ -424,7 +424,7 @@ private HitResult performSSUISearch(IPointer pointer, out HitData hit) if (!RectTransformUtility.RectangleContainsScreenPoint(graphic.rectTransform, position, eventCamera)) continue; - if (graphic.Raycast(position, null)) + if (graphic.Raycast(position, eventCamera)) { var t = graphic.transform; if (raycaster.ignoreReversedGraphics) From 6472ddf06b0b67b83159b513c927d5936000e65d Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Thu, 20 Jul 2017 22:14:37 +0300 Subject: [PATCH 12/58] Fixed an issue with UI Masks in SS Overlay mode. --- Source/Assets/TouchScript/Prefabs/Cursors.prefab | 16 +++++++++------- .../TouchScript/Scripts/Layers/StandardLayer.cs | 6 +++--- Source/ProjectSettings/ProjectSettings.asset | 2 +- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/Source/Assets/TouchScript/Prefabs/Cursors.prefab b/Source/Assets/TouchScript/Prefabs/Cursors.prefab index bf99bf1ff..58008feac 100644 --- a/Source/Assets/TouchScript/Prefabs/Cursors.prefab +++ b/Source/Assets/TouchScript/Prefabs/Cursors.prefab @@ -5,11 +5,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 22401058} - - 114: {fileID: 11400000} - - 223: {fileID: 22341586} + - component: {fileID: 22401058} + - component: {fileID: 11400000} + - component: {fileID: 22341586} m_Layer: 0 m_Name: Cursors m_TagString: Untagged @@ -51,6 +51,7 @@ MonoBehaviour: objectCursor: {fileID: 11468960, guid: 4230502e1973f4c9e9ef6767dcc8c602, type: 2} useDPI: 1 cursorSize: 2 + cursorPixelSize: 64 --- !u!1002 &11400001 EditorExtensionImpl: serializedVersion: 6 @@ -64,7 +65,7 @@ Canvas: m_PrefabInternal: {fileID: 100100000} m_GameObject: {fileID: 100000} m_Enabled: 1 - serializedVersion: 2 + serializedVersion: 3 m_RenderMode: 0 m_Camera: {fileID: 0} m_PlaneDistance: 100 @@ -73,8 +74,9 @@ Canvas: m_OverrideSorting: 0 m_OverridePixelPerfect: 0 m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 1 m_SortingLayerID: 0 - m_SortingOrder: 9000 + m_SortingOrder: 32767 m_TargetDisplay: 0 --- !u!224 &22401058 RectTransform: @@ -85,10 +87,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0, y: 0, z: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 0} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} diff --git a/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs index 9c573d0ef..c053c283c 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs @@ -332,7 +332,7 @@ private HitResult performWorldSearch(IPointer pointer, out HitData hit) if (raycaster == null) continue; var canvas = TouchScriptInputModule.Instance.GetCanvasForRaycaster(raycaster); // TODO: cache if ((canvas == null) || (canvas.renderMode == RenderMode.ScreenSpaceOverlay) || (canvas.worldCamera != _camera)) continue; - performUISearchForCanvas(pointer, canvas, raycaster, float.MaxValue, ray); + performUISearchForCanvas(pointer, canvas, raycaster, _camera, float.MaxValue, ray); } count = raycastHitUIList.Count; @@ -405,12 +405,12 @@ private HitResult performSSUISearch(IPointer pointer, out HitData hit) return HitResult.Hit; } - private void performUISearchForCanvas(IPointer pointer, Canvas canvas, GraphicRaycaster raycaster, float maxDistance = float.MaxValue, Ray ray = default(Ray)) + private void performUISearchForCanvas(IPointer pointer, Canvas canvas, GraphicRaycaster raycaster, Camera eventCamera = null, float maxDistance = float.MaxValue, Ray ray = default(Ray)) { var position = pointer.Position; - var eventCamera = canvas.worldCamera; var foundGraphics = GraphicRegistry.GetGraphicsForCanvas(canvas); var count2 = foundGraphics.Count; + for (var j = 0; j < count2; j++) { var graphic = foundGraphics[j]; diff --git a/Source/ProjectSettings/ProjectSettings.asset b/Source/ProjectSettings/ProjectSettings.asset index 68627b0a0..9e7f5bb84 100644 --- a/Source/ProjectSettings/ProjectSettings.asset +++ b/Source/ProjectSettings/ProjectSettings.asset @@ -512,7 +512,7 @@ PlayerSettings: webGLUseWasm: 0 webGLCompressionFormat: 1 scriptingDefineSymbols: - 1: + 1: TOUCHSCRIPT_DEBUG 4: platformArchitecture: iOS: 0 From 9ceab2ca9d10a81aa8e0f1221b6d6be0b6a44972 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Thu, 20 Jul 2017 22:20:13 +0300 Subject: [PATCH 13/58] Fixed mouse scroll never resetting. http://touchprefab.com/viewtopic.php?f=4&t=24521&sid=6c2589d36ac338397423bd54b5ec4aa8 --- .../Scripts/InputSources/InputHandlers/MouseHandler.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs index 649e52b12..c474a0442 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs @@ -152,6 +152,10 @@ public bool UpdateInput() mousePointer.ScrollDelta = scroll; updatePointer(mousePointer); } + else + { + mousePointer.ScrollDelta = Vector2.zero; + } if (emulateSecondMousePointer) { From 66d79f4ce761ca953b861f48e7d89c40c5a3eefb Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Thu, 20 Jul 2017 22:53:47 +0300 Subject: [PATCH 14/58] Resetting transform values after GestureState.Changed event. --- .../Base/OnePointTrasformGestureBase.cs | 3 +- .../Base/TransformGestureBase.cs | 14 +++++--- .../Base/TwoPointTransformGestureBase.cs | 1 + .../TransformGestures/ITransformGesture.cs | 33 ++++++++++--------- 4 files changed, 30 insertions(+), 21 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/OnePointTrasformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/OnePointTrasformGestureBase.cs index ab5d161e5..aea307755 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/OnePointTrasformGestureBase.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/OnePointTrasformGestureBase.cs @@ -187,7 +187,8 @@ protected override void pointersUpdated(IList pointers) deltaRotation = dR; deltaScale = dS; setState(GestureState.Changed); - break; + resetValues(); + break; } } } diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs index f03784d9e..53d31583f 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs @@ -314,11 +314,7 @@ protected override void reset() { base.reset(); - deltaPosition = Vector3.zero; - deltaRotation = 0f; - deltaScale = 1f; - - transformMask = 0; + resetValues(); isTransforming = false; } @@ -328,6 +324,14 @@ protected override void reset() protected virtual void updateType() {} + protected void resetValues() + { + deltaPosition = Vector3.zero; + deltaRotation = 0f; + deltaScale = 1f; + transformMask = 0; + } + #if TOUCHSCRIPT_DEBUG protected int debugID; protected Coroutine debugCoroutine; diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TwoPointTransformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TwoPointTransformGestureBase.cs index 5094971dd..65277b1a1 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TwoPointTransformGestureBase.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TwoPointTransformGestureBase.cs @@ -253,6 +253,7 @@ protected override void pointersUpdated(IList pointers) deltaRotation = dR; deltaScale = dS; setState(GestureState.Changed); + resetValues(); break; } } diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/ITransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/ITransformGesture.cs index ac1d60017..98cf79937 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/ITransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/ITransformGesture.cs @@ -33,21 +33,24 @@ public interface ITransformGesture /// TransformGesture.TransformType TransformMask { get; } - /// - /// Gets delta position between this frame and the last frame in world coordinates. - /// - Vector3 DeltaPosition { get; } - - /// - /// Gets delta rotation between this frame and last frame in degrees. - /// - float DeltaRotation { get; } - - /// - /// Contains local delta scale when gesture is recognized. - /// Value is between 0 and +infinity, where 1 is no scale, 0.5 is scaled in half, 2 scaled twice. - /// - float DeltaScale { get; } + /// + /// Gets delta position between this frame and the last frame in world coordinates. + /// This value is only available during or events. + /// + Vector3 DeltaPosition { get; } + + /// + /// Gets delta rotation between this frame and last frame in degrees. + /// This value is only available during or events. + /// + float DeltaRotation { get; } + + /// + /// Contains local delta scale when gesture is recognized. + /// Value is between 0 and +infinity, where 1 is no scale, 0.5 is scaled in half, 2 scaled twice. + /// This value is only available during or events. + /// + float DeltaScale { get; } /// /// Gets rotation axis of the gesture in world coordinates. From 72ef8cd9baef346922999d935ece730b5b192103 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Thu, 20 Jul 2017 22:59:05 +0300 Subject: [PATCH 15/58] Fixed an error in examples for 5.6. --- Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs b/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs index 78bec68aa..304679f36 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs +++ b/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs @@ -100,6 +100,13 @@ private void Start() } } + private void OnDestroy() + { +#if UNITY_5_4_OR_NEWER + SceneManager.sceneLoaded -= sceneLoadedHandler; +#endif + } + private void Update() { if (Input.GetKeyDown(KeyCode.Escape)) Application.Quit(); From 704720f8ef1fc4f7ddcc18ab3f1394c3a21fa49b Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Thu, 20 Jul 2017 23:55:10 +0300 Subject: [PATCH 16/58] Forgot to commit a few things. --- .../Scripts/Behaviors/Visualizer.meta | 9 - .../Scripts/Utils/DebugUtils/DebugHelper.cs | 20 - .../Utils/DebugUtils/DebugHelper.cs.meta | 12 - .../Scripts/Utils/DebugUtils/GLDebug.cs | 625 ------------------ .../Scripts/Utils/DebugUtils/GLDebug.cs.meta | 12 - 5 files changed, 678 deletions(-) delete mode 100644 Source/Assets/TouchScript/Scripts/Behaviors/Visualizer.meta delete mode 100644 Source/Assets/TouchScript/Scripts/Utils/DebugUtils/DebugHelper.cs delete mode 100644 Source/Assets/TouchScript/Scripts/Utils/DebugUtils/DebugHelper.cs.meta delete mode 100644 Source/Assets/TouchScript/Scripts/Utils/DebugUtils/GLDebug.cs delete mode 100644 Source/Assets/TouchScript/Scripts/Utils/DebugUtils/GLDebug.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer.meta b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer.meta deleted file mode 100644 index 8b8eeff86..000000000 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: 13e39bb9814664e51bc4e78e8d16dc56 -folderAsset: yes -timeCreated: 1500402656 -licenseType: Pro -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Utils/DebugUtils/DebugHelper.cs b/Source/Assets/TouchScript/Scripts/Utils/DebugUtils/DebugHelper.cs deleted file mode 100644 index 6643dcba8..000000000 --- a/Source/Assets/TouchScript/Scripts/Utils/DebugUtils/DebugHelper.cs +++ /dev/null @@ -1,20 +0,0 @@ -/* - * @author Valentin Simonov / http://va.lent.in/ - */ - -using UnityEngine; - -#if TOUCHSCRIPT_DEBUG - -namespace TouchScript.Utils.DebugUtils -{ - public static class DebugHelper - { - public static int GetDebugId(Object obj) - { - return int.MinValue + (obj.GetInstanceID() << 10); - } - } -} - -#endif \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Utils/DebugUtils/DebugHelper.cs.meta b/Source/Assets/TouchScript/Scripts/Utils/DebugUtils/DebugHelper.cs.meta deleted file mode 100644 index 5b1668f61..000000000 --- a/Source/Assets/TouchScript/Scripts/Utils/DebugUtils/DebugHelper.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 62efb084f73cc4f86b954d1a5109e015 -timeCreated: 1447582130 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Utils/DebugUtils/GLDebug.cs b/Source/Assets/TouchScript/Scripts/Utils/DebugUtils/GLDebug.cs deleted file mode 100644 index 8c342a185..000000000 --- a/Source/Assets/TouchScript/Scripts/Utils/DebugUtils/GLDebug.cs +++ /dev/null @@ -1,625 +0,0 @@ -/* - * @author Valentin Simonov / http://va.lent.in/ - * Based on http://pastebin.com/69QP1s45 - */ - - -#if TOUCHSCRIPT_DEBUG - -using System.Collections.Generic; -using UnityEngine; - -namespace TouchScript.Utils.DebugUtils -{ - public class GLDebug : MonoBehaviour - { - - public static readonly Color MULTIPLY = new Color(0, 0, 0, 0); - public static readonly Vector2 DEFAULT_SCREEN_SPACE_SCALE = new Vector2(10, 10); - - private static GLDebug instance - { - get - { - if (!_instance && Application.isPlaying) - { - if (Camera.main) - { - _instance = Camera.main.gameObject.AddComponent(); - } - else - { - var go = new GameObject("GLDebug"); - var camera = go.AddComponent(); - camera.clearFlags = CameraClearFlags.Nothing; - camera.depth = 9000; - _instance = go.AddComponent(); - } - } - return _instance; - } - } - - public KeyCode ToggleKey; - public bool DisplayLines = true; - - private static GLDebug _instance; - - private static int nextFigureId = 1; - private Material materialDepthTest; - private Material materialNoDepthTest; - private Material materialMultiplyDepthTest; - private Material materialMultiplyNoDepthTest; - private Dictionary figuresDepthTest; - private Dictionary figuresMultiplyDepthTest; - private Dictionary figuresNoDepthTest; - private Dictionary figuresMultiplyNoDepthTest; - private Dictionary figuresScreenSpace; - private Dictionary figuresMultiplyScreenSpace; - private Dictionary figuresTmp; - - #region Public methods - - public static void RemoveFigure(int id) - { - instance.figuresDepthTest.Remove(id); - instance.figuresNoDepthTest.Remove(id); - instance.figuresScreenSpace.Remove(id); - instance.figuresMultiplyDepthTest.Remove(id); - instance.figuresMultiplyNoDepthTest.Remove(id); - instance.figuresMultiplyScreenSpace.Remove(id); - } - - #region Line - - public static int DrawLine(Vector3 start, Vector3 end, Color? color = null, float duration = 0, bool depthTest = false) - { - return DrawLine(null, start, end, color, duration, depthTest); - } - - public static int DrawLine(int? id, Vector3 start, Vector3 end, Color? color = null, float duration = 0, bool depthTest = false) - { - return drawFigure(id, new List() { new Line(start, end) }, color ?? Color.white, duration, depthTest); - } - - public static int DrawLineScreenSpace(Vector2 start, Vector2 end, Color? color = null, float duration = 0) - { - return DrawLineScreenSpace(null, start, end, color, duration); - } - - public static int DrawLineScreenSpace(int? id, Vector2 start, Vector2 end, Color? color = null, float duration = 0) - { - return drawFigureScreenSpace(id, new List() { new Line(start, end) }, color ?? Color.white, duration); - } - - #endregion - - #region Ray - - public static int DrawRay(Vector3 start, Vector3 dir, Color? color = null, float duration = 0, bool depthTest = false) - { - return DrawRay(null, start, dir, color, duration, depthTest); - } - - public static int DrawRay(int? id, Vector3 start, Vector3 dir, Color? color = null, float duration = 0, bool depthTest = false) - { - if (dir == Vector3.zero) - return 0; - return DrawLine(start, start + dir, color, duration, depthTest); - } - - #endregion - - #region Cross - - public static int DrawCross(Vector3 pos, Quaternion? rot = null, Vector3? scale = null, Color? color = null, float duration = 0, bool depthTest = false) - { - return DrawCross(null, Matrix4x4.TRS(pos, rot ?? Quaternion.identity, scale ?? Vector3.one), color, duration, depthTest); - } - - public static int DrawCross(int? id, Vector3 pos, Quaternion? rot = null, Vector3? scale = null, Color? color = null, float duration = 0, bool depthTest = false) - { - return DrawCross(id, Matrix4x4.TRS(pos, rot ?? Quaternion.identity, scale ?? Vector3.one), color, duration, depthTest); - } - - public static int DrawCross(Matrix4x4 matrix, Color? color = null, float duration = 0, bool depthTest = false) - { - return DrawCross(null, matrix, color, duration, depthTest); - } - - public static int DrawCross(int? id, Matrix4x4 matrix, Color? color = null, float duration = 0, bool depthTest = false) - { - return drawFigure(id, createCrossLines(matrix), color ?? Color.white, duration, depthTest); - } - - public static int DrawCrossScreenSpace(Vector2 pos, float rot = 0, Vector2? scale = null, Color? color = null, float duration = 0) - { - return DrawCrossScreenSpace(null, pos, rot, scale, color, duration); - } - - public static int DrawCrossScreenSpace(int? id, Vector2 pos, float rot = 0, Vector2? scale = null, Color? color = null, float duration = 0) - { - return drawFigureScreenSpace(id, createScreenSpaceCrossLines(pos, rot, scale ?? DEFAULT_SCREEN_SPACE_SCALE), color ?? Color.white, duration); - } - - #endregion - - #region Arrow - - public static int DrawArrow(Vector3 start, Vector3 end, float arrowHeadLength = 0.25f, float arrowHeadAngle = 20, Color? color = null, float duration = 0, bool depthTest = false) - { - return DrawArrow(null, start, end, arrowHeadLength, arrowHeadAngle, color, duration, depthTest); - } - - public static int DrawArrow(int? id, Vector3 start, Vector3 end, float arrowHeadLength = 0.25f, float arrowHeadAngle = 20, Color? color = null, float duration = 0, bool depthTest = false) - { - if (start == end) - return 0; - - return drawFigure(id, createArrowLines(start, end, arrowHeadLength, arrowHeadAngle), color ?? Color.white, duration, depthTest); - } - - #endregion - - #region Plane with normal - - public static int DrawPlaneWithNormal(Vector3 pos, Vector3 normal, float scale = 1f, Color? color = null, float duration = 0, bool depthTest = false) - { - return DrawPlaneWithNormal(null, pos, normal, scale, color, duration, depthTest); - } - - public static int DrawPlaneWithNormal(int? id, Vector3 pos, Vector3 normal, float scale = 1f, Color? color = null, float duration = 0, bool depthTest = false) - { - var lines = createArrowLines(pos, pos + normal); - lines.AddRange(createCrossLines(Matrix4x4.TRS(pos, Quaternion.LookRotation(normal) * Quaternion.Euler(0, 0, 45f), Vector3.one))); - lines.AddRange(createSquareLines(Matrix4x4.TRS(pos, Quaternion.FromToRotation(Vector3.up, normal), Vector3.one * scale))); - return drawFigure(id, lines, color ?? Color.white, duration, depthTest); - } - - #endregion - - #region Line with cross - - public static int DrawLineWithCross(Vector3 start, Vector3 end, float crossRelativePosition = 0.5f, Vector3? scale = null, Color? color = null, float duration = 0, bool depthTest = false) - { - return DrawLineWithCross(null, start, end, crossRelativePosition, scale, color, duration, depthTest); - } - - public static int DrawLineWithCross(int? id, Vector3 start, Vector3 end, float crossRelativePosition = 0.5f, Vector3? scale = null, Color? color = null, float duration = 0, bool depthTest = false) - { - var lines = new List() {new Line(start, end)}; - // TODO: Calculate cross rotation - lines.AddRange(createCrossLines(Matrix4x4.TRS(Vector3.Lerp(start, end, crossRelativePosition), Quaternion.identity, scale ?? Vector3.one))); - return drawFigure(id, lines, color ?? Color.white, duration, depthTest); - } - - public static int DrawLineWithCrossScreenSpace(Vector2 start, Vector2 end, float crossRelativePosition, Vector2? scale = null, Color? color = null, float duration = 0) - { - return DrawLineWithCrossScreenSpace(null, start, end, crossRelativePosition, scale, color, duration); - } - - public static int DrawLineWithCrossScreenSpace(int? id, Vector2 start, Vector2 end, float crossRelativePosition, Vector2? scale = null, Color? color = null, float duration = 0) - { - var lines = new List() {new Line(start, end)}; - lines.AddRange(createScreenSpaceCrossLines(Vector2.Lerp(start, end, crossRelativePosition), Mathf.Atan2(end.y - start.y, end.x - start.x) * Mathf.Rad2Deg + 45f, scale ?? Vector2.one * 10)); - return drawFigureScreenSpace(id, lines, color ?? Color.white, duration); - } - - #endregion - - #region Square - - public static int DrawSquare(Vector3 pos, Quaternion? rot = null, Vector3? scale = null, Color? color = null, float duration = 0, bool depthTest = false) - { - return DrawSquare(null, pos, rot, scale, color, duration, depthTest); - } - - public static int DrawSquare(int? id, Vector3 pos, Quaternion? rot = null, Vector3? scale = null, Color? color = null, float duration = 0, bool depthTest = false) - { - return DrawSquare(Matrix4x4.TRS(pos, rot ?? Quaternion.identity, scale ?? Vector3.one), color, duration, depthTest); - } - - public static int DrawSquare(Matrix4x4 matrix, Color? color = null, float duration = 0, bool depthTest = false) - { - return DrawSquare(null, matrix, color, duration, depthTest); - } - - public static int DrawSquare(int? id, Matrix4x4 matrix, Color? color = null, float duration = 0, bool depthTest = false) - { - return drawFigure(id, createSquareLines(matrix), color ?? Color.white, duration, depthTest); - } - - public static int DrawSquareScreenSpace(Vector2 pos, float rot = 0, Vector2? scale = null, Color? color = null, float duration = 0) - { - return DrawSquareScreenSpace(null, pos, rot, scale, color, duration); - } - - public static int DrawSquareScreenSpace(int? id, Vector2 pos, float rot = 0, Vector2? scale = null, Color? color = null, float duration = 0) - { - return drawFigureScreenSpace(id, createScreenSpaceSquareLines(pos, rot, scale ?? DEFAULT_SCREEN_SPACE_SCALE), color ?? Color.white, duration); - } - - #endregion - - #region Cube - - public static int DrawCube(Vector3 pos, Quaternion? rot = null, Vector3? scale = null, Color? color = null, float duration = 0, bool depthTest = false) - { - return DrawCube(null, pos, rot, scale, color, duration, depthTest); - } - - public static int DrawCube(int? id, Vector3 pos, Quaternion? rot = null, Vector3? scale = null, Color? color = null, float duration = 0, bool depthTest = false) - { - return DrawCube(Matrix4x4.TRS(pos, rot ?? Quaternion.identity, scale ?? Vector3.one), color, duration, depthTest); - } - - public static int DrawCube(Matrix4x4 matrix, Color? color = null, float duration = 0, bool depthTest = false) - { - return DrawCube(null, matrix, color, duration, depthTest); - } - - public static int DrawCube(int? id, Matrix4x4 matrix, Color? color = null, float duration = 0, bool depthTest = false) - { - return drawFigure(id, createCubeLines(matrix), color ?? Color.white, duration, depthTest); - } - - #endregion - - #endregion - - #region Unity methods - - private void Awake() - { - if (_instance) - { - Destroy(this); - return; - } - - _instance = this; - figuresDepthTest = new Dictionary(); - figuresNoDepthTest = new Dictionary(); - figuresScreenSpace = new Dictionary(); - figuresMultiplyDepthTest = new Dictionary(); - figuresMultiplyNoDepthTest = new Dictionary(); - figuresMultiplyScreenSpace = new Dictionary(); - figuresTmp = new Dictionary(); - - setMaterials(); - } - - private void Update() - { - if (Input.GetKeyDown(ToggleKey)) - DisplayLines = !DisplayLines; - } - - private void OnPostRender() - { - if (!DisplayLines) return; - - materialDepthTest.SetPass(0); - GL.Begin(GL.LINES); - figuresDepthTest = draw(figuresDepthTest); - GL.End(); - - materialMultiplyDepthTest.SetPass(0); - GL.Begin(GL.LINES); - figuresMultiplyDepthTest = draw(figuresMultiplyDepthTest); - GL.End(); - - materialNoDepthTest.SetPass(0); - GL.Begin(GL.LINES); - figuresNoDepthTest = draw(figuresNoDepthTest); - GL.End(); - - materialMultiplyNoDepthTest.SetPass(0); - GL.Begin(GL.LINES); - figuresMultiplyNoDepthTest = draw(figuresMultiplyNoDepthTest); - GL.End(); - - GL.PushMatrix(); - GL.LoadPixelMatrix(); - - materialNoDepthTest.SetPass(0); - GL.Begin(GL.LINES); - figuresScreenSpace = draw(figuresScreenSpace); - GL.End(); - - materialMultiplyNoDepthTest.SetPass(0); - GL.Begin(GL.LINES); - figuresMultiplyScreenSpace = draw(figuresMultiplyScreenSpace); - GL.End(); - GL.PopMatrix(); - } - - #endregion - - #region Private functions - - #region Misc - - private Dictionary draw(Dictionary figures) - { - figuresTmp.Clear(); - var newFigures = figuresTmp; - foreach (var key in figures.Keys) - { - var value = figures[key]; - value.Duration = value.Draw(); - if (value.Duration > 0) - { - newFigures[key] = value; - } - } - figuresTmp = figures; - return newFigures; - } - - private void setMaterials() - { - materialDepthTest = new Material(Shader.Find("Hidden/DebugDepthTest")); - materialNoDepthTest = new Material(Shader.Find("Hidden/DebugNoDepthTest")); - materialMultiplyDepthTest = new Material(Shader.Find("Hidden/DebugMultiplyDepthTest")); - materialMultiplyNoDepthTest = new Material(Shader.Find("Hidden/DebugMultiplyNoDepthTest")); - materialDepthTest.hideFlags = HideFlags.HideAndDontSave; - materialNoDepthTest.hideFlags = HideFlags.HideAndDontSave; - materialMultiplyDepthTest.hideFlags = HideFlags.HideAndDontSave; - materialMultiplyNoDepthTest.hideFlags = HideFlags.HideAndDontSave; - } - - #endregion - - #region Figure creation - - private static int drawFigure(int? id, List lines, Color color, float duration = 0, bool depthTest = false) - { - if (duration == 0 && !instance.DisplayLines) - return 0; - - int figureId; - if (id.HasValue) - { - figureId = id.Value; - RemoveFigure(figureId); - } - else - { - figureId = nextFigureId++; - } - if (depthTest) - { - if (color == MULTIPLY) instance.figuresMultiplyDepthTest.Add(figureId, new Figure(figureId, lines, Color.white, duration)); - else instance.figuresDepthTest.Add(figureId, new Figure(figureId, lines, color, duration)); - } - else - { - if (color == MULTIPLY) instance.figuresMultiplyNoDepthTest.Add(figureId, new Figure(figureId, lines, Color.white, duration)); - else instance.figuresNoDepthTest.Add(figureId, new Figure(figureId, lines, color, duration)); - } - return figureId; - } - - private static int drawFigureScreenSpace(int? id, List lines, Color color, float duration = 0) - { - if (duration == 0 && !instance.DisplayLines) - return 0; - - int figureId; - if (id.HasValue) - { - figureId = id.Value; - RemoveFigure(figureId); - } - else - { - figureId = nextFigureId++; - } - - if (color == MULTIPLY) instance.figuresMultiplyScreenSpace.Add(figureId, new Figure(figureId, lines, Color.white, duration)); - else instance.figuresScreenSpace.Add(figureId, new Figure(figureId, lines, color, duration)); - return figureId; - } - - #endregion - - #region Line helpers - - private static List createCrossLines(Matrix4x4 matrix) - { - Vector3 - p_1 = matrix.MultiplyPoint3x4(new Vector3(-.5f, 0, 0)), - p_2 = matrix.MultiplyPoint3x4(new Vector3(.5f, 0, 0)), - p_3 = matrix.MultiplyPoint3x4(new Vector3(0, -.5f, 0)), - p_4 = matrix.MultiplyPoint3x4(new Vector3(0, .5f, 0)); - - return new List() - { - new Line(p_1, p_2), - new Line(p_3, p_4), - }; - } - - private static List createScreenSpaceCrossLines(Vector2 pos, float rot, Vector2 scale) - { - Vector2 p_1, p_2, p_3, p_4; - float x = .5f * scale.x; - float y = .5f * scale.y; - - if (rot == 0) - { - p_1 = new Vector2(-x, 0) + pos; - p_2 = new Vector2(x, 0) + pos; - p_3 = new Vector2(0, -y) + pos; - p_4 = new Vector2(0, y) + pos; - } - else - { - var cos = Mathf.Cos(rot * Mathf.Deg2Rad); - var sin = Mathf.Sin(rot * Mathf.Deg2Rad); - - p_1 = new Vector2(-x * cos, -x * sin) + pos; - p_2 = new Vector2(x * cos, x * sin) + pos; - p_3 = new Vector2(y * sin, -y * cos) + pos; - p_4 = new Vector2(-y * sin, y * cos) + pos; - } - - return new List() - { - new Line(p_1, p_2), - new Line(p_3, p_4), - }; - } - - private static List createArrowLines(Vector3 start, Vector3 end, float arrowHeadLength = 0.25f, float arrowHeadAngle = 20) - { - var dir = end - start; - Vector3 right = Quaternion.LookRotation(dir) * Quaternion.Euler(0, 180 + arrowHeadAngle, 0) * Vector3.forward; - Vector3 left = Quaternion.LookRotation(dir) * Quaternion.Euler(0, 180 - arrowHeadAngle, 0) * Vector3.forward; - - return new List() - { - new Line(start, end), - new Line(end, end + right * arrowHeadLength), - new Line(end, end + left * arrowHeadLength) - }; - } - - private static List createSquareLines(Matrix4x4 matrix) - { - Vector3 - p_1 = matrix.MultiplyPoint3x4(new Vector3(.5f, 0, .5f)), - p_2 = matrix.MultiplyPoint3x4(new Vector3(.5f, 0, -.5f)), - p_3 = matrix.MultiplyPoint3x4(new Vector3(-.5f, 0, -.5f)), - p_4 = matrix.MultiplyPoint3x4(new Vector3(-.5f, 0, .5f)); - - return new List() - { - new Line(p_1, p_2), - new Line(p_2, p_3), - new Line(p_3, p_4), - new Line(p_4, p_1) - }; - } - - private static List createScreenSpaceSquareLines(Vector2 pos, float rot, Vector2 scale) - { - Vector2 p_1, p_2, p_3, p_4; - float x = .5f * scale.x; - float y = .5f * scale.y; - - if (rot == 0) - { - p_1 = new Vector2(x, y) + pos; - p_2 = new Vector2(x, -y) + pos; - p_3 = new Vector2(-x, -y) + pos; - p_4 = new Vector2(-x, y) + pos; - } - else - { - var cos = Mathf.Cos(rot * Mathf.Deg2Rad); - var sin = Mathf.Sin(rot * Mathf.Deg2Rad); - - p_1 = new Vector2(x * cos - y * sin, x * sin + y * cos) + pos; - p_2 = new Vector2(x * cos + y * sin, x * sin - y * cos) + pos; - p_3 = new Vector2(-x * cos + y * sin, -x * sin - y * cos) + pos; - p_4 = new Vector2(-x * cos - y * sin, -x * sin + y * cos) + pos; - } - - return new List() - { - new Line(p_1, p_2), - new Line(p_2, p_3), - new Line(p_3, p_4), - new Line(p_4, p_1) - }; - } - - private static List createCubeLines(Matrix4x4 matrix) - { - Vector3 - down_1 = matrix.MultiplyPoint3x4(new Vector3(.5f, -.5f, .5f)), - down_2 = matrix.MultiplyPoint3x4(new Vector3(.5f, -.5f, -.5f)), - down_3 = matrix.MultiplyPoint3x4(new Vector3(-.5f, -.5f, -.5f)), - down_4 = matrix.MultiplyPoint3x4(new Vector3(-.5f, -.5f, .5f)), - up_1 = matrix.MultiplyPoint3x4(new Vector3(.5f, .5f, .5f)), - up_2 = matrix.MultiplyPoint3x4(new Vector3(.5f, .5f, -.5f)), - up_3 = matrix.MultiplyPoint3x4(new Vector3(-.5f, .5f, -.5f)), - up_4 = matrix.MultiplyPoint3x4(new Vector3(-.5f, .5f, .5f)); - - return new List() - { - new Line(down_1, down_2), - new Line(down_2, down_3), - new Line(down_3, down_4), - new Line(down_4, down_1), - - new Line(down_1, up_1), - new Line(down_2, up_2), - new Line(down_3, up_3), - new Line(down_4, up_4), - - new Line(up_1, up_2), - new Line(up_2, up_3), - new Line(up_3, up_4), - new Line(up_4, up_1) - }; - } - - #endregion - - #endregion - - #region Structs - - private struct Figure - { - public int Id; - public Color Color; - public float Duration; - public List Lines; - - public Figure(int id, List lines, Color color, float duration) - { - Id = id; - Color = color; - Duration = duration; - Lines = lines; - } - - public float Draw() - { - GL.Color(Color); - for (var i = 0; i < Lines.Count; i++) - { - Lines[i].Draw(); - } - return Duration - Time.deltaTime; - } - } - - private struct Line - { - public Vector3 start; - public Vector3 end; - - public Line(Vector3 start, Vector3 end) - { - this.start = start; - this.end = end; - } - - public void Draw() - { - GL.Vertex(start); - GL.Vertex(end); - } - } - - #endregion - - } -} - -#endif \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Utils/DebugUtils/GLDebug.cs.meta b/Source/Assets/TouchScript/Scripts/Utils/DebugUtils/GLDebug.cs.meta deleted file mode 100644 index 35dd6354f..000000000 --- a/Source/Assets/TouchScript/Scripts/Utils/DebugUtils/GLDebug.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: d2d72c9d6bd55482db3ece50442c7353 -timeCreated: 1447582131 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: From 5ae5ff87eaaa0ed6535e29fd1893dc0da2f14e2f Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Fri, 21 Jul 2017 00:35:44 +0300 Subject: [PATCH 17/58] Fixed input when resolution changes on Windows (issue #248). --- .../Scripts/Debugging/TouchScriptDebugger.cs | 1 - .../InputHandlers/WindowsPointerHandlers.cs | 20 +++++++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Debugging/TouchScriptDebugger.cs b/Source/Assets/TouchScript/Scripts/Debugging/TouchScriptDebugger.cs index 253743ed2..cf2039761 100644 --- a/Source/Assets/TouchScript/Scripts/Debugging/TouchScriptDebugger.cs +++ b/Source/Assets/TouchScript/Scripts/Debugging/TouchScriptDebugger.cs @@ -5,7 +5,6 @@ #if TOUCHSCRIPT_DEBUG using UnityEngine; -using UnityEditor; using TouchScript.Debugging.Loggers; namespace TouchScript.Debugging diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs index d6e9f4a8e..a722f584e 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs @@ -76,6 +76,7 @@ public Windows8PointerHandler(PointerDelegate addPointer, PointerDelegate update /// public override bool UpdateInput() { + base.UpdateInput(); return true; } @@ -147,6 +148,7 @@ public Windows7PointerHandler(PointerDelegate addPointer, PointerDelegate update /// public override bool UpdateInput() { + base.UpdateInput(); return winTouchToInternalId.Count > 0; } @@ -175,7 +177,7 @@ public abstract class WindowsPointerHandler : IInputSource, IDisposable #endregion - #region Protected variables + #region Private variables private NativePointerDelegate nativePointerDelegate; private NativeLog nativeLogDelegate; @@ -197,6 +199,8 @@ public abstract class WindowsPointerHandler : IInputSource, IDisposable protected MousePointer mousePointer; protected PenPointer penPointer; + private int screenWidth, screenHeight; + #endregion #region Constructor @@ -226,7 +230,7 @@ public WindowsPointerHandler(PointerDelegate addPointer, PointerDelegate updateP hMainWindow = GetActiveWindow(); disablePressAndHold(); - initScaling(); + setScaling(); } #endregion @@ -236,6 +240,7 @@ public WindowsPointerHandler(PointerDelegate addPointer, PointerDelegate updateP /// public virtual bool UpdateInput() { + if (Screen.width != screenWidth || Screen.height != screenHeight) setScaling(); return false; } @@ -414,18 +419,21 @@ private void enablePressAndHold() } } - private void initScaling() + private void setScaling() { + screenWidth = Screen.width; + screenHeight = Screen.height; + if (!Screen.fullScreen) { - SetScreenParams(Screen.width, Screen.height, 0, 0, 1, 1); + SetScreenParams(screenWidth, screenHeight, 0, 0, 1, 1); return; } int width, height; getNativeMonitorResolution(out width, out height); - float scale = Mathf.Max(Screen.width / ((float) width), Screen.height / ((float) height)); - SetScreenParams(Screen.width, Screen.height, (width - Screen.width / scale) * .5f, (height - Screen.height / scale) * .5f, scale, scale); + float scale = Mathf.Max(screenWidth / ((float) width), screenHeight / ((float) height)); + SetScreenParams(screenWidth, screenHeight, (width - screenWidth / scale) * .5f, (height - screenHeight / scale) * .5f, scale, scale); } private void getNativeMonitorResolution(out int width, out int height) From a47c1e5ba79d7b7590a0288e6096874e29aacf83 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Fri, 21 Jul 2017 01:27:18 +0300 Subject: [PATCH 18/58] Don't tick UI when UI (world and ss) is disabled on StandardLayer. --- .../Scripts/Layers/StandardLayer.cs | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs index c053c283c..411bb002a 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs @@ -47,6 +47,7 @@ public bool HitWorldSpaceUI set { hitWorldSpaceUI = value; + setupInputModule(); updateVariants(); } } @@ -54,7 +55,11 @@ public bool HitWorldSpaceUI public bool HitScreenSpaceUI { get { return hitScreenSpaceUI; } - set { hitScreenSpaceUI = value; } + set + { + hitScreenSpaceUI = value; + setupInputModule(); + } } public bool UseHitFilters @@ -132,6 +137,7 @@ public override Vector3 WorldProjectionNormal private bool useHitFilters = false; private bool lookForCameraObjects = false; + private TouchScriptInputModule inputModule; /// /// Camera. @@ -223,13 +229,13 @@ private IEnumerator lateEnable() { // Need to wait while EventSystem initializes yield return new WaitForEndOfFrame(); - if (TouchScriptInputModule.Instance != null) TouchScriptInputModule.Instance.INTERNAL_Retain(); + setupInputModule(); } private void OnDisable() { if (!Application.isPlaying) return; - if (TouchScriptInputModule.Instance != null) TouchScriptInputModule.Instance.INTERNAL_Release(); + if (inputModule != null) inputModule.INTERNAL_Release(); if (TouchManager.Instance != null) TouchManager.Instance.FrameStarted -= frameStartedHandler; } @@ -263,6 +269,22 @@ protected override void setName() #region Private functions + private void setupInputModule() + { + if (inputModule == null) + { + if (!hitWorldSpaceUI && !hitScreenSpaceUI) return; + inputModule = TouchScriptInputModule.Instance; + if (inputModule != null) TouchScriptInputModule.Instance.INTERNAL_Retain(); + } + else + { + if (hitWorldSpaceUI || hitScreenSpaceUI) return; + inputModule.INTERNAL_Release(); + inputModule = null; + } + } + private HitResult performWorldSearch(IPointer pointer, out HitData hit) { hit = default(HitData); From 054b2af6fe32d6fb10a9acc0f9b70f16a014e737 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Fri, 21 Jul 2017 03:04:13 +0300 Subject: [PATCH 19/58] Profiler markers. --- .../TouchScript/Scripts/Pointers/Pointer.cs | 2 +- .../Scripts/TouchManagerInstance.cs | 78 +++++++++++-------- 2 files changed, 47 insertions(+), 33 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs index 0f2add4f8..81a356da0 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs @@ -17,7 +17,7 @@ namespace TouchScript.Pointers /// An instance of this class is created when user touches the screen. A unique id is assigned to it which doesn't change throughout its life. /// Attention! Do not store references to these objects beyond pointer's lifetime (i.e. when target finger is lifted off). These objects may be reused internally. Store unique ids instead. /// - public class Pointer : IPointer + public class Pointer : IPointer, IEquatable { #region Constants diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs index 0617763ee..54f6c588a 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs @@ -12,14 +12,14 @@ using TouchScript.Utils; using TouchScript.Pointers; using UnityEngine; - +using UnityEngine.Profiling; #if TOUCHSCRIPT_DEBUG using TouchScript.Debugging.GL; using TouchScript.Debugging.Loggers; #endif - #if UNITY_5_4_OR_NEWER using UnityEngine.SceneManagement; + #endif namespace TouchScript @@ -211,18 +211,14 @@ public IList PressedPointers #region Private variables -#if TOUCHSCRIPT_DEBUG - private TouchScript.Debugging.Loggers.IPointerLogger pLogger; -#endif - - private static bool shuttingDown = false; + private static bool shuttingDown = false; private static TouchManagerInstance instance; private bool shouldCreateCameraLayer = true; private bool shouldCreateStandardInput = true; private IDisplayDevice displayDevice; private float dpi = 96; - private float dotsPerCentimeter = TouchManager.CM_TO_INCH*96; + private float dotsPerCentimeter = TouchManager.CM_TO_INCH * 96; private List layers = new List(10); private int layerCount = 0; @@ -252,6 +248,17 @@ public IList PressedPointers #endregion + #region Debug + +#if TOUCHSCRIPT_DEBUG + private TouchScript.Debugging.Loggers.IPointerLogger pLogger; +#endif + + private CustomSampler samplerUpdateInputs; + private CustomSampler samplerUpdatePointers; + + #endregion + #region Public methods /// @@ -569,7 +576,7 @@ private void Awake() #endif #if UNITY_5_4_OR_NEWER - SceneManager.sceneLoaded += sceneLoadedHandler; + SceneManager.sceneLoaded += sceneLoadedHandler; #endif gameObject.hideFlags = HideFlags.HideInHierarchy; @@ -582,6 +589,9 @@ private void Awake() pointerListPool.WarmUp(2); intListPool.WarmUp(3); + + samplerUpdateInputs = CustomSampler.Create("TouchScript.UpdateInputs"); + samplerUpdatePointers = CustomSampler.Create("TouchScript.UpdatePointers"); } #if UNITY_5_4_OR_NEWER @@ -600,12 +610,12 @@ private void OnLevelWasLoaded(int value) private IEnumerator lateAwake() { - // Wait 2 frames: - // Frame 0: TouchManager adds layers in order - // Frame 1: Layers add themselves - // Frame 2: We add a layer if there are none + // Wait 2 frames: + // Frame 0: TouchManager adds layers in order + // Frame 1: Layers add themselves + // Frame 2: We add a layer if there are none + yield return null; yield return null; - yield return null; updateLayers(); createCameraLayer(); @@ -631,7 +641,7 @@ private void OnApplicationQuit() private void updateDPI() { dpi = DisplayDevice == null ? 96 : DisplayDevice.DPI; - dotsPerCentimeter = TouchManager.CM_TO_INCH*dpi; + dotsPerCentimeter = TouchManager.CM_TO_INCH * dpi; #if TOUCHSCRIPT_DEBUG debugPointerSize = Vector2.one*dotsPerCentimeter; #endif @@ -653,7 +663,7 @@ private void createCameraLayer() if (Application.isEditor) Debug.Log( "[TouchScript] No touch layers found, adding StandardLayer for the main camera. (this message is harmless)"); - var layer = Camera.main.gameObject.AddComponent(); + var layer = Camera.main.gameObject.AddComponent(); AddLayer(layer); } } @@ -682,7 +692,9 @@ private void createInput() private void updateInputs() { + samplerUpdateInputs.Begin(); for (var i = 0; i < inputCount; i++) inputs[i].UpdateInput(); + samplerUpdateInputs.End(); } private void updateAdded(List pointers) @@ -700,7 +712,7 @@ private void updateAdded(List pointers) pLogger.Log(pointer, PointerEvent.Added); #endif - for (var j = 0; j < layerCount; j++) + for (var j = 0; j < layerCount; j++) { var touchLayer = layers[j]; if (touchLayer == null) continue; @@ -739,7 +751,7 @@ private void updateUpdated(List pointers) pLogger.Log(pointer, PointerEvent.Updated); #endif - var layer = pointer.GetPressData().Layer; + var layer = pointer.GetPressData().Layer; if (layer != null) layer.INTERNAL_UpdatePointer(pointer); else { @@ -780,12 +792,12 @@ private void updatePressed(List pointers) list.Add(pointer); pressedPointers.Add(pointer); - HitData hit = pointer.GetOverData(); - if (hit.Layer != null) - { - pointer.INTERNAL_SetPressData(hit); - hit.Layer.INTERNAL_PressPointer(pointer); - } + HitData hit = pointer.GetOverData(); + if (hit.Layer != null) + { + pointer.INTERNAL_SetPressData(hit); + hit.Layer.INTERNAL_PressPointer(pointer); + } #if TOUCHSCRIPT_DEBUG pLogger.Log(pointer, PointerEvent.Pressed); @@ -823,7 +835,7 @@ private void updateReleased(List pointers) pLogger.Log(pointer, PointerEvent.Released); #endif - var layer = pointer.GetPressData().Layer; + var layer = pointer.GetPressData().Layer; if (layer != null) layer.INTERNAL_ReleasePointer(pointer); #if TOUCHSCRIPT_DEBUG @@ -867,7 +879,7 @@ private void updateRemoved(List pointers) pLogger.Log(pointer, PointerEvent.Removed); #endif - for (var j = 0; j < layerCount; j++) + for (var j = 0; j < layerCount; j++) { var touchLayer = layers[j]; if (touchLayer == null) continue; @@ -916,7 +928,7 @@ private void updateCancelled(List pointers) pLogger.Log(pointer, PointerEvent.Cancelled); #endif - for (var j = 0; j < layerCount; j++) + for (var j = 0; j < layerCount; j++) { var touchLayer = layers[j]; if (touchLayer == null) continue; @@ -950,6 +962,7 @@ private void sendFrameStartedToPointers() private void updatePointers() { + samplerUpdatePointers.Begin(); if (frameStartedInvoker != null) frameStartedInvoker.InvokeHandleExceptions(this, EventArgs.Empty); // need to copy buffers since they might get updated during execution @@ -999,11 +1012,11 @@ private void updatePointers() } } - var count = pointers.Count; - for (var i = 0; i < count; i++) - { - pointers[i].INTERNAL_UpdatePosition(); - } + var count = pointers.Count; + for (var i = 0; i < count; i++) + { + pointers[i].INTERNAL_UpdatePosition(); + } if (addedList != null) { @@ -1038,6 +1051,7 @@ private void updatePointers() } if (frameFinishedInvoker != null) frameFinishedInvoker.InvokeHandleExceptions(this, EventArgs.Empty); + samplerUpdatePointers.End(); } #if TOUCHSCRIPT_DEBUG From 3573389d709f81743eee72d0b005f933bd91d347 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Fri, 21 Jul 2017 03:35:20 +0300 Subject: [PATCH 20/58] Fixed issues with Time.timeScale = 0: - Transformer smoothing wasn't working. - Color fade in Taps scene was failing. - Balls in RawInput scene were not flying. --- .../TouchScript/Examples/Photos/Photos.unity | 854 +++++++++--------- .../Examples/RawInput/RawInput.unity | 165 ++-- .../Examples/RawInput/Scripts/Ball.cs | 2 +- .../Examples/Taps/Scripts/Break.cs | 2 +- .../TouchScript/Examples/Taps/Taps.unity | 235 +++-- .../Scripts/Behaviors/Transformer.cs | 2 +- 6 files changed, 677 insertions(+), 583 deletions(-) diff --git a/Source/Assets/TouchScript/Examples/Photos/Photos.unity b/Source/Assets/TouchScript/Examples/Photos/Photos.unity index 60982238f..29163e690 100644 --- a/Source/Assets/TouchScript/Examples/Photos/Photos.unity +++ b/Source/Assets/TouchScript/Examples/Photos/Photos.unity @@ -1,19 +1,19 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: --- !u!29 &1 -SceneSettings: +OcclusionCullingSettings: m_ObjectHideFlags: 0 - m_PVSData: - m_PVSObjectsArray: [] - m_PVSPortalsArray: [] + serializedVersion: 2 m_OcclusionBakeSettings: smallestOccluder: 5 smallestHole: 0.25 backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 - serializedVersion: 6 + serializedVersion: 8 m_Fog: 0 m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 @@ -25,6 +25,7 @@ RenderSettings: m_AmbientGroundColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} m_AmbientIntensity: 1 m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} m_SkyboxMaterial: {fileID: 0} m_HaloStrength: 0.5 m_FlareStrength: 1 @@ -37,12 +38,12 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} --- !u!157 &4 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 6 + serializedVersion: 9 m_GIWorkflowMode: 1 - m_LightmapsMode: 1 m_GISettings: serializedVersion: 2 m_BounceScale: 1 @@ -53,48 +54,70 @@ LightmapSettings: m_EnableBakedLightmaps: 1 m_EnableRealtimeLightmaps: 0 m_LightmapEditorSettings: - serializedVersion: 3 + serializedVersion: 8 m_Resolution: 1 m_BakeResolution: 50 m_TextureWidth: 1024 m_TextureHeight: 1024 + m_AO: 0 m_AOMaxDistance: 1 - m_Padding: 2 m_CompAOExponent: 0 + m_CompAOExponentDirect: 0 + m_Padding: 2 m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 m_TextureCompression: 0 m_FinalGather: 0 + m_FinalGatherFiltering: 1 m_FinalGatherRayCount: 1024 m_ReflectionCompression: 2 + m_MixedBakeMode: 1 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVRFiltering: 0 + m_PVRFilteringMode: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousColorSigma: 1 + m_PVRFilteringAtrousNormalSigma: 1 + m_PVRFilteringAtrousPositionSigma: 1 m_LightingDataAsset: {fileID: 0} - m_RuntimeCPUUsage: 25 + m_ShadowMaskMode: 2 --- !u!196 &5 NavMeshSettings: serializedVersion: 2 m_ObjectHideFlags: 0 m_BuildSettings: serializedVersion: 2 + agentTypeID: 0 agentRadius: 0.5 agentHeight: 2 agentSlope: 45 agentClimb: 0.4 ledgeDropHeight: 0 maxJumpAcrossDistance: 0 - accuratePlacement: 0 minRegionArea: 2 - cellSize: 0.16666666 manualCellSize: 0 + cellSize: 0.16666666 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 m_NavMeshData: {fileID: 0} --- !u!1 &44638783 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 44638786} - - 222: {fileID: 44638785} - - 114: {fileID: 44638784} + - component: {fileID: 44638786} + - component: {fileID: 44638785} + - component: {fileID: 44638784} m_Layer: 0 m_Name: Image m_TagString: Untagged @@ -144,10 +167,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 94606778} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} @@ -158,14 +181,14 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 62216952} - - 20: {fileID: 62216957} - - 92: {fileID: 62216956} - - 124: {fileID: 62216955} - - 81: {fileID: 62216954} - - 114: {fileID: 62216953} + - component: {fileID: 62216952} + - component: {fileID: 62216957} + - component: {fileID: 62216956} + - component: {fileID: 62216955} + - component: {fileID: 62216954} + - component: {fileID: 62216953} m_Layer: 0 m_Name: Main Camera m_TagString: MainCamera @@ -182,10 +205,10 @@ Transform: m_LocalRotation: {x: -0.2620868, y: 0.3669622, z: -0.108559854, w: -0.88592553} m_LocalPosition: {x: 5.56, y: 4.82, z: -5.46} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 32.96, y: -45, z: 0} m_Children: [] m_Father: {fileID: 930800601} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 32.96, y: -45, z: 0} --- !u!114 &62216953 MonoBehaviour: m_ObjectHideFlags: 0 @@ -259,6 +282,8 @@ Camera: m_TargetDisplay: 0 m_TargetEye: 3 m_HDR: 0 + m_AllowMSAA: 1 + m_ForceIntoRT: 0 m_OcclusionCulling: 1 m_StereoConvergence: 10 m_StereoSeparation: 0.022 @@ -268,12 +293,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 94606778} - - 222: {fileID: 94606781} - - 114: {fileID: 94606780} - - 114: {fileID: 94606779} + - component: {fileID: 94606778} + - component: {fileID: 94606781} + - component: {fileID: 94606780} + - component: {fileID: 94606779} m_Layer: 0 m_Name: Add Button m_TagString: Untagged @@ -290,12 +315,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: -10} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 346878481} - {fileID: 44638786} m_Father: {fileID: 1301221420} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0.6024834, y: 0.31418145} m_AnchoredPosition: {x: 7, y: 4.5} @@ -391,11 +416,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 101996207} - - 222: {fileID: 101996209} - - 114: {fileID: 101996208} + - component: {fileID: 101996207} + - component: {fileID: 101996209} + - component: {fileID: 101996208} m_Layer: 5 m_Name: Image m_TagString: Untagged @@ -412,10 +437,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 2107589903} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.8} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} @@ -459,11 +484,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 107321542} - - 222: {fileID: 107321544} - - 114: {fileID: 107321543} + - component: {fileID: 107321542} + - component: {fileID: 107321544} + - component: {fileID: 107321543} m_Layer: 5 m_Name: Image m_TagString: Untagged @@ -480,10 +505,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 411870819} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} @@ -527,11 +552,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 142216716} - - 222: {fileID: 142216718} - - 114: {fileID: 142216717} + - component: {fileID: 142216716} + - component: {fileID: 142216718} + - component: {fileID: 142216717} m_Layer: 0 m_Name: Text m_TagString: Untagged @@ -548,10 +573,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: -59} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1932435999} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 74, y: -57} @@ -601,12 +626,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 187227222} - - 222: {fileID: 187227225} - - 114: {fileID: 187227224} - - 114: {fileID: 187227223} + - component: {fileID: 187227222} + - component: {fileID: 187227225} + - component: {fileID: 187227224} + - component: {fileID: 187227223} m_Layer: 5 m_Name: Panel m_TagString: Untagged @@ -623,7 +648,6 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 411870819} - {fileID: 1406281477} @@ -631,6 +655,7 @@ RectTransform: - {fileID: 701351979} m_Father: {fileID: 2107589903} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.8} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0.5} @@ -656,6 +681,8 @@ MonoBehaviour: m_Spacing: 4 m_ChildForceExpandWidth: 1 m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 --- !u!114 &187227224 MonoBehaviour: m_ObjectHideFlags: 0 @@ -694,12 +721,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 204253028} - - 223: {fileID: 204253031} - - 114: {fileID: 204253030} - - 114: {fileID: 204253029} + - component: {fileID: 204253028} + - component: {fileID: 204253031} + - component: {fileID: 204253030} + - component: {fileID: 204253029} m_Layer: 0 m_Name: Camera Canvas m_TagString: Untagged @@ -716,11 +743,11 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0, y: 0, z: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1236964526} m_Father: {fileID: 930800601} m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -770,7 +797,7 @@ Canvas: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 204253027} m_Enabled: 1 - serializedVersion: 2 + serializedVersion: 3 m_RenderMode: 1 m_Camera: {fileID: 62216957} m_PlaneDistance: 3 @@ -779,6 +806,7 @@ Canvas: m_OverrideSorting: 0 m_OverridePixelPerfect: 0 m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 m_SortingLayerID: 0 m_SortingOrder: 1 m_TargetDisplay: 0 @@ -787,10 +815,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 231102985} - - 114: {fileID: 231102986} + - component: {fileID: 231102985} + - component: {fileID: 231102986} m_Layer: 5 m_Name: List m_TagString: Untagged @@ -807,13 +835,13 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 620448983} - {fileID: 1169177132} - {fileID: 647493035} m_Father: {fileID: 660229293} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} @@ -839,20 +867,22 @@ MonoBehaviour: m_Spacing: -10 m_ChildForceExpandWidth: 1 m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 --- !u!1 &238072896 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 238072899} - - 222: {fileID: 238072898} - - 114: {fileID: 238072897} - - 114: {fileID: 238072905} - - 114: {fileID: 238072901} - - 114: {fileID: 238072900} - - 114: {fileID: 238072902} + - component: {fileID: 238072899} + - component: {fileID: 238072898} + - component: {fileID: 238072897} + - component: {fileID: 238072905} + - component: {fileID: 238072901} + - component: {fileID: 238072900} + - component: {fileID: 238072902} m_Layer: 0 m_Name: Image 1 m_TagString: Untagged @@ -901,12 +931,12 @@ RectTransform: m_LocalRotation: {x: 0.000000041385746, y: 0.000000010372778, z: 0.17927851, w: 0.9837984} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 20.6555} m_Children: - {fileID: 1593048785} - {fileID: 994844643} m_Father: {fileID: 1979221409} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 20.6555} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: -161, y: 123.99954} @@ -923,7 +953,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 978a486d8ecf8437cbb87e8534908895, type: 3} m_Name: m_EditorClassIdentifier: - enableSmoothing: 0 + enableSmoothing: 1 smoothingFactor: 0.0001 positionThreshold: 0.0001 rotationThreshold: 0.01 @@ -1033,11 +1063,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 281947296} - - 222: {fileID: 281947298} - - 114: {fileID: 281947297} + - component: {fileID: 281947296} + - component: {fileID: 281947298} + - component: {fileID: 281947297} m_Layer: 5 m_Name: Image m_TagString: Untagged @@ -1054,10 +1084,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 647493035} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} @@ -1101,11 +1131,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 290456373} - - 222: {fileID: 290456375} - - 114: {fileID: 290456374} + - component: {fileID: 290456373} + - component: {fileID: 290456375} + - component: {fileID: 290456374} m_Layer: 0 m_Name: Image m_TagString: Untagged @@ -1122,10 +1152,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 25.4} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1236964526} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 3.855} @@ -1169,11 +1199,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 327443543} - - 222: {fileID: 327443545} - - 114: {fileID: 327443544} + - component: {fileID: 327443543} + - component: {fileID: 327443545} + - component: {fileID: 327443544} m_Layer: 5 m_Name: Image m_TagString: Untagged @@ -1190,10 +1220,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1169177132} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} @@ -1237,11 +1267,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 346878481} - - 222: {fileID: 346878483} - - 114: {fileID: 346878482} + - component: {fileID: 346878481} + - component: {fileID: 346878483} + - component: {fileID: 346878482} m_Layer: 0 m_Name: Text m_TagString: Untagged @@ -1258,10 +1288,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 94606778} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.08590757, y: 0.21797578} m_AnchorMax: {x: 0.91627955, y: 0.79047644} m_AnchoredPosition: {x: 0, y: 0} @@ -1311,12 +1341,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 411870819} - - 222: {fileID: 411870818} - - 114: {fileID: 411870817} - - 114: {fileID: 411870816} + - component: {fileID: 411870819} + - component: {fileID: 411870818} + - component: {fileID: 411870817} + - component: {fileID: 411870816} m_Layer: 5 m_Name: Button m_TagString: Untagged @@ -1418,12 +1448,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 107321542} - {fileID: 2077422342} m_Father: {fileID: 187227222} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -1434,11 +1464,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 418595745} - - 223: {fileID: 418595748} - - 114: {fileID: 418595747} + - component: {fileID: 418595745} + - component: {fileID: 418595748} + - component: {fileID: 418595747} m_Layer: 5 m_Name: Canvas m_TagString: Untagged @@ -1455,12 +1485,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0, y: 0, z: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 660229293} - {fileID: 1414219394} m_Father: {fileID: 0} - m_RootOrder: 4 + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -1494,7 +1524,7 @@ Canvas: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 418595744} m_Enabled: 1 - serializedVersion: 2 + serializedVersion: 3 m_RenderMode: 0 m_Camera: {fileID: 0} m_PlaneDistance: 100 @@ -1503,6 +1533,7 @@ Canvas: m_OverrideSorting: 0 m_OverridePixelPerfect: 0 m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 m_SortingLayerID: 0 m_SortingOrder: 0 m_TargetDisplay: 0 @@ -1511,15 +1542,15 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 449324827} - - 222: {fileID: 449324833} - - 114: {fileID: 449324832} - - 114: {fileID: 449324828} - - 114: {fileID: 449324831} - - 114: {fileID: 449324830} - - 114: {fileID: 449324829} + - component: {fileID: 449324827} + - component: {fileID: 449324833} + - component: {fileID: 449324832} + - component: {fileID: 449324828} + - component: {fileID: 449324831} + - component: {fileID: 449324830} + - component: {fileID: 449324829} m_Layer: 0 m_Name: Image 6 m_TagString: Untagged @@ -1536,12 +1567,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0.24805124, w: 0.96874696} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1674922492} - {fileID: 1402680836} m_Father: {fileID: 1979221409} m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: 250, y: 69} @@ -1700,11 +1731,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 494057711} - - 222: {fileID: 494057713} - - 114: {fileID: 494057712} + - component: {fileID: 494057711} + - component: {fileID: 494057713} + - component: {fileID: 494057712} m_Layer: 5 m_Name: Image m_TagString: Untagged @@ -1721,10 +1752,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 620448983} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} @@ -1768,15 +1799,15 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 536919388} - - 222: {fileID: 536919394} - - 114: {fileID: 536919393} - - 114: {fileID: 536919389} - - 114: {fileID: 536919392} - - 114: {fileID: 536919391} - - 114: {fileID: 536919390} + - component: {fileID: 536919388} + - component: {fileID: 536919394} + - component: {fileID: 536919393} + - component: {fileID: 536919389} + - component: {fileID: 536919392} + - component: {fileID: 536919391} + - component: {fileID: 536919390} m_Layer: 0 m_Name: Image 4 m_TagString: Untagged @@ -1793,12 +1824,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0.24805124, w: 0.96874696} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 28.7244} m_Children: - {fileID: 1065855870} - {fileID: 1772489001} m_Father: {fileID: 1979221409} m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 28.7244} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: 223, y: 293} @@ -2003,12 +2034,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 551049735} - - 222: {fileID: 551049738} - - 114: {fileID: 551049737} - - 114: {fileID: 551049736} + - component: {fileID: 551049735} + - component: {fileID: 551049738} + - component: {fileID: 551049737} + - component: {fileID: 551049736} m_Layer: 5 m_Name: Text m_TagString: Untagged @@ -2025,10 +2056,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 647493035} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} @@ -2094,11 +2125,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 581803647} - - 222: {fileID: 581803649} - - 114: {fileID: 581803648} + - component: {fileID: 581803647} + - component: {fileID: 581803649} + - component: {fileID: 581803648} m_Layer: 0 m_Name: Border m_TagString: Untagged @@ -2115,10 +2146,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: -1} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 886654112} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} @@ -2162,11 +2193,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 585113474} - - 222: {fileID: 585113476} - - 114: {fileID: 585113475} + - component: {fileID: 585113474} + - component: {fileID: 585113476} + - component: {fileID: 585113475} m_Layer: 5 m_Name: Image m_TagString: Untagged @@ -2183,10 +2214,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 701351979} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} @@ -2230,10 +2261,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 620448983} - - 114: {fileID: 620448984} + - component: {fileID: 620448983} + - component: {fileID: 620448984} m_Layer: 5 m_Name: Move m_TagString: Untagged @@ -2250,12 +2281,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 494057711} - {fileID: 899875349} m_Father: {fileID: 231102985} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -2284,11 +2315,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 634725412} - - 222: {fileID: 634725414} - - 114: {fileID: 634725413} + - component: {fileID: 634725412} + - component: {fileID: 634725414} + - component: {fileID: 634725413} m_Layer: 0 m_Name: Border m_TagString: Untagged @@ -2305,10 +2336,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: -1} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1485721903} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} @@ -2352,10 +2383,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 647493035} - - 114: {fileID: 647493036} + - component: {fileID: 647493035} + - component: {fileID: 647493036} m_Layer: 5 m_Name: Color m_TagString: Untagged @@ -2372,12 +2403,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 281947296} - {fileID: 551049735} m_Father: {fileID: 231102985} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -2406,11 +2437,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 651643064} - - 114: {fileID: 651643063} - - 114: {fileID: 651643061} + - component: {fileID: 651643064} + - component: {fileID: 651643063} m_Layer: 0 m_Name: EventSystem m_TagString: Untagged @@ -2418,23 +2448,6 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &651643061 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 651643060} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 803d2abe167ae40a0957010be5cfb7d1, type: 3} - m_Name: - m_EditorClassIdentifier: - HorizontalAxis: Horizontal - VerticalAxis: Vertical - SubmitButton: Submit - CancelButton: Cancel - InputActionsPerSecond: 10 - RepeatDelay: 0.5 --- !u!114 &651643063 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2458,18 +2471,18 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 3 + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &660229292 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 660229293} + - component: {fileID: 660229293} m_Layer: 5 m_Name: Panel m_TagString: Untagged @@ -2486,11 +2499,11 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 231102985} m_Father: {fileID: 418595745} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0.25263783, y: 1} m_AnchoredPosition: {x: 5, y: 50} @@ -2501,11 +2514,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 663465965} - - 222: {fileID: 663465967} - - 114: {fileID: 663465966} + - component: {fileID: 663465965} + - component: {fileID: 663465967} + - component: {fileID: 663465966} m_Layer: 0 m_Name: Border m_TagString: Untagged @@ -2522,10 +2535,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: -1} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1979821161} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} @@ -2569,11 +2582,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 689392537} - - 222: {fileID: 689392539} - - 114: {fileID: 689392538} + - component: {fileID: 689392537} + - component: {fileID: 689392539} + - component: {fileID: 689392538} m_Layer: 5 m_Name: Image m_TagString: Untagged @@ -2590,10 +2603,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1406281477} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} @@ -2637,12 +2650,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 701351979} - - 222: {fileID: 701351983} - - 114: {fileID: 701351982} - - 114: {fileID: 701351981} + - component: {fileID: 701351979} + - component: {fileID: 701351983} + - component: {fileID: 701351982} + - component: {fileID: 701351981} m_Layer: 5 m_Name: Button m_TagString: Untagged @@ -2659,12 +2672,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 585113474} - {fileID: 1615394527} m_Father: {fileID: 187227222} m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -2760,15 +2773,15 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 886654112} - - 222: {fileID: 886654118} - - 114: {fileID: 886654117} - - 114: {fileID: 886654120} - - 114: {fileID: 886654115} - - 114: {fileID: 886654114} - - 114: {fileID: 886654113} + - component: {fileID: 886654112} + - component: {fileID: 886654118} + - component: {fileID: 886654117} + - component: {fileID: 886654120} + - component: {fileID: 886654115} + - component: {fileID: 886654114} + - component: {fileID: 886654113} m_Layer: 0 m_Name: Image 2 m_TagString: Untagged @@ -2785,12 +2798,12 @@ RectTransform: m_LocalRotation: {x: 0.00000003982022, y: 0.000000006836789, z: 0.24805123, w: 0.96874696} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 581803647} - {fileID: 1423800608} m_Father: {fileID: 1979221409} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: 218, y: -143.99887} @@ -2843,7 +2856,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 978a486d8ecf8437cbb87e8534908895, type: 3} m_Name: m_EditorClassIdentifier: - enableSmoothing: 0 + enableSmoothing: 1 smoothingFactor: 0.0001 positionThreshold: 0.0001 rotationThreshold: 0.01 @@ -2949,10 +2962,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 894414302} - - 20: {fileID: 894414306} + - component: {fileID: 894414302} + - component: {fileID: 894414306} m_Layer: 0 m_Name: Camera m_TagString: Untagged @@ -2969,10 +2982,10 @@ Transform: m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071067} m_LocalPosition: {x: 0, y: 9.32, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1292123036} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!20 &894414306 Camera: m_ObjectHideFlags: 0 @@ -3003,6 +3016,8 @@ Camera: m_TargetDisplay: 0 m_TargetEye: 3 m_HDR: 0 + m_AllowMSAA: 1 + m_ForceIntoRT: 0 m_OcclusionCulling: 1 m_StereoConvergence: 10 m_StereoSeparation: 0.022 @@ -3012,12 +3027,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 899875349} - - 222: {fileID: 899875352} - - 114: {fileID: 899875351} - - 114: {fileID: 899875350} + - component: {fileID: 899875349} + - component: {fileID: 899875352} + - component: {fileID: 899875351} + - component: {fileID: 899875350} m_Layer: 5 m_Name: Text m_TagString: Untagged @@ -3034,10 +3049,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 620448983} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} @@ -3101,9 +3116,9 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 930800601} + - component: {fileID: 930800601} m_Layer: 0 m_Name: Scene m_TagString: Untagged @@ -3120,7 +3135,6 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1292123036} - {fileID: 2135305920} @@ -3129,16 +3143,17 @@ Transform: - {fileID: 2107589903} m_Father: {fileID: 0} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &982847339 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 982847340} - - 222: {fileID: 982847342} - - 114: {fileID: 982847341} + - component: {fileID: 982847340} + - component: {fileID: 982847342} + - component: {fileID: 982847341} m_Layer: 5 m_Name: Image m_TagString: Untagged @@ -3155,10 +3170,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1101956163} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} @@ -3202,12 +3217,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 994844643} - - 222: {fileID: 994844647} - - 114: {fileID: 994844646} - - 114: {fileID: 994844645} + - component: {fileID: 994844643} + - component: {fileID: 994844647} + - component: {fileID: 994844646} + - component: {fileID: 994844645} m_Layer: 0 m_Name: Close m_TagString: Untagged @@ -3224,10 +3239,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: -5} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 238072899} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 18, y: -18} @@ -3323,11 +3338,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1027187498} - - 222: {fileID: 1027187500} - - 114: {fileID: 1027187499} + - component: {fileID: 1027187498} + - component: {fileID: 1027187500} + - component: {fileID: 1027187499} m_Layer: 0 m_Name: Text m_TagString: Untagged @@ -3344,13 +3359,13 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0.000027779} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1236964526} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.30900002, y: 0} m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: -0.13402, y: -21.1} + m_AnchoredPosition: {x: -0.13402176, y: -21.099998} m_SizeDelta: {x: -0.26796, y: 29.8} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1027187499 @@ -3397,11 +3412,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1056464759} - - 222: {fileID: 1056464761} - - 114: {fileID: 1056464760} + - component: {fileID: 1056464759} + - component: {fileID: 1056464761} + - component: {fileID: 1056464760} m_Layer: 5 m_Name: Text m_TagString: Untagged @@ -3418,13 +3433,13 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 2107589903} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.69750005, y: 0.69600004} m_AnchorMax: {x: 1, y: 0.8} - m_AnchoredPosition: {x: 1.1, y: -6} + m_AnchoredPosition: {x: 1.1000061, y: -6} m_SizeDelta: {x: -30.2, y: -12} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1056464760 @@ -3471,11 +3486,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1065855870} - - 222: {fileID: 1065855872} - - 114: {fileID: 1065855871} + - component: {fileID: 1065855870} + - component: {fileID: 1065855872} + - component: {fileID: 1065855871} m_Layer: 0 m_Name: Border m_TagString: Untagged @@ -3492,10 +3507,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: -1} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 536919388} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} @@ -3539,12 +3554,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1101956163} - - 222: {fileID: 1101956167} - - 114: {fileID: 1101956166} - - 114: {fileID: 1101956165} + - component: {fileID: 1101956163} + - component: {fileID: 1101956167} + - component: {fileID: 1101956166} + - component: {fileID: 1101956165} m_Layer: 5 m_Name: Button m_TagString: Untagged @@ -3561,12 +3576,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 982847340} - {fileID: 1820795547} m_Father: {fileID: 187227222} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -3662,10 +3677,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1169177132} - - 114: {fileID: 1169177133} + - component: {fileID: 1169177132} + - component: {fileID: 1169177133} m_Layer: 5 m_Name: Add m_TagString: Untagged @@ -3682,12 +3697,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 327443543} - {fileID: 1430826382} m_Father: {fileID: 231102985} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -3716,11 +3731,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1236964526} - - 222: {fileID: 1236964528} - - 114: {fileID: 1236964527} + - component: {fileID: 1236964526} + - component: {fileID: 1236964528} + - component: {fileID: 1236964527} m_Layer: 0 m_Name: Panel m_TagString: Untagged @@ -3737,7 +3752,6 @@ RectTransform: m_LocalRotation: {x: 0.040250417, y: 0.38025388, z: -0.00021144397, w: 0.9240059} m_LocalPosition: {x: 0, y: 0, z: -12} m_LocalScale: {x: 0.6, y: 0.6, z: 0.6} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1027187498} - {fileID: 290456373} @@ -3745,6 +3759,7 @@ RectTransform: - {fileID: 1301221420} m_Father: {fileID: 204253028} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.62780094, y: 0} m_AnchorMax: {x: 1, y: 0.6333225} m_AnchoredPosition: {x: -8, y: -10} @@ -3788,11 +3803,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1276931409} - - 222: {fileID: 1276931411} - - 114: {fileID: 1276931410} + - component: {fileID: 1276931409} + - component: {fileID: 1276931411} + - component: {fileID: 1276931410} m_Layer: 5 m_Name: Text m_TagString: Untagged @@ -3809,10 +3824,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1406281477} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} @@ -3862,12 +3877,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 1292123036} - - 33: {fileID: 1292123039} - - 64: {fileID: 1292123038} - - 23: {fileID: 1292123037} + - component: {fileID: 1292123036} + - component: {fileID: 1292123039} + - component: {fileID: 1292123038} + - component: {fileID: 1292123037} m_Layer: 0 m_Name: World Space Plane m_TagString: Untagged @@ -3884,12 +3899,12 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1932435999} - {fileID: 894414302} m_Father: {fileID: 930800601} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!23 &1292123037 MeshRenderer: m_ObjectHideFlags: 0 @@ -3899,22 +3914,28 @@ MeshRenderer: m_Enabled: 1 m_CastShadows: 1 m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 m_Materials: - {fileID: 10302, guid: 0000000000000000f000000000000000, type: 0} - m_SubsetIndices: + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 m_StaticBatchRoot: {fileID: 0} - m_UseLightProbes: 0 - m_ReflectionProbeUsage: 1 m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} m_ScaleInLightmap: 1 m_PreserveUVs: 0 m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 m_MinimumChartSize: 4 m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} m_SortingLayerID: 0 + m_SortingLayer: 0 m_SortingOrder: 0 --- !u!64 &1292123038 MeshCollider: @@ -3927,6 +3948,8 @@ MeshCollider: m_Enabled: 1 serializedVersion: 2 m_Convex: 0 + m_InflateMesh: 0 + m_SkinWidth: 0.01 m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} --- !u!33 &1292123039 MeshFilter: @@ -3940,11 +3963,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1301221420} - - 222: {fileID: 1301221422} - - 114: {fileID: 1301221421} + - component: {fileID: 1301221420} + - component: {fileID: 1301221422} + - component: {fileID: 1301221421} m_Layer: 0 m_Name: Panel m_TagString: Untagged @@ -3961,11 +3984,11 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0.000007119311} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 94606778} m_Father: {fileID: 1236964526} m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} @@ -4009,12 +4032,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1402680836} - - 222: {fileID: 1402680840} - - 114: {fileID: 1402680839} - - 114: {fileID: 1402680838} + - component: {fileID: 1402680836} + - component: {fileID: 1402680840} + - component: {fileID: 1402680839} + - component: {fileID: 1402680838} m_Layer: 0 m_Name: Close m_TagString: Untagged @@ -4031,10 +4054,10 @@ RectTransform: m_LocalRotation: {x: 0.0000006631017, y: -0.00000014901161, z: -0.07035693, w: 0.9975219} m_LocalPosition: {x: 0, y: 0, z: -5} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 449324827} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 18, y: -18} @@ -4130,12 +4153,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1406281477} - - 222: {fileID: 1406281481} - - 114: {fileID: 1406281480} - - 114: {fileID: 1406281479} + - component: {fileID: 1406281477} + - component: {fileID: 1406281481} + - component: {fileID: 1406281480} + - component: {fileID: 1406281479} m_Layer: 5 m_Name: Button m_TagString: Untagged @@ -4152,12 +4175,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 689392537} - {fileID: 1276931409} m_Father: {fileID: 187227222} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -4253,12 +4276,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1414219394} - - 222: {fileID: 1414219393} - - 114: {fileID: 1414219392} - - 114: {fileID: 1414219391} + - component: {fileID: 1414219394} + - component: {fileID: 1414219393} + - component: {fileID: 1414219392} + - component: {fileID: 1414219391} m_Layer: 5 m_Name: Description m_TagString: Untagged @@ -4329,10 +4352,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 418595745} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 156, y: 48.3} @@ -4343,12 +4366,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1423800608} - - 222: {fileID: 1423800612} - - 114: {fileID: 1423800611} - - 114: {fileID: 1423800610} + - component: {fileID: 1423800608} + - component: {fileID: 1423800612} + - component: {fileID: 1423800611} + - component: {fileID: 1423800610} m_Layer: 0 m_Name: Close m_TagString: Untagged @@ -4365,10 +4388,10 @@ RectTransform: m_LocalRotation: {x: 0.0000006631017, y: -0.00000014901161, z: -0.07035693, w: 0.9975219} m_LocalPosition: {x: 0, y: 0, z: -5} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 886654112} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 18, y: -18} @@ -4464,12 +4487,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1430826382} - - 222: {fileID: 1430826385} - - 114: {fileID: 1430826384} - - 114: {fileID: 1430826383} + - component: {fileID: 1430826382} + - component: {fileID: 1430826385} + - component: {fileID: 1430826384} + - component: {fileID: 1430826383} m_Layer: 5 m_Name: Text m_TagString: Untagged @@ -4486,10 +4509,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1169177132} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} @@ -4555,11 +4578,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1477172502} - - 222: {fileID: 1477172504} - - 114: {fileID: 1477172503} + - component: {fileID: 1477172502} + - component: {fileID: 1477172504} + - component: {fileID: 1477172503} m_Layer: 0 m_Name: RawImage m_TagString: Untagged @@ -4576,10 +4599,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1.0000001, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1236964526} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0.000019073486, y: 0.00004196167} @@ -4622,15 +4645,15 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1485721903} - - 222: {fileID: 1485721909} - - 114: {fileID: 1485721908} - - 114: {fileID: 1485721907} - - 114: {fileID: 1485721906} - - 114: {fileID: 1485721905} - - 114: {fileID: 1485721904} + - component: {fileID: 1485721903} + - component: {fileID: 1485721909} + - component: {fileID: 1485721908} + - component: {fileID: 1485721907} + - component: {fileID: 1485721906} + - component: {fileID: 1485721905} + - component: {fileID: 1485721904} m_Layer: 0 m_Name: Image 5 m_TagString: Untagged @@ -4647,12 +4670,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0.24805124, w: 0.96874696} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 634725412} - {fileID: 2041974587} m_Father: {fileID: 1979221409} m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: 4, y: 14} @@ -4811,11 +4834,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1593048785} - - 222: {fileID: 1593048787} - - 114: {fileID: 1593048786} + - component: {fileID: 1593048785} + - component: {fileID: 1593048787} + - component: {fileID: 1593048786} m_Layer: 0 m_Name: Border m_TagString: Untagged @@ -4832,10 +4855,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: -1} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 238072899} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} @@ -4879,11 +4902,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1615394527} - - 222: {fileID: 1615394529} - - 114: {fileID: 1615394528} + - component: {fileID: 1615394527} + - component: {fileID: 1615394529} + - component: {fileID: 1615394528} m_Layer: 5 m_Name: Text m_TagString: Untagged @@ -4900,10 +4923,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 701351979} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} @@ -4953,11 +4976,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1674922492} - - 222: {fileID: 1674922494} - - 114: {fileID: 1674922493} + - component: {fileID: 1674922492} + - component: {fileID: 1674922494} + - component: {fileID: 1674922493} m_Layer: 0 m_Name: Border m_TagString: Untagged @@ -4974,10 +4997,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: -1} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 449324827} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} @@ -5031,12 +5054,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1772489001} - - 222: {fileID: 1772489005} - - 114: {fileID: 1772489004} - - 114: {fileID: 1772489003} + - component: {fileID: 1772489001} + - component: {fileID: 1772489005} + - component: {fileID: 1772489004} + - component: {fileID: 1772489003} m_Layer: 0 m_Name: Close m_TagString: Untagged @@ -5053,10 +5076,10 @@ RectTransform: m_LocalRotation: {x: 0.0000006631017, y: -0.00000014901161, z: -0.07035693, w: 0.9975219} m_LocalPosition: {x: 0, y: 0, z: -5} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 536919388} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 18, y: -18} @@ -5152,11 +5175,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1820795547} - - 222: {fileID: 1820795549} - - 114: {fileID: 1820795548} + - component: {fileID: 1820795547} + - component: {fileID: 1820795549} + - component: {fileID: 1820795548} m_Layer: 5 m_Name: Text m_TagString: Untagged @@ -5173,10 +5196,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1101956163} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} @@ -5226,12 +5249,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1932435999} - - 223: {fileID: 1932436002} - - 114: {fileID: 1932436001} - - 114: {fileID: 1932436000} + - component: {fileID: 1932435999} + - component: {fileID: 1932436002} + - component: {fileID: 1932436001} + - component: {fileID: 1932436000} m_Layer: 0 m_Name: World Space Canvas m_TagString: Untagged @@ -5248,13 +5271,13 @@ RectTransform: m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071067} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.01, y: 0.01, z: 0.01} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 2015117398} - {fileID: 1979221409} - {fileID: 142216716} m_Father: {fileID: 1292123036} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0.01001} @@ -5304,7 +5327,7 @@ Canvas: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1932435998} m_Enabled: 1 - serializedVersion: 2 + serializedVersion: 3 m_RenderMode: 2 m_Camera: {fileID: 62216957} m_PlaneDistance: 100 @@ -5313,6 +5336,7 @@ Canvas: m_OverrideSorting: 0 m_OverridePixelPerfect: 0 m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 m_SortingLayerID: 0 m_SortingOrder: 0 m_TargetDisplay: 0 @@ -5321,13 +5345,13 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1979221409} - - 222: {fileID: 1979221411} - - 114: {fileID: 1979221410} - - 114: {fileID: 1979221412} - - 114: {fileID: 1979221413} + - component: {fileID: 1979221409} + - component: {fileID: 1979221411} + - component: {fileID: 1979221410} + - component: {fileID: 1979221412} + - component: {fileID: 1979221413} m_Layer: 0 m_Name: Field m_TagString: Untagged @@ -5344,7 +5368,6 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: -25} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 238072899} - {fileID: 886654112} @@ -5354,6 +5377,7 @@ RectTransform: - {fileID: 449324827} m_Father: {fileID: 1932435999} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: -0.000002682209} @@ -5426,15 +5450,15 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1979821161} - - 222: {fileID: 1979821167} - - 114: {fileID: 1979821166} - - 114: {fileID: 1979821165} - - 114: {fileID: 1979821164} - - 114: {fileID: 1979821163} - - 114: {fileID: 1979821162} + - component: {fileID: 1979821161} + - component: {fileID: 1979821167} + - component: {fileID: 1979821166} + - component: {fileID: 1979821165} + - component: {fileID: 1979821164} + - component: {fileID: 1979821163} + - component: {fileID: 1979821162} m_Layer: 0 m_Name: Image 3 m_TagString: Untagged @@ -5451,12 +5475,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0.24805124, w: 0.96874696} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 663465965} - {fileID: 2082518918} m_Father: {fileID: 1979221409} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: -141, y: -231} @@ -5615,11 +5639,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 2015117398} - - 222: {fileID: 2015117400} - - 114: {fileID: 2015117399} + - component: {fileID: 2015117398} + - component: {fileID: 2015117400} + - component: {fileID: 2015117399} m_Layer: 0 m_Name: Checkerboard m_TagString: Untagged @@ -5636,10 +5660,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: -25} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1932435999} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} @@ -5683,12 +5707,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 2041974587} - - 222: {fileID: 2041974591} - - 114: {fileID: 2041974590} - - 114: {fileID: 2041974589} + - component: {fileID: 2041974587} + - component: {fileID: 2041974591} + - component: {fileID: 2041974590} + - component: {fileID: 2041974589} m_Layer: 0 m_Name: Close m_TagString: Untagged @@ -5705,10 +5729,10 @@ RectTransform: m_LocalRotation: {x: 0.0000006631017, y: -0.00000014901161, z: -0.07035693, w: 0.9975219} m_LocalPosition: {x: 0, y: 0, z: -5} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1485721903} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 18, y: -18} @@ -5804,11 +5828,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 2077422342} - - 222: {fileID: 2077422344} - - 114: {fileID: 2077422343} + - component: {fileID: 2077422342} + - component: {fileID: 2077422344} + - component: {fileID: 2077422343} m_Layer: 5 m_Name: Text m_TagString: Untagged @@ -5825,10 +5849,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 411870819} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} @@ -5878,12 +5902,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 2082518918} - - 222: {fileID: 2082518922} - - 114: {fileID: 2082518921} - - 114: {fileID: 2082518920} + - component: {fileID: 2082518918} + - component: {fileID: 2082518922} + - component: {fileID: 2082518921} + - component: {fileID: 2082518920} m_Layer: 0 m_Name: Close m_TagString: Untagged @@ -5900,10 +5924,10 @@ RectTransform: m_LocalRotation: {x: 0.0000006631017, y: -0.00000014901161, z: -0.07035693, w: 0.9975219} m_LocalPosition: {x: 0, y: 0, z: -5} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1979821161} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 18, y: -18} @@ -5999,12 +6023,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 2107589903} - - 223: {fileID: 2107589906} - - 114: {fileID: 2107589905} - - 114: {fileID: 2107589904} + - component: {fileID: 2107589903} + - component: {fileID: 2107589906} + - component: {fileID: 2107589905} + - component: {fileID: 2107589904} m_Layer: 5 m_Name: ScreenSpace Canvas m_TagString: Untagged @@ -6021,13 +6045,13 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0, y: 0, z: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 101996207} - {fileID: 187227222} - {fileID: 1056464759} m_Father: {fileID: 930800601} m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -6077,7 +6101,7 @@ Canvas: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 2107589902} m_Enabled: 1 - serializedVersion: 2 + serializedVersion: 3 m_RenderMode: 0 m_Camera: {fileID: 0} m_PlaneDistance: 100 @@ -6086,6 +6110,7 @@ Canvas: m_OverrideSorting: 0 m_OverridePixelPerfect: 0 m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 m_SortingLayerID: 0 m_SortingOrder: 0 m_TargetDisplay: 0 @@ -6094,10 +6119,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 2135305920} - - 108: {fileID: 2135305921} + - component: {fileID: 2135305920} + - component: {fileID: 2135305921} m_Layer: 0 m_Name: Directional light m_TagString: Untagged @@ -6114,10 +6139,10 @@ Transform: m_LocalRotation: {x: 0.4222682, y: -0.4847204, z: -0.017199006, w: 0.7657936} m_LocalPosition: {x: 6.1004148, y: 15.540384, z: -20.566225} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 930800601} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!108 &2135305921 Light: m_ObjectHideFlags: 0 @@ -6125,7 +6150,7 @@ Light: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 2135305919} m_Enabled: 1 - serializedVersion: 6 + serializedVersion: 8 m_Type: 1 m_Color: {r: 1, g: 1, b: 1, a: 1} m_Intensity: 1.3 @@ -6135,6 +6160,7 @@ Light: m_Shadows: m_Type: 1 m_Resolution: -1 + m_CustomResolution: -1 m_Strength: 0.2 m_Bias: 0.05 m_NormalBias: 0.4 @@ -6147,7 +6173,9 @@ Light: serializedVersion: 2 m_Bits: 4294967295 m_Lightmapping: 1 + m_AreaSize: {x: 1, y: 1} m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 m_ShadowRadius: 0 m_ShadowAngle: 0 - m_AreaSize: {x: 1, y: 1} diff --git a/Source/Assets/TouchScript/Examples/RawInput/RawInput.unity b/Source/Assets/TouchScript/Examples/RawInput/RawInput.unity index 3ee57dcdf..a8f05f794 100644 --- a/Source/Assets/TouchScript/Examples/RawInput/RawInput.unity +++ b/Source/Assets/TouchScript/Examples/RawInput/RawInput.unity @@ -1,19 +1,19 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: --- !u!29 &1 -SceneSettings: +OcclusionCullingSettings: m_ObjectHideFlags: 0 - m_PVSData: - m_PVSObjectsArray: [] - m_PVSPortalsArray: [] + serializedVersion: 2 m_OcclusionBakeSettings: smallestOccluder: 5 smallestHole: 0.25 backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 - serializedVersion: 6 + serializedVersion: 8 m_Fog: 0 m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 @@ -25,6 +25,7 @@ RenderSettings: m_AmbientGroundColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} m_AmbientIntensity: 1 m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} m_SkyboxMaterial: {fileID: 2100000, guid: a07fadb24ea940240afba3afc1a692cc, type: 2} m_HaloStrength: 0.5 m_FlareStrength: 1 @@ -37,12 +38,12 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} --- !u!157 &4 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 6 + serializedVersion: 9 m_GIWorkflowMode: 1 - m_LightmapsMode: 1 m_GISettings: serializedVersion: 2 m_BounceScale: 1 @@ -53,51 +54,73 @@ LightmapSettings: m_EnableBakedLightmaps: 1 m_EnableRealtimeLightmaps: 0 m_LightmapEditorSettings: - serializedVersion: 3 + serializedVersion: 8 m_Resolution: 1 m_BakeResolution: 50 m_TextureWidth: 1024 m_TextureHeight: 1024 + m_AO: 0 m_AOMaxDistance: 1 - m_Padding: 2 m_CompAOExponent: 0 + m_CompAOExponentDirect: 0 + m_Padding: 2 m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 m_TextureCompression: 0 m_FinalGather: 0 + m_FinalGatherFiltering: 1 m_FinalGatherRayCount: 1024 m_ReflectionCompression: 2 + m_MixedBakeMode: 1 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVRFiltering: 0 + m_PVRFilteringMode: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousColorSigma: 1 + m_PVRFilteringAtrousNormalSigma: 1 + m_PVRFilteringAtrousPositionSigma: 1 m_LightingDataAsset: {fileID: 0} - m_RuntimeCPUUsage: 25 + m_ShadowMaskMode: 2 --- !u!196 &5 NavMeshSettings: serializedVersion: 2 m_ObjectHideFlags: 0 m_BuildSettings: serializedVersion: 2 + agentTypeID: 0 agentRadius: 0.5 agentHeight: 2 agentSlope: 45 agentClimb: 0.4 ledgeDropHeight: 0 maxJumpAcrossDistance: 0 - accuratePlacement: 0 minRegionArea: 2 - cellSize: 0.16666666 manualCellSize: 0 + cellSize: 0.16666666 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 m_NavMeshData: {fileID: 0} --- !u!1 &62216951 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 62216952} - - 20: {fileID: 62216957} - - 92: {fileID: 62216956} - - 124: {fileID: 62216955} - - 81: {fileID: 62216954} - - 114: {fileID: 62216953} + - component: {fileID: 62216952} + - component: {fileID: 62216957} + - component: {fileID: 62216956} + - component: {fileID: 62216955} + - component: {fileID: 62216954} + - component: {fileID: 62216953} m_Layer: 0 m_Name: Camera m_TagString: MainCamera @@ -114,10 +137,10 @@ Transform: m_LocalRotation: {x: 0.97875386, y: 0, z: 0, w: 0.20503876} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 23.6635, y: -180, z: -180} m_Children: [] m_Father: {fileID: 930800601} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 23.6635, y: -180, z: -180} --- !u!114 &62216953 MonoBehaviour: m_ObjectHideFlags: 0 @@ -181,6 +204,8 @@ Camera: m_TargetDisplay: 0 m_TargetEye: 3 m_HDR: 0 + m_AllowMSAA: 1 + m_ForceIntoRT: 0 m_OcclusionCulling: 1 m_StereoConvergence: 10 m_StereoSeparation: 0.022 @@ -190,10 +215,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 250857271} - - 114: {fileID: 250857270} + - component: {fileID: 250857271} + - component: {fileID: 250857270} m_Layer: 5 m_Name: List m_TagString: Untagged @@ -221,6 +246,8 @@ MonoBehaviour: m_Spacing: 0 m_ChildForceExpandWidth: 1 m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 --- !u!224 &250857271 RectTransform: m_ObjectHideFlags: 0 @@ -230,11 +257,11 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1679844150} m_Father: {fileID: 1981142013} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} @@ -295,11 +322,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 740851132} - - 223: {fileID: 740851135} - - 114: {fileID: 740851134} + - component: {fileID: 740851132} + - component: {fileID: 740851135} + - component: {fileID: 740851134} m_Layer: 5 m_Name: Canvas m_TagString: Untagged @@ -316,12 +343,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0, y: 0, z: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1981142013} - {fileID: 1552723601} m_Father: {fileID: 0} m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -355,7 +382,7 @@ Canvas: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 740851131} m_Enabled: 1 - serializedVersion: 2 + serializedVersion: 3 m_RenderMode: 0 m_Camera: {fileID: 0} m_PlaneDistance: 100 @@ -364,6 +391,7 @@ Canvas: m_OverrideSorting: 0 m_OverridePixelPerfect: 0 m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 m_SortingLayerID: 0 m_SortingOrder: 0 m_TargetDisplay: 0 @@ -372,9 +400,9 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 930800601} + - component: {fileID: 930800601} m_Layer: 0 m_Name: Scene m_TagString: Untagged @@ -391,22 +419,22 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 2135305920} - {fileID: 62216952} m_Father: {fileID: 0} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1138005899 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1138005900} - - 222: {fileID: 1138005902} - - 114: {fileID: 1138005901} + - component: {fileID: 1138005900} + - component: {fileID: 1138005902} + - component: {fileID: 1138005901} m_Layer: 5 m_Name: Image m_TagString: Untagged @@ -423,10 +451,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1679844150} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} @@ -470,12 +498,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1408280581} - - 222: {fileID: 1408280583} - - 114: {fileID: 1408280582} - - 114: {fileID: 1408280584} + - component: {fileID: 1408280581} + - component: {fileID: 1408280583} + - component: {fileID: 1408280582} + - component: {fileID: 1408280584} m_Layer: 5 m_Name: Text m_TagString: Untagged @@ -492,10 +520,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1679844150} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} @@ -559,12 +587,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1552723601} - - 222: {fileID: 1552723603} - - 114: {fileID: 1552723602} - - 114: {fileID: 1552723604} + - component: {fileID: 1552723601} + - component: {fileID: 1552723603} + - component: {fileID: 1552723602} + - component: {fileID: 1552723604} m_Layer: 5 m_Name: Description m_TagString: Untagged @@ -581,10 +609,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 740851132} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 178, y: 48.2} @@ -652,10 +680,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1679844150} - - 114: {fileID: 1679844151} + - component: {fileID: 1679844150} + - component: {fileID: 1679844151} m_Layer: 5 m_Name: Touch m_TagString: Untagged @@ -672,12 +700,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1138005900} - {fileID: 1408280581} m_Father: {fileID: 250857271} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -706,10 +734,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 1764701050} - - 114: {fileID: 1764701049} + - component: {fileID: 1764701050} + - component: {fileID: 1764701049} m_Layer: 0 m_Name: EventSystem m_TagString: Untagged @@ -740,10 +768,10 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 0} m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &1772227325 Prefab: m_ObjectHideFlags: 0 @@ -771,9 +799,9 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1981142013} + - component: {fileID: 1981142013} m_Layer: 5 m_Name: Panel m_TagString: Untagged @@ -790,11 +818,11 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 250857271} m_Father: {fileID: 740851132} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0.25263783, y: 1} m_AnchoredPosition: {x: 5, y: 50} @@ -805,10 +833,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 2135305920} - - 108: {fileID: 2135305921} + - component: {fileID: 2135305920} + - component: {fileID: 2135305921} m_Layer: 0 m_Name: Directional light m_TagString: Untagged @@ -825,10 +853,10 @@ Transform: m_LocalRotation: {x: 0.32484895, y: -0.86744815, z: 0.043405317, w: 0.37432998} m_LocalPosition: {x: 6.1004148, y: 15.540384, z: -20.566225} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 930800601} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!108 &2135305921 Light: m_ObjectHideFlags: 0 @@ -836,7 +864,7 @@ Light: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 2135305919} m_Enabled: 1 - serializedVersion: 6 + serializedVersion: 8 m_Type: 1 m_Color: {r: 1, g: 1, b: 1, a: 1} m_Intensity: 1.3 @@ -846,6 +874,7 @@ Light: m_Shadows: m_Type: 2 m_Resolution: 3 + m_CustomResolution: -1 m_Strength: 0.56 m_Bias: 0.1 m_NormalBias: 0.4 @@ -858,7 +887,9 @@ Light: serializedVersion: 2 m_Bits: 4294967295 m_Lightmapping: 1 + m_AreaSize: {x: 1, y: 1} m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 m_ShadowRadius: 0 m_ShadowAngle: 0 - m_AreaSize: {x: 1, y: 1} diff --git a/Source/Assets/TouchScript/Examples/RawInput/Scripts/Ball.cs b/Source/Assets/TouchScript/Examples/RawInput/Scripts/Ball.cs index aff73a9b6..d99706fcf 100644 --- a/Source/Assets/TouchScript/Examples/RawInput/Scripts/Ball.cs +++ b/Source/Assets/TouchScript/Examples/RawInput/Scripts/Ball.cs @@ -13,7 +13,7 @@ public class Ball : MonoBehaviour private void Update() { Speed *= 1.01f; - transform.position += transform.forward*Speed*Time.deltaTime; + transform.position += transform.forward * Speed * Time.unscaledDeltaTime; if (Speed > 1000) Destroy(gameObject); } } diff --git a/Source/Assets/TouchScript/Examples/Taps/Scripts/Break.cs b/Source/Assets/TouchScript/Examples/Taps/Scripts/Break.cs index 6ce9ba248..404752b1e 100644 --- a/Source/Assets/TouchScript/Examples/Taps/Scripts/Break.cs +++ b/Source/Assets/TouchScript/Examples/Taps/Scripts/Break.cs @@ -51,7 +51,7 @@ private void Update() { if (growing) { - growingTime += Time.deltaTime; + growingTime += Time.unscaledDeltaTime; rnd.material.color = Color.Lerp(Color.white, Color.red, growingTime); } } diff --git a/Source/Assets/TouchScript/Examples/Taps/Taps.unity b/Source/Assets/TouchScript/Examples/Taps/Taps.unity index 90e8597f2..14ab6aaa6 100644 --- a/Source/Assets/TouchScript/Examples/Taps/Taps.unity +++ b/Source/Assets/TouchScript/Examples/Taps/Taps.unity @@ -1,19 +1,19 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: --- !u!29 &1 -SceneSettings: +OcclusionCullingSettings: m_ObjectHideFlags: 0 - m_PVSData: - m_PVSObjectsArray: [] - m_PVSPortalsArray: [] + serializedVersion: 2 m_OcclusionBakeSettings: smallestOccluder: 5 smallestHole: 0.25 backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 - serializedVersion: 6 + serializedVersion: 8 m_Fog: 0 m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 @@ -25,6 +25,7 @@ RenderSettings: m_AmbientGroundColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} m_AmbientIntensity: 1 m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} m_SkyboxMaterial: {fileID: 2100000, guid: a07fadb24ea940240afba3afc1a692cc, type: 2} m_HaloStrength: 0.5 m_FlareStrength: 1 @@ -37,12 +38,12 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} --- !u!157 &4 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 6 + serializedVersion: 9 m_GIWorkflowMode: 1 - m_LightmapsMode: 1 m_GISettings: serializedVersion: 2 m_BounceScale: 1 @@ -53,51 +54,73 @@ LightmapSettings: m_EnableBakedLightmaps: 1 m_EnableRealtimeLightmaps: 0 m_LightmapEditorSettings: - serializedVersion: 3 + serializedVersion: 8 m_Resolution: 1 m_BakeResolution: 50 m_TextureWidth: 1024 m_TextureHeight: 1024 + m_AO: 0 m_AOMaxDistance: 1 - m_Padding: 2 m_CompAOExponent: 0 + m_CompAOExponentDirect: 0 + m_Padding: 2 m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 m_TextureCompression: 0 m_FinalGather: 0 + m_FinalGatherFiltering: 1 m_FinalGatherRayCount: 1024 m_ReflectionCompression: 2 + m_MixedBakeMode: 1 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVRFiltering: 0 + m_PVRFilteringMode: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousColorSigma: 1 + m_PVRFilteringAtrousNormalSigma: 1 + m_PVRFilteringAtrousPositionSigma: 1 m_LightingDataAsset: {fileID: 0} - m_RuntimeCPUUsage: 25 + m_ShadowMaskMode: 2 --- !u!196 &5 NavMeshSettings: serializedVersion: 2 m_ObjectHideFlags: 0 m_BuildSettings: serializedVersion: 2 + agentTypeID: 0 agentRadius: 0.5 agentHeight: 2 agentSlope: 45 agentClimb: 0.4 ledgeDropHeight: 0 maxJumpAcrossDistance: 0 - accuratePlacement: 0 minRegionArea: 2 - cellSize: 0.16666666 manualCellSize: 0 + cellSize: 0.16666666 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 m_NavMeshData: {fileID: 0} --- !u!1 &62216951 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 62216952} - - 20: {fileID: 62216957} - - 92: {fileID: 62216956} - - 124: {fileID: 62216955} - - 81: {fileID: 62216954} - - 114: {fileID: 62216953} + - component: {fileID: 62216952} + - component: {fileID: 62216957} + - component: {fileID: 62216956} + - component: {fileID: 62216955} + - component: {fileID: 62216954} + - component: {fileID: 62216953} m_Layer: 0 m_Name: Scene Camera m_TagString: MainCamera @@ -114,10 +137,10 @@ Transform: m_LocalRotation: {x: 0.26945794, y: 0, z: 0, w: 0.96301216} m_LocalPosition: {x: -1.11, y: 10.1, z: -17.45} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 31.264, y: 0, z: 0} m_Children: [] m_Father: {fileID: 930800601} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 31.264, y: 0, z: 0} --- !u!114 &62216953 MonoBehaviour: m_ObjectHideFlags: 0 @@ -191,6 +214,8 @@ Camera: m_TargetDisplay: 0 m_TargetEye: 3 m_HDR: 0 + m_AllowMSAA: 1 + m_ForceIntoRT: 0 m_OcclusionCulling: 1 m_StereoConvergence: 10 m_StereoSeparation: 0.022 @@ -204,11 +229,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 242343086} - - 222: {fileID: 242343088} - - 114: {fileID: 242343087} + - component: {fileID: 242343086} + - component: {fileID: 242343088} + - component: {fileID: 242343087} m_Layer: 5 m_Name: Image m_TagString: Untagged @@ -225,10 +250,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1962593004} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} @@ -272,10 +297,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 250857271} - - 114: {fileID: 250857270} + - component: {fileID: 250857271} + - component: {fileID: 250857270} m_Layer: 5 m_Name: List m_TagString: Untagged @@ -303,6 +328,8 @@ MonoBehaviour: m_Spacing: 0 m_ChildForceExpandWidth: 1 m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 --- !u!224 &250857271 RectTransform: m_ObjectHideFlags: 0 @@ -312,13 +339,13 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 922779737} - {fileID: 1679844150} - {fileID: 1962593004} m_Father: {fileID: 1981142013} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} @@ -387,9 +414,9 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 312263520} + - component: {fileID: 312263520} m_Layer: 0 m_Name: Container m_TagString: Untagged @@ -406,7 +433,6 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 497908867} - {fileID: 769487672} @@ -416,6 +442,7 @@ Transform: - {fileID: 1411274273} m_Father: {fileID: 930800601} m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!4 &497908867 stripped Transform: m_PrefabParentObject: {fileID: 496116, guid: 3c294c033fb7140d09b0bd33830617bb, type: 2} @@ -600,17 +627,19 @@ MeshCollider: m_Enabled: 1 serializedVersion: 2 m_Convex: 1 + m_InflateMesh: 0 + m_SkinWidth: 0.01 m_Mesh: {fileID: 4300006, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} --- !u!1 &740851131 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 740851132} - - 223: {fileID: 740851135} - - 114: {fileID: 740851134} + - component: {fileID: 740851132} + - component: {fileID: 740851135} + - component: {fileID: 740851134} m_Layer: 5 m_Name: Canvas m_TagString: Untagged @@ -627,12 +656,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0, y: 0, z: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1981142013} - {fileID: 1552723601} m_Father: {fileID: 0} m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -666,7 +695,7 @@ Canvas: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 740851131} m_Enabled: 1 - serializedVersion: 2 + serializedVersion: 3 m_RenderMode: 0 m_Camera: {fileID: 0} m_PlaneDistance: 100 @@ -675,6 +704,7 @@ Canvas: m_OverrideSorting: 0 m_OverridePixelPerfect: 0 m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 m_SortingLayerID: 0 m_SortingOrder: 0 m_TargetDisplay: 0 @@ -791,10 +821,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 922779737} - - 114: {fileID: 922779736} + - component: {fileID: 922779737} + - component: {fileID: 922779736} m_Layer: 5 m_Name: Double tap m_TagString: Untagged @@ -829,12 +859,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1149683276} - {fileID: 1166494019} m_Father: {fileID: 250857271} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -845,9 +875,9 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 930800601} + - component: {fileID: 930800601} m_Layer: 0 m_Name: Scene m_TagString: Untagged @@ -864,7 +894,6 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 2135305920} - {fileID: 62216952} @@ -872,16 +901,17 @@ Transform: - {fileID: 312263520} m_Father: {fileID: 0} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1138005899 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1138005900} - - 222: {fileID: 1138005902} - - 114: {fileID: 1138005901} + - component: {fileID: 1138005900} + - component: {fileID: 1138005902} + - component: {fileID: 1138005901} m_Layer: 5 m_Name: Image m_TagString: Untagged @@ -898,10 +928,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1679844150} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} @@ -945,11 +975,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1149683276} - - 222: {fileID: 1149683278} - - 114: {fileID: 1149683277} + - component: {fileID: 1149683276} + - component: {fileID: 1149683278} + - component: {fileID: 1149683277} m_Layer: 5 m_Name: Image m_TagString: Untagged @@ -966,10 +996,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 922779737} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} @@ -1013,12 +1043,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1166494019} - - 222: {fileID: 1166494022} - - 114: {fileID: 1166494021} - - 114: {fileID: 1166494020} + - component: {fileID: 1166494019} + - component: {fileID: 1166494022} + - component: {fileID: 1166494021} + - component: {fileID: 1166494020} m_Layer: 5 m_Name: Text m_TagString: Untagged @@ -1035,10 +1065,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 922779737} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} @@ -1172,18 +1202,20 @@ MeshCollider: m_Enabled: 1 serializedVersion: 2 m_Convex: 1 + m_InflateMesh: 0 + m_SkinWidth: 0.01 m_Mesh: {fileID: 4300004, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} --- !u!1 &1399100003 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1399100004} - - 222: {fileID: 1399100006} - - 114: {fileID: 1399100005} - - 114: {fileID: 1399100007} + - component: {fileID: 1399100004} + - component: {fileID: 1399100006} + - component: {fileID: 1399100005} + - component: {fileID: 1399100007} m_Layer: 5 m_Name: Text m_TagString: Untagged @@ -1200,10 +1232,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1962593004} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} @@ -1267,12 +1299,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1408280581} - - 222: {fileID: 1408280583} - - 114: {fileID: 1408280582} - - 114: {fileID: 1408280584} + - component: {fileID: 1408280581} + - component: {fileID: 1408280583} + - component: {fileID: 1408280582} + - component: {fileID: 1408280584} m_Layer: 5 m_Name: Text m_TagString: Untagged @@ -1289,10 +1321,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1679844150} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} @@ -1402,12 +1434,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1552723601} - - 222: {fileID: 1552723603} - - 114: {fileID: 1552723602} - - 114: {fileID: 1552723604} + - component: {fileID: 1552723601} + - component: {fileID: 1552723603} + - component: {fileID: 1552723602} + - component: {fileID: 1552723604} m_Layer: 5 m_Name: Description m_TagString: Untagged @@ -1424,10 +1456,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 740851132} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 178, y: 78} @@ -1550,10 +1582,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1679844150} - - 114: {fileID: 1679844151} + - component: {fileID: 1679844150} + - component: {fileID: 1679844151} m_Layer: 5 m_Name: Tap m_TagString: Untagged @@ -1570,12 +1602,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1138005900} - {fileID: 1408280581} m_Father: {fileID: 250857271} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -1608,10 +1640,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 1764701050} - - 114: {fileID: 1764701049} + - component: {fileID: 1764701050} + - component: {fileID: 1764701049} m_Layer: 0 m_Name: EventSystem m_TagString: Untagged @@ -1642,10 +1674,10 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 0} m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &1772227325 Prefab: m_ObjectHideFlags: 0 @@ -1737,10 +1769,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1962593004} - - 114: {fileID: 1962593005} + - component: {fileID: 1962593004} + - component: {fileID: 1962593005} m_Layer: 5 m_Name: Hold m_TagString: Untagged @@ -1757,12 +1789,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 242343086} - {fileID: 1399100004} m_Father: {fileID: 250857271} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -1791,9 +1823,9 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1981142013} + - component: {fileID: 1981142013} m_Layer: 5 m_Name: Panel m_TagString: Untagged @@ -1810,11 +1842,11 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 250857271} m_Father: {fileID: 740851132} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0.25263783, y: 1} m_AnchoredPosition: {x: 5, y: 50} @@ -1825,10 +1857,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 2135305920} - - 108: {fileID: 2135305921} + - component: {fileID: 2135305920} + - component: {fileID: 2135305921} m_Layer: 0 m_Name: Directional light m_TagString: Untagged @@ -1845,10 +1877,10 @@ Transform: m_LocalRotation: {x: 0.24194291, y: -0.49854365, z: 0.22107579, w: 0.80252314} m_LocalPosition: {x: 6.1004148, y: 15.540384, z: -20.566225} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 37.5, y: -60.899998, z: 8.2324} m_Children: [] m_Father: {fileID: 930800601} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 37.5, y: -60.899998, z: 8.2324} --- !u!108 &2135305921 Light: m_ObjectHideFlags: 0 @@ -1856,7 +1888,7 @@ Light: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 2135305919} m_Enabled: 1 - serializedVersion: 6 + serializedVersion: 8 m_Type: 1 m_Color: {r: 1, g: 1, b: 1, a: 1} m_Intensity: 1.3 @@ -1866,6 +1898,7 @@ Light: m_Shadows: m_Type: 2 m_Resolution: 3 + m_CustomResolution: -1 m_Strength: 0.56 m_Bias: 0.1 m_NormalBias: 0.4 @@ -1878,7 +1911,9 @@ Light: serializedVersion: 2 m_Bits: 4294967295 m_Lightmapping: 1 + m_AreaSize: {x: 1, y: 1} m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 m_ShadowRadius: 0 m_ShadowAngle: 0 - m_AreaSize: {x: 1, y: 1} diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs index a3da933bc..e42753177 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs @@ -220,7 +220,7 @@ private void update() if (!enableSmoothing) return; - var fraction = 1 - Mathf.Pow(smoothingFactor, Time.deltaTime); + var fraction = 1 - Mathf.Pow(smoothingFactor, Time.unscaledDeltaTime); var scale = transform.localScale; if (allowChangingFromOutside) From d50c11fef77e92b976dd580fc278b0b684fdcbe4 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Fri, 21 Jul 2017 08:55:41 +0300 Subject: [PATCH 21/58] Optimized Gesture dispatch in hierarchy. --- .../Scripts/GestureManagerInstance.cs | 473 ++++++++++-------- .../TouchScript/Scripts/Utils/ObjectPool.cs | 12 +- 2 files changed, 282 insertions(+), 203 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs b/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs index 014153a9a..d7062f356 100644 --- a/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs @@ -52,29 +52,34 @@ public static IGestureManager Instance // Upcoming changes private List gesturesToReset = new List(20); - - private Action> _updatePressed, _updateUpdated, _updateReleased, _updateCancelled; - private Action _processTarget, _processTargetBegan; + private Dictionary> pointerToGestures = new Dictionary>(); #endregion - #region Temporary variables + #region Temporary collections - // Temporary variables for update methods. + // Temporary collections for update methods. // Dictionary> - pointers sorted by targets - private Dictionary> targetPointers = new Dictionary>(10); + private Dictionary> pointersOnTarget = new Dictionary>(10); // Dictionary> - pointers sorted by gesture - private Dictionary> gesturePointers = new Dictionary>(10); - private List activeGestures = new List(20); + private Dictionary> pointersToDispatchForGesture = new Dictionary>(10); + private List activeGesturesThisUpdate = new List(20); + + private Dictionary> hierarchyEndingWithCache = new Dictionary>(); + private Dictionary> hierarchyBeginningWithCache = new Dictionary>(); + + #endregion + + #region Pools private static ObjectPool> gestureListPool = new ObjectPool>(10, - () => new List(20), null, (l) => l.Clear()); + () => new List(10), null, (l) => l.Clear(), "GestureManager/Gesture"); private static ObjectPool> pointerListPool = new ObjectPool>(20, - () => new List(10), null, (l) => l.Clear()); + () => new List(10), null, (l) => l.Clear(), "GestureManager/Pointer"); private static ObjectPool> transformListPool = new ObjectPool>(10, - () => new List(10), null, (l) => l.Clear()); + () => new List(10), null, (l) => l.Clear(), "GestureManager/Transform"); #endregion @@ -95,16 +100,9 @@ private void Awake() gameObject.hideFlags = HideFlags.HideInHierarchy; DontDestroyOnLoad(gameObject); - _processTarget = processTarget; - _processTargetBegan = processTargetBegan; - _updatePressed = doUpdatePressed; - _updateUpdated = doUpdateUpdated; - _updateReleased = doUpdateReleased; - _updateCancelled = doUpdateCancelled; - - gestureListPool.WarmUp(5); - pointerListPool.WarmUp(10); - transformListPool.WarmUp(5); + gestureListPool.WarmUp(20); + pointerListPool.WarmUp(20); + transformListPool.WarmUp(1); } private void OnEnable() @@ -114,7 +112,7 @@ private void OnEnable() { touchManager.FrameStarted += frameStartedHandler; touchManager.FrameFinished += frameFinishedHandler; - touchManager.PointersUpdated += PointersUpdatedHandler; + touchManager.PointersUpdated += pointersUpdatedHandler; touchManager.PointersPressed += pointersPressedHandler; touchManager.PointersReleased += pointersReleasedHandler; touchManager.PointersCancelled += pointersCancelledHandler; @@ -128,7 +126,7 @@ private void OnDisable() { touchManager.FrameStarted -= frameStartedHandler; touchManager.FrameFinished -= frameFinishedHandler; - touchManager.PointersUpdated -= PointersUpdatedHandler; + touchManager.PointersUpdated -= pointersUpdatedHandler; touchManager.PointersPressed -= pointersPressedHandler; touchManager.PointersReleased -= pointersReleasedHandler; touchManager.PointersCancelled -= pointersCancelledHandler; @@ -215,187 +213,258 @@ internal Gesture.GestureState INTERNAL_GestureChangeState(Gesture gesture, Gestu #region Private functions - private void doUpdatePressed(Gesture gesture, IList pointers) - { - gesture.INTERNAL_PointersPressed(pointers); - } - - private void doUpdateUpdated(Gesture gesture, IList pointers) - { - gesture.INTERNAL_PointersUpdated(pointers); - } - - private void doUpdateReleased(Gesture gesture, IList pointers) - { - gesture.INTERNAL_PointersReleased(pointers); - } - - private void doUpdateCancelled(Gesture gesture, IList pointers) - { - gesture.INTERNAL_PointersCancelled(pointers); - } - - private void update(IList pointers, Action process, - Action> dispatch) + private void updatePressed(IList pointers) { - // WARNING! Arcane magic ahead! - // gestures which got any pointers - // needed because there's no order in dictionary - activeGestures.Clear(); - var targets = transformListPool.Get(); + var activeTargets = transformListPool.Get(); + var gesturesInHierarchy = gestureListPool.Get(); + var startedGestures = gestureListPool.Get(); - // arrange pointers by target + // Arrange pointers by target. var count = pointers.Count; for (var i = 0; i < count; i++) { var pointer = pointers[i]; var target = pointer.GetPressData().Target; - if (target != null) + if (target == null) continue; + + List list; + if (!pointersOnTarget.TryGetValue(target, out list)) { - List list; - if (!targetPointers.TryGetValue(target, out list)) - { - list = pointerListPool.Get(); - targetPointers.Add(target, list); - targets.Add(target); - } - list.Add(pointer); + list = pointerListPool.Get(); + pointersOnTarget.Add(target, list); + activeTargets.Add(target); } + list.Add(pointer); } - // process all targets - get and sort all gestures on targets in hierarchy - count = targets.Count; + // Process all targets - get and sort all gestures on targets in hierarchy. + count = activeTargets.Count; for (var i = 0; i < count; i++) { - var target = targets[i]; - process(target); - pointerListPool.Release(targetPointers[target]); - } - transformListPool.Release(targets); + var target = activeTargets[i]; - // dispatch gesture events with pointers assigned to them - count = activeGestures.Count; - for (var i = 0; i < count; i++) - { - var gesture = activeGestures[i]; - var list = gesturePointers[gesture]; - if (gestureIsActive(gesture)) dispatch(gesture, list); - pointerListPool.Release(list); - } + // Pointers that hit . + var targetPointers = pointersOnTarget[target]; + var targetPointersCount = targetPointers.Count; - targetPointers.Clear(); - gesturePointers.Clear(); - } - - private void processTarget(Transform target) - { - var targetList = targetPointers[target]; - var pointerCount = targetList.Count; - - // gestures on objects in the hierarchy from "root" to target - var list = gestureListPool.Get(); - getHierarchyEndingWith(target, list); + // Gestures on objects in the hierarchy from "root" to target. + var gesturesOnParentsAndMe = getHierarchyEndingWith(target); - var count = list.Count; - for (var i = 0; i < count; i++) - { - var gesture = list[i]; - if (!gestureIsActive(gesture)) continue; + // Gestures in the target's hierarchy which might affect gestures on the target. + // Gestures on all parents and all children. + gesturesInHierarchy.AddRange(gesturesOnParentsAndMe); + gesturesInHierarchy.AddRange(getHierarchyBeginningWith(target)); + var gesturesInHierarchyCount = gesturesInHierarchy.Count; - var pointerList = pointerListPool.Get(); - for (var j = 0; j < pointerCount; j++) + for (var j = 0; j < gesturesInHierarchyCount; j++) { - var pointer = targetList[j]; - if (gesture.HasPointer(pointer)) pointerList.Add(pointer); + var gesture = gesturesInHierarchy[j]; + if (gesture.State == Gesture.GestureState.Began || gesture.State == Gesture.GestureState.Changed) startedGestures.Add(gesture); } - if (pointerList.Count > 0) + var startedCount = startedGestures.Count; + var possibleGestureCount = gesturesOnParentsAndMe.Count; + for (var j = 0; j < possibleGestureCount; j++) { - if (gesturePointers.ContainsKey(gesture)) + // WARNING! Gesture state might change during this loop. + // For example when one of them recognizes. + + var possibleGesture = gesturesOnParentsAndMe[j]; + + // If the gesture is not active it can't start or recognize. + if (!gestureIsActive(possibleGesture)) continue; + + var canReceivePointers = true; + + // For every possible gesture in gesturesInHierarchy we need to check if it prevents gestureOnParentOrMe from getting pointers. + for (var k = 0; k < startedCount; k++) + { + var startedGesture = startedGestures[k]; + + if (possibleGesture == startedGesture) continue; + + // This gesture has started. Is gestureOnParentOrMe allowed to work in parallel? + if (canPreventGesture(startedGesture, possibleGesture)) + { + // activeGesture has already began and prevents gestureOnParentOrMe from getting pointers. + canReceivePointers = false; + break; + } + } + + if (!canReceivePointers) continue; + + // Filter incoming pointers for gesture. + var pointersSentToGesture = pointerListPool.Get(); + for (var k = 0; k < targetPointersCount; k++) { - gesturePointers[gesture].AddRange(pointerList); - pointerListPool.Release(pointerList); + var pointer = targetPointers[k]; + if (shouldReceivePointer(possibleGesture, pointer)) pointersSentToGesture.Add(pointer); + } + + // If there are any pointers to send. + if (pointersSentToGesture.Count > 0) + { + if (pointersToDispatchForGesture.ContainsKey(possibleGesture)) + { + pointersToDispatchForGesture[possibleGesture].AddRange(pointersSentToGesture); + pointerListPool.Release(pointersSentToGesture); + } + else + { + // Add gesture to the list of active gestures this update. + activeGesturesThisUpdate.Add(possibleGesture); + pointersToDispatchForGesture.Add(possibleGesture, pointersSentToGesture); + } } else { - activeGestures.Add(gesture); - gesturePointers.Add(gesture, pointerList); + pointerListPool.Release(pointersSentToGesture); } } - else + + gesturesInHierarchy.Clear(); + startedGestures.Clear(); + pointerListPool.Release(targetPointers); + } + + gestureListPool.Release(gesturesInHierarchy); + gestureListPool.Release(startedGestures); + transformListPool.Release(activeTargets); + + // Dispatch gesture events with pointers assigned to them. + count = activeGesturesThisUpdate.Count; + for (var i = 0; i < count; i++) + { + var gesture = activeGesturesThisUpdate[i]; + var list = pointersToDispatchForGesture[gesture]; + if (!gestureIsActive(gesture)) { - pointerListPool.Release(pointerList); + pointerListPool.Release(list); + continue; } + + var numPointers = list.Count; + for (var j = 0; j < numPointers; j++) + { + var pointer = list[j]; + List gestureList; + if (!pointerToGestures.TryGetValue(pointer.Id, out gestureList)) + { + gestureList = gestureListPool.Get(); + pointerToGestures.Add(pointer.Id, gestureList); + } + gestureList.Add(gesture); + } + + gesture.INTERNAL_PointersPressed(list); + pointerListPool.Release(list); } - gestureListPool.Release(list); + + pointersOnTarget.Clear(); + activeGesturesThisUpdate.Clear(); + pointersToDispatchForGesture.Clear(); } - private void processTargetBegan(Transform target) + private void updateUpdated(IList pointers) { - var targetList = targetPointers[target]; - var pointerCount = targetList.Count; - - var containingList = gestureListPool.Get(); - var endingList = gestureListPool.Get(); - // gestures in the target's hierarchy which might affect gesture on the target - getHierarchyContaining(target, containingList); - // gestures on objects in the hierarchy from "root" to target - getHierarchyEndingWith(target, endingList); - var count = endingList.Count; + sortPointersForActiveGestures(pointers); + + var count = activeGesturesThisUpdate.Count; for (var i = 0; i < count; i++) { - var gesture = endingList[i]; - // WARNING! Gestures might change during this loop. - // For example when one of them recognizes. - if (!gestureIsActive(gesture)) continue; - - var canReceivePointers = true; - var activeCount = containingList.Count; - for (var j = 0; j < activeCount; j++) + var gesture = activeGesturesThisUpdate[i]; + var list = pointersToDispatchForGesture[gesture]; + if (gestureIsActive(gesture)) { - var activeGesture = containingList[j]; + gesture.INTERNAL_PointersUpdated(list); + } + pointerListPool.Release(list); + } - if (gesture == activeGesture) continue; - if ((activeGesture.State == Gesture.GestureState.Began || - activeGesture.State == Gesture.GestureState.Changed) && - (canPreventGesture(activeGesture, gesture))) - { - // there's a started gesture which prevents this one - canReceivePointers = false; - break; - } + activeGesturesThisUpdate.Clear(); + pointersToDispatchForGesture.Clear(); + } + + private void updateReleased(IList pointers) + { + sortPointersForActiveGestures(pointers); + + var count = activeGesturesThisUpdate.Count; + for (var i = 0; i < count; i++) + { + var gesture = activeGesturesThisUpdate[i]; + var list = pointersToDispatchForGesture[gesture]; + if (gestureIsActive(gesture)) + { + gesture.INTERNAL_PointersReleased(list); } + pointerListPool.Release(list); + } - // check gesture's ShouldReceivePointer callback - if (!canReceivePointers) continue; + removePointers(pointers); + activeGesturesThisUpdate.Clear(); + pointersToDispatchForGesture.Clear(); + } - var pointerList = pointerListPool.Get(); - for (var j = 0; j < pointerCount; j++) + private void updateCancelled(IList pointers) + { + sortPointersForActiveGestures(pointers); + + var count = activeGesturesThisUpdate.Count; + for (var i = 0; i < count; i++) + { + var gesture = activeGesturesThisUpdate[i]; + var list = pointersToDispatchForGesture[gesture]; + if (gestureIsActive(gesture)) { - var pointer = targetList[j]; - if (shouldReceivePointer(gesture, pointer)) pointerList.Add(pointer); + gesture.INTERNAL_PointersCancelled(list); } - if (pointerList.Count > 0) + pointerListPool.Release(list); + } + + removePointers(pointers); + activeGesturesThisUpdate.Clear(); + pointersToDispatchForGesture.Clear(); + } + + private void sortPointersForActiveGestures(IList pointers) + { + var count = pointers.Count; + for (var i = 0; i < count; i++) + { + var pointer = pointers[i]; + List gestures; + if (!pointerToGestures.TryGetValue(pointer.Id, out gestures)) continue; + + var gestureCount = gestures.Count; + for (var j = 0; j < gestureCount; j++) { - if (gesturePointers.ContainsKey(gesture)) + var gesture = gestures[j]; + List toDispatch; + if (!pointersToDispatchForGesture.TryGetValue(gesture, out toDispatch)) { - gesturePointers[gesture].AddRange(pointerList); - pointerListPool.Release(pointerList); + toDispatch = pointerListPool.Get(); + pointersToDispatchForGesture.Add(gesture, toDispatch); + activeGesturesThisUpdate.Add(gesture); } - else - { - activeGestures.Add(gesture); - gesturePointers.Add(gesture, pointerList); - } - } - else - { - pointerListPool.Release(pointerList); + toDispatch.Add(pointer); } } + } - gestureListPool.Release(containingList); - gestureListPool.Release(endingList); + private void removePointers(IList pointers) + { + var count = pointers.Count; + for (var i = 0; i < count; i++) + { + var pointer = pointers[i]; + List list; + if (!pointerToGestures.TryGetValue(pointer.Id, out list)) continue; + + pointerToGestures.Remove(pointer.Id); + gestureListPool.Release(list); + } } private void resetGestures() @@ -406,58 +475,56 @@ private void resetGestures() for (var i = 0; i < count; i++) { var gesture = gesturesToReset[i]; - if (gesture == null) continue; + if (Equals(gesture, null)) continue; // Reference comparison + + var activePointers = gesture.ActivePointers; + var activeCount = activePointers.Count; + for (var j = 0; j < activeCount; j++) + { + var pointer = activePointers[j]; + List list; + if (pointerToGestures.TryGetValue(pointer.Id, out list)) list.Remove(gesture); + } + + if (gesture == null) continue; // Unity "null" comparison gesture.INTERNAL_Reset(); gesture.INTERNAL_SetState(Gesture.GestureState.Idle); } gesturesToReset.Clear(); } - // parent <- parent <- target - private void getHierarchyEndingWith(Transform target, List outputList) + private void clearFrameCaches() { - while (target != null) - { - getEnabledGesturesOnTarget(target, outputList); - target = target.parent; - } + foreach (var list in hierarchyEndingWithCache.Values) gestureListPool.Release(list); + foreach (var list in hierarchyBeginningWithCache.Values) gestureListPool.Release(list); + hierarchyEndingWithCache.Clear(); + hierarchyBeginningWithCache.Clear(); } - // target <- child* - private void getHierarchyBeginningWith(Transform target, List outputList, bool includeSelf) + // parent <- parent <- target + private List getHierarchyEndingWith(Transform target) { - if (includeSelf) - { - getEnabledGesturesOnTarget(target, outputList); - } + List list; + if (hierarchyEndingWithCache.TryGetValue(target, out list)) return list; - var count = target.childCount; - for (var i = 0; i < count; i++) - { - getHierarchyBeginningWith(target.GetChild(i), outputList, true); - } - } + list = gestureListPool.Get(); + target.GetComponentsInParent(false, list); + hierarchyEndingWithCache.Add(target, list); - private void getHierarchyContaining(Transform target, List outputList) - { - getHierarchyEndingWith(target, outputList); - getHierarchyBeginningWith(target, outputList, false); + return list; } - private void getEnabledGesturesOnTarget(Transform target, List outputList) + // target <- child* + private List getHierarchyBeginningWith(Transform target) { - if (target.gameObject.activeInHierarchy) - { - var list = gestureListPool.Get(); - target.GetComponents(list); - var count = list.Count; - for (var i = 0; i < count; i++) - { - var gesture = list[i]; - if (gesture != null && gesture.enabled) outputList.Add(gesture); - } - gestureListPool.Release(list); - } + List list; + if (hierarchyBeginningWithCache.TryGetValue(target, out list)) return list; + + list = gestureListPool.Get(); + target.GetComponentsInChildren(list); + hierarchyBeginningWithCache.Add(target, list); + + return list; } private bool gestureIsActive(Gesture gesture) @@ -480,9 +547,12 @@ private bool recognizeGestureIfNotPrevented(Gesture gesture) if (!shouldBegin(gesture)) return false; var gesturesToFail = gestureListPool.Get(); - var gesturesInHierarchy = gestureListPool.Get(); bool canRecognize = true; - getHierarchyContaining(gesture.transform, gesturesInHierarchy); + var target = gesture.transform; + + var gesturesInHierarchy = gestureListPool.Get(); + gesturesInHierarchy.AddRange(getHierarchyEndingWith(target)); + gesturesInHierarchy.AddRange(getHierarchyBeginningWith(target)); var count = gesturesInHierarchy.Count; for (var i = 0; i < count; i++) @@ -500,7 +570,7 @@ private bool recognizeGestureIfNotPrevented(Gesture gesture) break; } } - else + else if (otherGesture.State == Gesture.GestureState.Possible) { if (canPreventGesture(gesture, otherGesture)) { @@ -557,6 +627,7 @@ private bool canPreventGesture(Gesture first, Gesture second) private void frameFinishedHandler(object sender, EventArgs eventArgs) { resetGestures(); + clearFrameCaches(); } private void frameStartedHandler(object sender, EventArgs eventArgs) @@ -566,22 +637,22 @@ private void frameStartedHandler(object sender, EventArgs eventArgs) private void pointersPressedHandler(object sender, PointerEventArgs pointerEventArgs) { - update(pointerEventArgs.Pointers, _processTargetBegan, _updatePressed); + updatePressed(pointerEventArgs.Pointers); } - private void PointersUpdatedHandler(object sender, PointerEventArgs pointerEventArgs) + private void pointersUpdatedHandler(object sender, PointerEventArgs pointerEventArgs) { - update(pointerEventArgs.Pointers, _processTarget, _updateUpdated); + updateUpdated(pointerEventArgs.Pointers); } private void pointersReleasedHandler(object sender, PointerEventArgs pointerEventArgs) { - update(pointerEventArgs.Pointers, _processTarget, _updateReleased); + updateReleased(pointerEventArgs.Pointers); } private void pointersCancelledHandler(object sender, PointerEventArgs pointerEventArgs) { - update(pointerEventArgs.Pointers, _processTarget, _updateCancelled); + updateCancelled(pointerEventArgs.Pointers); } #endregion diff --git a/Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs b/Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs index 7acc913c6..1217ba6eb 100644 --- a/Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs +++ b/Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs @@ -36,14 +36,15 @@ public int CountInactive get { return stack.Count; } } - public ObjectPool(int capacity, UnityFunc actionNew, UnityAction actionOnGet, - UnityAction actionOnRelease) + public ObjectPool(int capacity, UnityFunc actionNew, UnityAction actionOnGet = null, + UnityAction actionOnRelease = null, string name = null) { if (actionNew == null) throw new ArgumentException("New action can't be null!"); stack = new Stack(capacity); onNew = actionNew; onGet = actionOnGet; onRelease = actionOnRelease; + Name = name; } public void WarmUp(int count) @@ -66,6 +67,7 @@ public T Get() { #if OBJECTPOOL_DEBUG created = true; + logWarning("Created an object."); #endif element = onNew(); CountAll++; @@ -108,6 +110,12 @@ private void log(string message) UnityEngine.Debug.LogFormat("[{0}] ObjectPool ({1}): {2}", DateTime.Now.ToString("hh:mm:ss.fff"), Name, message); } + private void logWarning(string message) + { + if (string.IsNullOrEmpty(Name)) return; + UnityEngine.Debug.LogWarningFormat("[{0}] ObjectPool ({1}): {2}", DateTime.Now.ToString("hh:mm:ss.fff"), Name, message); + } + private void logError(string message) { if (string.IsNullOrEmpty(Name)) return; From 70637a80e2d72184ac5586cbb2888fc0e113e569 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Fri, 21 Jul 2017 22:28:01 +0300 Subject: [PATCH 22/58] Optimized UI handling and cursors. --- .../TouchScript/Examples/Camera/Camera.unity | 299 ++++++++++-------- .../TouchScript/Examples/Photos/Photos.unity | 54 ++-- .../Examples/RawInput/RawInput.unity | 106 +++++-- .../Prefabs/Cursors/Mouse Cursor.prefab | 161 +++++----- .../Prefabs/Cursors/Pen Cursor.prefab | 161 +++++----- .../Prefabs/Cursors/Pointer.prefab | 76 +++-- .../Prefabs/Cursors/Touch Cursor.prefab | 87 ++--- .../Scripts/Behaviors/Cursors/MouseCursor.cs | 13 +- .../Scripts/Behaviors/Cursors/PenCursor.cs | 13 +- .../Behaviors/Cursors/PointerCursor.cs | 7 - .../Behaviors/Cursors/UI/TextureSwitch.cs | 31 ++ .../Cursors/UI/TextureSwitch.cs.meta | 12 + .../Scripts/Layers/StandardLayer.cs | 4 +- .../Layers/UI/TouchScriptInputModule.cs | 25 +- 14 files changed, 623 insertions(+), 426 deletions(-) create mode 100644 Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI/TextureSwitch.cs create mode 100644 Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI/TextureSwitch.cs.meta diff --git a/Source/Assets/TouchScript/Examples/Camera/Camera.unity b/Source/Assets/TouchScript/Examples/Camera/Camera.unity index bb3a51a2f..81d0a8e85 100644 --- a/Source/Assets/TouchScript/Examples/Camera/Camera.unity +++ b/Source/Assets/TouchScript/Examples/Camera/Camera.unity @@ -1,19 +1,19 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: --- !u!29 &1 -SceneSettings: +OcclusionCullingSettings: m_ObjectHideFlags: 0 - m_PVSData: - m_PVSObjectsArray: [] - m_PVSPortalsArray: [] + serializedVersion: 2 m_OcclusionBakeSettings: smallestOccluder: 5 smallestHole: 0.25 backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 - serializedVersion: 6 + serializedVersion: 8 m_Fog: 0 m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 @@ -25,6 +25,7 @@ RenderSettings: m_AmbientGroundColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} m_AmbientIntensity: 1 m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} m_SkyboxMaterial: {fileID: 2100000, guid: a07fadb24ea940240afba3afc1a692cc, type: 2} m_HaloStrength: 0.5 m_FlareStrength: 1 @@ -37,12 +38,12 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} --- !u!157 &4 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 6 + serializedVersion: 9 m_GIWorkflowMode: 1 - m_LightmapsMode: 1 m_GISettings: serializedVersion: 2 m_BounceScale: 1 @@ -53,50 +54,72 @@ LightmapSettings: m_EnableBakedLightmaps: 1 m_EnableRealtimeLightmaps: 0 m_LightmapEditorSettings: - serializedVersion: 3 + serializedVersion: 8 m_Resolution: 1 m_BakeResolution: 50 m_TextureWidth: 1024 m_TextureHeight: 1024 + m_AO: 0 m_AOMaxDistance: 1 - m_Padding: 2 m_CompAOExponent: 0 + m_CompAOExponentDirect: 0 + m_Padding: 2 m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 m_TextureCompression: 0 m_FinalGather: 0 + m_FinalGatherFiltering: 1 m_FinalGatherRayCount: 1024 m_ReflectionCompression: 2 + m_MixedBakeMode: 1 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVRFiltering: 0 + m_PVRFilteringMode: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousColorSigma: 1 + m_PVRFilteringAtrousNormalSigma: 1 + m_PVRFilteringAtrousPositionSigma: 1 m_LightingDataAsset: {fileID: 0} - m_RuntimeCPUUsage: 25 + m_ShadowMaskMode: 2 --- !u!196 &5 NavMeshSettings: serializedVersion: 2 m_ObjectHideFlags: 0 m_BuildSettings: serializedVersion: 2 + agentTypeID: 0 agentRadius: 0.5 agentHeight: 2 agentSlope: 45 agentClimb: 0.4 ledgeDropHeight: 0 maxJumpAcrossDistance: 0 - accuratePlacement: 0 minRegionArea: 2 - cellSize: 0.16666666 manualCellSize: 0 + cellSize: 0.16666666 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 m_NavMeshData: {fileID: 0} --- !u!1 &62216951 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 62216952} - - 20: {fileID: 62216957} - - 92: {fileID: 62216956} - - 124: {fileID: 62216955} - - 81: {fileID: 62216954} + - component: {fileID: 62216952} + - component: {fileID: 62216957} + - component: {fileID: 62216956} + - component: {fileID: 62216955} + - component: {fileID: 62216954} m_Layer: 0 m_Name: Camera m_TagString: MainCamera @@ -113,10 +136,10 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: -11.64} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1462230477} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!81 &62216954 AudioListener: m_ObjectHideFlags: 0 @@ -168,6 +191,8 @@ Camera: m_TargetDisplay: 0 m_TargetEye: 3 m_HDR: 0 + m_AllowMSAA: 1 + m_ForceIntoRT: 0 m_OcclusionCulling: 1 m_StereoConvergence: 10 m_StereoSeparation: 0.022 @@ -177,10 +202,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 139543608} - - 114: {fileID: 139543609} + - component: {fileID: 139543608} + - component: {fileID: 139543609} m_Layer: 5 m_Name: Rotate m_TagString: Untagged @@ -197,12 +222,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 746517019} - {fileID: 567050690} m_Father: {fileID: 250857271} m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -231,11 +256,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 242343086} - - 222: {fileID: 242343088} - - 114: {fileID: 242343087} + - component: {fileID: 242343086} + - component: {fileID: 242343088} + - component: {fileID: 242343087} m_Layer: 5 m_Name: Image m_TagString: Untagged @@ -252,10 +277,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1962593004} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} @@ -299,10 +324,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 250857271} - - 114: {fileID: 250857270} + - component: {fileID: 250857271} + - component: {fileID: 250857270} m_Layer: 5 m_Name: List m_TagString: Untagged @@ -330,6 +355,8 @@ MonoBehaviour: m_Spacing: 0 m_ChildForceExpandWidth: 1 m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 --- !u!224 &250857271 RectTransform: m_ObjectHideFlags: 0 @@ -339,7 +366,6 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1679844150} - {fileID: 624081475} @@ -347,6 +373,7 @@ RectTransform: - {fileID: 139543608} m_Father: {fileID: 1981142013} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} @@ -357,12 +384,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 567050690} - - 222: {fileID: 567050692} - - 114: {fileID: 567050691} - - 114: {fileID: 567050693} + - component: {fileID: 567050690} + - component: {fileID: 567050692} + - component: {fileID: 567050691} + - component: {fileID: 567050693} m_Layer: 5 m_Name: Text m_TagString: Untagged @@ -379,10 +406,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 139543608} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} @@ -482,7 +509,7 @@ Prefab: objectReference: {fileID: 0} - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: m_RootOrder - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: layers.Array.data[0] @@ -496,10 +523,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 624081475} - - 114: {fileID: 624081476} + - component: {fileID: 624081475} + - component: {fileID: 624081476} m_Layer: 5 m_Name: Drag m_TagString: Untagged @@ -516,12 +543,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1541924794} - {fileID: 1713463340} m_Father: {fileID: 250857271} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -550,11 +577,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 740851132} - - 223: {fileID: 740851135} - - 114: {fileID: 740851134} + - component: {fileID: 740851132} + - component: {fileID: 740851135} + - component: {fileID: 740851134} m_Layer: 5 m_Name: Canvas m_TagString: Untagged @@ -571,12 +598,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0, y: 0, z: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1981142013} - {fileID: 1552723601} m_Father: {fileID: 0} m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -610,7 +637,7 @@ Canvas: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 740851131} m_Enabled: 1 - serializedVersion: 2 + serializedVersion: 3 m_RenderMode: 0 m_Camera: {fileID: 0} m_PlaneDistance: 100 @@ -619,6 +646,7 @@ Canvas: m_OverrideSorting: 0 m_OverridePixelPerfect: 0 m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 m_SortingLayerID: 0 m_SortingOrder: 0 m_TargetDisplay: 0 @@ -627,11 +655,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 746517019} - - 222: {fileID: 746517021} - - 114: {fileID: 746517020} + - component: {fileID: 746517019} + - component: {fileID: 746517021} + - component: {fileID: 746517020} m_Layer: 5 m_Name: Image m_TagString: Untagged @@ -648,10 +676,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 139543608} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} @@ -695,14 +723,14 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 930800601} - - 54: {fileID: 930800603} - - 114: {fileID: 930800604} - - 114: {fileID: 930800602} - - 114: {fileID: 930800606} - - 114: {fileID: 930800605} + - component: {fileID: 930800601} + - component: {fileID: 930800603} + - component: {fileID: 930800604} + - component: {fileID: 930800602} + - component: {fileID: 930800606} + - component: {fileID: 930800605} m_Layer: 0 m_Name: Scene m_TagString: Untagged @@ -719,13 +747,13 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 2135305920} - {fileID: 1462230477} - {fileID: 2072767614} m_Father: {fileID: 0} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &930800602 MonoBehaviour: m_ObjectHideFlags: 0 @@ -872,11 +900,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1138005900} - - 222: {fileID: 1138005902} - - 114: {fileID: 1138005901} + - component: {fileID: 1138005900} + - component: {fileID: 1138005902} + - component: {fileID: 1138005901} m_Layer: 5 m_Name: Image m_TagString: Untagged @@ -893,10 +921,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1679844150} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} @@ -940,12 +968,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1399100004} - - 222: {fileID: 1399100006} - - 114: {fileID: 1399100005} - - 114: {fileID: 1399100007} + - component: {fileID: 1399100004} + - component: {fileID: 1399100006} + - component: {fileID: 1399100005} + - component: {fileID: 1399100007} m_Layer: 5 m_Name: Text m_TagString: Untagged @@ -962,10 +990,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1962593004} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} @@ -1029,12 +1057,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1408280581} - - 222: {fileID: 1408280583} - - 114: {fileID: 1408280582} - - 114: {fileID: 1408280584} + - component: {fileID: 1408280581} + - component: {fileID: 1408280583} + - component: {fileID: 1408280582} + - component: {fileID: 1408280584} m_Layer: 5 m_Name: Text m_TagString: Untagged @@ -1051,10 +1079,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1679844150} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} @@ -1120,9 +1148,9 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 1462230477} + - component: {fileID: 1462230477} m_Layer: 0 m_Name: Pivot m_TagString: Untagged @@ -1139,21 +1167,21 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 62216952} m_Father: {fileID: 930800601} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1541924793 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1541924794} - - 222: {fileID: 1541924796} - - 114: {fileID: 1541924795} + - component: {fileID: 1541924794} + - component: {fileID: 1541924796} + - component: {fileID: 1541924795} m_Layer: 5 m_Name: Image m_TagString: Untagged @@ -1170,10 +1198,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 624081475} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} @@ -1217,12 +1245,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1552723601} - - 222: {fileID: 1552723603} - - 114: {fileID: 1552723602} - - 114: {fileID: 1552723604} + - component: {fileID: 1552723601} + - component: {fileID: 1552723603} + - component: {fileID: 1552723602} + - component: {fileID: 1552723604} m_Layer: 5 m_Name: Description m_TagString: Untagged @@ -1239,10 +1267,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 740851132} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 156, y: 78} @@ -1313,10 +1341,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1679844150} - - 114: {fileID: 1679844151} + - component: {fileID: 1679844150} + - component: {fileID: 1679844151} m_Layer: 5 m_Name: Drag m_TagString: Untagged @@ -1333,12 +1361,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1138005900} - {fileID: 1408280581} m_Father: {fileID: 250857271} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -1367,12 +1395,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1713463340} - - 222: {fileID: 1713463343} - - 114: {fileID: 1713463342} - - 114: {fileID: 1713463341} + - component: {fileID: 1713463340} + - component: {fileID: 1713463343} + - component: {fileID: 1713463342} + - component: {fileID: 1713463341} m_Layer: 5 m_Name: Text m_TagString: Untagged @@ -1389,10 +1417,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 624081475} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} @@ -1456,10 +1484,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 1764701050} - - 114: {fileID: 1764701049} + - component: {fileID: 1764701050} + - component: {fileID: 1764701049} m_Layer: 0 m_Name: EventSystem m_TagString: Untagged @@ -1490,10 +1518,10 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 0} m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &1867657389 Prefab: m_ObjectHideFlags: 0 @@ -1533,6 +1561,10 @@ Prefab: propertyPath: m_RootOrder value: 0 objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} m_IsPrefabParent: 0 @@ -1541,10 +1573,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1962593004} - - 114: {fileID: 1962593005} + - component: {fileID: 1962593004} + - component: {fileID: 1962593005} m_Layer: 5 m_Name: Zoom m_TagString: Untagged @@ -1561,12 +1593,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 242343086} - {fileID: 1399100004} m_Father: {fileID: 250857271} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -1595,9 +1627,9 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1981142013} + - component: {fileID: 1981142013} m_Layer: 5 m_Name: Panel m_TagString: Untagged @@ -1614,11 +1646,11 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 250857271} m_Father: {fileID: 740851132} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0.25263783, y: 1} m_AnchoredPosition: {x: 5, y: 50} @@ -1629,12 +1661,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 2072767614} - - 33: {fileID: 2072767613} - - 135: {fileID: 2072767612} - - 23: {fileID: 2072767611} + - component: {fileID: 2072767614} + - component: {fileID: 2072767613} + - component: {fileID: 2072767612} + - component: {fileID: 2072767611} m_Layer: 0 m_Name: Earth m_TagString: Untagged @@ -1651,22 +1683,28 @@ MeshRenderer: m_Enabled: 1 m_CastShadows: 1 m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 m_Materials: - {fileID: 2100000, guid: 6e379d1ec9f5fd949891068175de34fe, type: 2} - m_SubsetIndices: + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 m_StaticBatchRoot: {fileID: 0} - m_UseLightProbes: 0 - m_ReflectionProbeUsage: 1 m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} m_ScaleInLightmap: 1 m_PreserveUVs: 0 m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 m_MinimumChartSize: 4 m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} m_SortingLayerID: 0 + m_SortingLayer: 0 m_SortingOrder: 0 --- !u!135 &2072767612 SphereCollider: @@ -1696,19 +1734,19 @@ Transform: m_LocalRotation: {x: -0.07995039, y: 0.9102414, z: -0.20880757, w: 0.34852263} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 4.296496, y: 4.296493, z: 4.296493} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 930800601} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &2135305919 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 2135305920} - - 108: {fileID: 2135305921} + - component: {fileID: 2135305920} + - component: {fileID: 2135305921} m_Layer: 0 m_Name: Directional light m_TagString: Untagged @@ -1725,10 +1763,10 @@ Transform: m_LocalRotation: {x: 0.3292459, y: -0.19317472, z: 0.12877093, w: 0.9152589} m_LocalPosition: {x: 6.1004148, y: 15.540384, z: -20.566225} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 930800601} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!108 &2135305921 Light: m_ObjectHideFlags: 0 @@ -1736,7 +1774,7 @@ Light: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 2135305919} m_Enabled: 1 - serializedVersion: 6 + serializedVersion: 8 m_Type: 1 m_Color: {r: 1, g: 1, b: 1, a: 1} m_Intensity: 1.3 @@ -1746,6 +1784,7 @@ Light: m_Shadows: m_Type: 1 m_Resolution: 3 + m_CustomResolution: -1 m_Strength: 0.185 m_Bias: 0.1 m_NormalBias: 0.4 @@ -1758,7 +1797,9 @@ Light: serializedVersion: 2 m_Bits: 4294967295 m_Lightmapping: 1 + m_AreaSize: {x: 1, y: 1} m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 m_ShadowRadius: 0 m_ShadowAngle: 0 - m_AreaSize: {x: 1, y: 1} diff --git a/Source/Assets/TouchScript/Examples/Photos/Photos.unity b/Source/Assets/TouchScript/Examples/Photos/Photos.unity index 29163e690..85b0bda33 100644 --- a/Source/Assets/TouchScript/Examples/Photos/Photos.unity +++ b/Source/Assets/TouchScript/Examples/Photos/Photos.unity @@ -138,7 +138,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 0, g: 0, b: 0, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -459,7 +459,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -527,7 +527,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 1, g: 0, b: 0, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -595,7 +595,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 0, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -696,7 +696,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 1, g: 1, b: 1, a: 0.392} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -1174,7 +1174,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -1310,7 +1310,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 0, g: 0, b: 0, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -2168,7 +2168,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 0, g: 0, b: 0, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -2236,7 +2236,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 0, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -2358,7 +2358,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 0, g: 0, b: 0, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -2557,7 +2557,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 0, g: 0, b: 0, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -2625,7 +2625,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 0, g: 1, b: 0, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -3192,7 +3192,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 1, g: 0, b: 1, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -3381,7 +3381,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 0, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -3455,7 +3455,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 0, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -3529,7 +3529,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 0, g: 0, b: 0, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -3778,7 +3778,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 1, g: 1, b: 1, a: 0.392} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -3846,7 +3846,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 0, g: 0, b: 0, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -4007,7 +4007,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 0, g: 0, b: 0, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -4621,7 +4621,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -4877,7 +4877,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 0, g: 0, b: 0, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -4945,7 +4945,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 0, g: 0, b: 0, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -5019,7 +5019,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 0, g: 0, b: 0, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -5218,7 +5218,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 0, g: 0, b: 0, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -5396,7 +5396,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 1, g: 0, b: 0, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -5682,7 +5682,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 0, g: 0, b: 0, a: 0.09411765} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -5871,7 +5871,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 0, g: 0, b: 0, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] diff --git a/Source/Assets/TouchScript/Examples/RawInput/RawInput.unity b/Source/Assets/TouchScript/Examples/RawInput/RawInput.unity index a8f05f794..a892f4c41 100644 --- a/Source/Assets/TouchScript/Examples/RawInput/RawInput.unity +++ b/Source/Assets/TouchScript/Examples/RawInput/RawInput.unity @@ -308,7 +308,7 @@ Prefab: objectReference: {fileID: 0} - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: m_RootOrder - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: shouldCreateCameraLayer @@ -317,6 +317,88 @@ Prefab: m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} m_IsPrefabParent: 0 +--- !u!1001 &630877083 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_Pivot.y + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + m_IsPrefabParent: 0 --- !u!1 &740851131 GameObject: m_ObjectHideFlags: 0 @@ -772,28 +854,6 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1001 &1772227325 -Prefab: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 11400000, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} - propertyPath: m_Enabled - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 100000, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} - propertyPath: m_IsActive - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 400000, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} - propertyPath: m_RootOrder - value: 1 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_ParentPrefab: {fileID: 100100000, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} - m_IsPrefabParent: 0 --- !u!1 &1981142012 GameObject: m_ObjectHideFlags: 0 diff --git a/Source/Assets/TouchScript/Prefabs/Cursors/Mouse Cursor.prefab b/Source/Assets/TouchScript/Prefabs/Cursors/Mouse Cursor.prefab index 174ffb7eb..7697254f0 100644 --- a/Source/Assets/TouchScript/Prefabs/Cursors/Mouse Cursor.prefab +++ b/Source/Assets/TouchScript/Prefabs/Cursors/Mouse Cursor.prefab @@ -5,12 +5,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 22498922} - - 222: {fileID: 22253470} - - 114: {fileID: 11415522} - - 114: {fileID: 11446012} + - component: {fileID: 22498922} + - component: {fileID: 22253470} + - component: {fileID: 11415522} + - component: {fileID: 11446012} m_Layer: 0 m_Name: Text m_TagString: Untagged @@ -23,12 +23,13 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 22471328} - - 222: {fileID: 22246154} - - 114: {fileID: 11446800} - - 114: {fileID: 11419342} + - component: {fileID: 22471328} + - component: {fileID: 22246154} + - component: {fileID: 11446800} + - component: {fileID: 11419342} + - component: {fileID: 114695260886518812} m_Layer: 0 m_Name: Pressed m_TagString: Untagged @@ -41,10 +42,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 22499528} - - 114: {fileID: 11416202} + - component: {fileID: 22499528} + - component: {fileID: 11416202} + - component: {fileID: 223878911915740246} m_Layer: 0 m_Name: Mouse Cursor m_TagString: Untagged @@ -57,12 +59,13 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 22497446} - - 222: {fileID: 22249184} - - 114: {fileID: 11453278} - - 114: {fileID: 11448672} + - component: {fileID: 22497446} + - component: {fileID: 22249184} + - component: {fileID: 11453278} + - component: {fileID: 11448672} + - component: {fileID: 114973988835986202} m_Layer: 0 m_Name: Default m_TagString: Untagged @@ -117,8 +120,8 @@ MonoBehaviour: ShowPointerId: 0 ShowFlags: 0 Text: {fileID: 11415522} - DefaultCursor: {fileID: 189110} - PressedCursor: {fileID: 183852} + DefaultCursor: {fileID: 0} + PressedCursor: {fileID: 114695260886518812} ShowButtons: 0 --- !u!114 &11419342 MonoBehaviour: @@ -132,30 +135,15 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Gradient: - key0: - serializedVersion: 2 - rgba: 0 - key1: - serializedVersion: 2 - rgba: 1006698240 - key2: - serializedVersion: 2 - rgba: 1006698240 - key3: - serializedVersion: 2 - rgba: 4278190080 - key4: - serializedVersion: 2 - rgba: 4278190080 - key5: - serializedVersion: 2 - rgba: 1006632960 - key6: - serializedVersion: 2 - rgba: 1090519040 - key7: - serializedVersion: 2 - rgba: 0 + serializedVersion: 2 + key0: {r: 0, g: 0, b: 0, a: 0} + key1: {r: 0, g: 1, b: 0, a: 0.23529412} + key2: {r: 0, g: 1, b: 0, a: 0.23529412} + key3: {r: 0, g: 0, b: 0, a: 1} + key4: {r: 0, g: 0, b: 0, a: 1} + key5: {r: 0, g: 0, b: 0, a: 0.23529412} + key6: {r: 0, g: 0, b: 0, a: 0.25490198} + key7: {r: 0, g: 0, b: 0, a: 0} ctime0: 31905 ctime1: 33371 ctime2: 44754 @@ -172,6 +160,7 @@ MonoBehaviour: atime5: 56826 atime6: 64242 atime7: 64571 + m_Mode: 0 m_NumColorKeys: 4 m_NumAlphaKeys: 8 Name: Mouse Pressed @@ -228,30 +217,15 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Gradient: - key0: - serializedVersion: 2 - rgba: 4278255360 - key1: - serializedVersion: 2 - rgba: 4278255360 - key2: - serializedVersion: 2 - rgba: 1006632960 - key3: - serializedVersion: 2 - rgba: 1006632960 - key4: - serializedVersion: 2 - rgba: 0 - key5: - serializedVersion: 2 - rgba: 0 - key6: - serializedVersion: 2 - rgba: 0 - key7: - serializedVersion: 2 - rgba: 0 + serializedVersion: 2 + key0: {r: 0, g: 1, b: 0, a: 1} + key1: {r: 0, g: 1, b: 0, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0.23529412} + key3: {r: 0, g: 0, b: 0, a: 0.23529412} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} ctime0: 0 ctime1: 9572 ctime2: 10779 @@ -268,6 +242,7 @@ MonoBehaviour: atime5: 64571 atime6: 64571 atime7: 64571 + m_Mode: 0 m_NumColorKeys: 3 m_NumAlphaKeys: 5 Name: Mouse Default @@ -325,10 +300,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 22499528} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} @@ -343,10 +318,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 22499528} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} @@ -361,10 +336,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 22499528} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 0.5} m_AnchorMax: {x: 1, y: 0.5} m_AnchoredPosition: {x: 3, y: 0} @@ -379,13 +354,13 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 22497446} - {fileID: 22471328} - {fileID: 22498922} m_Father: {fileID: 0} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 500, y: 300} @@ -402,3 +377,45 @@ Prefab: m_ParentPrefab: {fileID: 0} m_RootGameObject: {fileID: 185820} m_IsPrefabParent: 1 +--- !u!114 &114695260886518812 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 183852} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1a709300256ec1e4995018f4f91470aa, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &114973988835986202 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 189110} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1a709300256ec1e4995018f4f91470aa, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!223 &223878911915740246 +Canvas: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 185820} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 diff --git a/Source/Assets/TouchScript/Prefabs/Cursors/Pen Cursor.prefab b/Source/Assets/TouchScript/Prefabs/Cursors/Pen Cursor.prefab index bbbadb400..e5767b17e 100644 --- a/Source/Assets/TouchScript/Prefabs/Cursors/Pen Cursor.prefab +++ b/Source/Assets/TouchScript/Prefabs/Cursors/Pen Cursor.prefab @@ -5,12 +5,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 22483962} - - 222: {fileID: 22239818} - - 114: {fileID: 11439998} - - 114: {fileID: 11426034} + - component: {fileID: 22483962} + - component: {fileID: 22239818} + - component: {fileID: 11439998} + - component: {fileID: 11426034} m_Layer: 0 m_Name: Text m_TagString: Untagged @@ -23,10 +23,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 22480400} - - 114: {fileID: 11486812} + - component: {fileID: 22480400} + - component: {fileID: 11486812} + - component: {fileID: 223912096970254378} m_Layer: 0 m_Name: Pen Cursor m_TagString: Untagged @@ -39,12 +40,13 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 22479482} - - 222: {fileID: 22231526} - - 114: {fileID: 11469244} - - 114: {fileID: 11473414} + - component: {fileID: 22479482} + - component: {fileID: 22231526} + - component: {fileID: 11469244} + - component: {fileID: 11473414} + - component: {fileID: 114485558856495662} m_Layer: 0 m_Name: Default m_TagString: Untagged @@ -57,12 +59,13 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 22408358} - - 222: {fileID: 22255864} - - 114: {fileID: 11426810} - - 114: {fileID: 11438738} + - component: {fileID: 22408358} + - component: {fileID: 22255864} + - component: {fileID: 11426810} + - component: {fileID: 11438738} + - component: {fileID: 114380379277784028} m_Layer: 0 m_Name: Pressed m_TagString: Untagged @@ -122,30 +125,15 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Gradient: - key0: - serializedVersion: 2 - rgba: 0 - key1: - serializedVersion: 2 - rgba: 1006693630 - key2: - serializedVersion: 2 - rgba: 1006693630 - key3: - serializedVersion: 2 - rgba: 4278190080 - key4: - serializedVersion: 2 - rgba: 4278190080 - key5: - serializedVersion: 2 - rgba: 1006632960 - key6: - serializedVersion: 2 - rgba: 1090519040 - key7: - serializedVersion: 2 - rgba: 0 + serializedVersion: 2 + key0: {r: 0, g: 0, b: 0, a: 0} + key1: {r: 0.99607843, g: 0.9254902, b: 0, a: 0.23529412} + key2: {r: 0.99607843, g: 0.9254902, b: 0, a: 0.23529412} + key3: {r: 0, g: 0, b: 0, a: 1} + key4: {r: 0, g: 0, b: 0, a: 1} + key5: {r: 0, g: 0, b: 0, a: 0.23529412} + key6: {r: 0, g: 0, b: 0, a: 0.25490198} + key7: {r: 0, g: 0, b: 0, a: 0} ctime0: 31905 ctime1: 33371 ctime2: 44754 @@ -162,6 +150,7 @@ MonoBehaviour: atime5: 56826 atime6: 64242 atime7: 64571 + m_Mode: 0 m_NumColorKeys: 4 m_NumAlphaKeys: 8 Name: Pen Pressed @@ -237,30 +226,15 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Gradient: - key0: - serializedVersion: 2 - rgba: 4278316542 - key1: - serializedVersion: 2 - rgba: 4278250750 - key2: - serializedVersion: 2 - rgba: 1006632960 - key3: - serializedVersion: 2 - rgba: 1006632960 - key4: - serializedVersion: 2 - rgba: 0 - key5: - serializedVersion: 2 - rgba: 0 - key6: - serializedVersion: 2 - rgba: 0 - key7: - serializedVersion: 2 - rgba: 0 + serializedVersion: 2 + key0: {r: 0.99607843, g: 0.92941177, b: 0.003921569, a: 1} + key1: {r: 0.99607843, g: 0.9254902, b: 0, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0.23529412} + key3: {r: 0, g: 0, b: 0, a: 0.23529412} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} ctime0: 0 ctime1: 9572 ctime2: 10779 @@ -277,6 +251,7 @@ MonoBehaviour: atime5: 64571 atime6: 64571 atime7: 64571 + m_Mode: 0 m_NumColorKeys: 3 m_NumAlphaKeys: 5 Name: Pen Default @@ -295,8 +270,8 @@ MonoBehaviour: ShowPointerId: 0 ShowFlags: 0 Text: {fileID: 11439998} - DefaultCursor: {fileID: 133736} - PressedCursor: {fileID: 167092} + DefaultCursor: {fileID: 114485558856495662} + PressedCursor: {fileID: 114380379277784028} ShowButtons: 0 ShowPressure: 0 ShowRotation: 0 @@ -327,10 +302,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 22480400} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} @@ -345,10 +320,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 22480400} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} @@ -363,13 +338,13 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 22479482} - {fileID: 22408358} - {fileID: 22483962} m_Father: {fileID: 0} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 500, y: 400} @@ -384,10 +359,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 22480400} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 0.5} m_AnchorMax: {x: 1, y: 0.5} m_AnchoredPosition: {x: 3, y: 0.00000071525574} @@ -404,3 +379,45 @@ Prefab: m_ParentPrefab: {fileID: 0} m_RootGameObject: {fileID: 118164} m_IsPrefabParent: 1 +--- !u!114 &114380379277784028 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 167092} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1a709300256ec1e4995018f4f91470aa, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &114485558856495662 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 133736} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1a709300256ec1e4995018f4f91470aa, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!223 &223912096970254378 +Canvas: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 118164} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 diff --git a/Source/Assets/TouchScript/Prefabs/Cursors/Pointer.prefab b/Source/Assets/TouchScript/Prefabs/Cursors/Pointer.prefab index 9d3c50d60..e04ebf739 100644 --- a/Source/Assets/TouchScript/Prefabs/Cursors/Pointer.prefab +++ b/Source/Assets/TouchScript/Prefabs/Cursors/Pointer.prefab @@ -5,12 +5,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 22436736} - - 222: {fileID: 22287504} - - 114: {fileID: 11421528} - - 114: {fileID: 11442452} + - component: {fileID: 22436736} + - component: {fileID: 22287504} + - component: {fileID: 11421528} + - component: {fileID: 11442452} m_Layer: 0 m_Name: Pressed m_TagString: Untagged @@ -23,10 +23,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 22471328} - - 114: {fileID: 11468960} + - component: {fileID: 22471328} + - component: {fileID: 11468960} + - component: {fileID: 223813922742015622} m_Layer: 0 m_Name: Pointer m_TagString: Untagged @@ -72,30 +73,15 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Gradient: - key0: - serializedVersion: 2 - rgba: 0 - key1: - serializedVersion: 2 - rgba: 1023344129 - key2: - serializedVersion: 2 - rgba: 1023344129 - key3: - serializedVersion: 2 - rgba: 4278190080 - key4: - serializedVersion: 2 - rgba: 4278190080 - key5: - serializedVersion: 2 - rgba: 1006632960 - key6: - serializedVersion: 2 - rgba: 1090519040 - key7: - serializedVersion: 2 - rgba: 0 + serializedVersion: 2 + key0: {r: 0, g: 0, b: 0, a: 0} + key1: {r: 0.003921569, g: 0.99607843, b: 0.99607843, a: 0.23529412} + key2: {r: 0.003921569, g: 0.99607843, b: 0.99607843, a: 0.23529412} + key3: {r: 0, g: 0, b: 0, a: 1} + key4: {r: 0, g: 0, b: 0, a: 1} + key5: {r: 0, g: 0, b: 0, a: 0.23529412} + key6: {r: 0, g: 0, b: 0, a: 0.25490198} + key7: {r: 0, g: 0, b: 0, a: 0} ctime0: 31905 ctime1: 33371 ctime2: 44754 @@ -112,11 +98,11 @@ MonoBehaviour: atime5: 56826 atime6: 64242 atime7: 64571 + m_Mode: 0 m_NumColorKeys: 4 m_NumAlphaKeys: 8 Name: Pointer Pressed Resolution: 256 - texture: {fileID: 0} --- !u!114 &11468960 MonoBehaviour: m_ObjectHideFlags: 1 @@ -143,10 +129,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 22471328} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0.000091552734, y: 0} @@ -161,11 +147,11 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 22436736} m_Father: {fileID: 0} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 500, y: 100} @@ -182,3 +168,23 @@ Prefab: m_ParentPrefab: {fileID: 0} m_RootGameObject: {fileID: 183852} m_IsPrefabParent: 1 +--- !u!223 &223813922742015622 +Canvas: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 183852} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 diff --git a/Source/Assets/TouchScript/Prefabs/Cursors/Touch Cursor.prefab b/Source/Assets/TouchScript/Prefabs/Cursors/Touch Cursor.prefab index f3397cc3e..99f53e781 100644 --- a/Source/Assets/TouchScript/Prefabs/Cursors/Touch Cursor.prefab +++ b/Source/Assets/TouchScript/Prefabs/Cursors/Touch Cursor.prefab @@ -5,12 +5,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 22498922} - - 222: {fileID: 22253470} - - 114: {fileID: 11415522} - - 114: {fileID: 11446012} + - component: {fileID: 22498922} + - component: {fileID: 22253470} + - component: {fileID: 11415522} + - component: {fileID: 11446012} m_Layer: 0 m_Name: Text m_TagString: Untagged @@ -23,12 +23,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 22471328} - - 222: {fileID: 22246154} - - 114: {fileID: 11490436} - - 114: {fileID: 11433328} + - component: {fileID: 22471328} + - component: {fileID: 22246154} + - component: {fileID: 11490436} + - component: {fileID: 11433328} m_Layer: 0 m_Name: Pressed m_TagString: Untagged @@ -41,10 +41,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 22499528} - - 114: {fileID: 11435582} + - component: {fileID: 22499528} + - component: {fileID: 11435582} + - component: {fileID: 223147991810450650} m_Layer: 0 m_Name: Touch Cursor m_TagString: Untagged @@ -97,30 +98,15 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Gradient: - key0: - serializedVersion: 2 - rgba: 0 - key1: - serializedVersion: 2 - rgba: 1023344129 - key2: - serializedVersion: 2 - rgba: 1023344129 - key3: - serializedVersion: 2 - rgba: 4278190080 - key4: - serializedVersion: 2 - rgba: 4278190080 - key5: - serializedVersion: 2 - rgba: 1006632960 - key6: - serializedVersion: 2 - rgba: 1090519040 - key7: - serializedVersion: 2 - rgba: 0 + serializedVersion: 2 + key0: {r: 0, g: 0, b: 0, a: 0} + key1: {r: 0.003921569, g: 0.99607843, b: 0.99607843, a: 0.23529412} + key2: {r: 0.003921569, g: 0.99607843, b: 0.99607843, a: 0.23529412} + key3: {r: 0, g: 0, b: 0, a: 1} + key4: {r: 0, g: 0, b: 0, a: 1} + key5: {r: 0, g: 0, b: 0, a: 0.23529412} + key6: {r: 0, g: 0, b: 0, a: 0.25490198} + key7: {r: 0, g: 0, b: 0, a: 0} ctime0: 31905 ctime1: 33371 ctime2: 44754 @@ -137,6 +123,7 @@ MonoBehaviour: atime5: 56826 atime6: 64242 atime7: 64571 + m_Mode: 0 m_NumColorKeys: 4 m_NumAlphaKeys: 8 Name: Touch Pressed @@ -218,10 +205,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 22499528} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} @@ -236,10 +223,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 22499528} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 0.5} m_AnchorMax: {x: 1, y: 0.5} m_AnchoredPosition: {x: 3, y: 0.00000035762787} @@ -254,12 +241,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 22471328} - {fileID: 22498922} m_Father: {fileID: 0} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 500, y: 200} @@ -276,3 +263,23 @@ Prefab: m_ParentPrefab: {fileID: 0} m_RootGameObject: {fileID: 185820} m_IsPrefabParent: 1 +--- !u!223 &223147991810450650 +Canvas: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 185820} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/MouseCursor.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/MouseCursor.cs index a41f4bd7e..71c484bfb 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/MouseCursor.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/MouseCursor.cs @@ -3,6 +3,7 @@ */ using System.Text; +using TouchScript.Behaviors.Cursors.UI; using TouchScript.Pointers; using TouchScript.Utils; using UnityEngine; @@ -13,8 +14,8 @@ public class MouseCursor : TextPointerCursor { #region Public properties - public GameObject DefaultCursor; - public GameObject PressedCursor; + public TextureSwitch DefaultCursor; + public TextureSwitch PressedCursor; public bool ShowButtons = false; @@ -32,13 +33,13 @@ protected override void updateOnce(IPointer pointer) { case ProxyState.Released: case ProxyState.Over: - if (DefaultCursor != null) DefaultCursor.SetActive(true); - if (PressedCursor != null) PressedCursor.SetActive(false); + if (DefaultCursor != null) DefaultCursor.Show(); + if (PressedCursor != null) PressedCursor.Hide(); break; case ProxyState.Pressed: case ProxyState.OverPressed: - if (DefaultCursor != null) DefaultCursor.SetActive(false); - if (PressedCursor != null) PressedCursor.SetActive(true); + if (DefaultCursor != null) DefaultCursor.Hide(); + if (PressedCursor != null) PressedCursor.Show(); break; } diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PenCursor.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PenCursor.cs index 9df51a562..3cf612b66 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PenCursor.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PenCursor.cs @@ -3,6 +3,7 @@ */ using System.Text; +using TouchScript.Behaviors.Cursors.UI; using TouchScript.Pointers; using TouchScript.Utils; using UnityEngine; @@ -13,8 +14,8 @@ public class PenCursor : TextPointerCursor { #region Public properties - public GameObject DefaultCursor; - public GameObject PressedCursor; + public TextureSwitch DefaultCursor; + public TextureSwitch PressedCursor; public bool ShowButtons = false; @@ -36,13 +37,13 @@ protected override void updateOnce(IPointer pointer) { case ProxyState.Released: case ProxyState.Over: - if (DefaultCursor != null) DefaultCursor.SetActive(true); - if (PressedCursor != null) PressedCursor.SetActive(false); + if (DefaultCursor != null) DefaultCursor.Show(); + if (PressedCursor != null) PressedCursor.Hide(); break; case ProxyState.Pressed: case ProxyState.OverPressed: - if (DefaultCursor != null) DefaultCursor.SetActive(false); - if (PressedCursor != null) PressedCursor.SetActive(true); + if (DefaultCursor != null) DefaultCursor.Hide(); + if (PressedCursor != null) PressedCursor.Show(); break; } diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PointerCursor.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PointerCursor.cs index 647dd07f9..c99ebf65b 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PointerCursor.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PointerCursor.cs @@ -54,13 +54,6 @@ protected override void updateOnce(IPointer pointer) { base.updateOnce(pointer); -#if UNITY_EDITOR - stringBuilder.Length = 0; - stringBuilder.Append("Pointer id: "); - stringBuilder.Append(pointer.Id); - gameObject.name = stringBuilder.ToString(); -#endif - if (Text == null) return; if (!shouldShowText()) { diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI/TextureSwitch.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI/TextureSwitch.cs new file mode 100644 index 000000000..5dd752037 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI/TextureSwitch.cs @@ -0,0 +1,31 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using UnityEngine; +using UnityEngine.UI; + +namespace TouchScript.Behaviors.Cursors.UI +{ + public class TextureSwitch : MonoBehaviour + { + + private CanvasRenderer r; + + public void Show() + { + r.SetAlpha(1); + } + + public void Hide() + { + r.SetAlpha(0); + } + + private void Awake() + { + r = GetComponent(); + } + + } +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI/TextureSwitch.cs.meta b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI/TextureSwitch.cs.meta new file mode 100644 index 000000000..516f9df40 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI/TextureSwitch.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1a709300256ec1e4995018f4f91470aa +timeCreated: 1500663748 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs index 411bb002a..dec5d47b5 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs @@ -352,7 +352,7 @@ private HitResult performWorldSearch(IPointer pointer, out HitData hit) { var raycaster = raycasters[i] as GraphicRaycaster; if (raycaster == null) continue; - var canvas = TouchScriptInputModule.Instance.GetCanvasForRaycaster(raycaster); // TODO: cache + var canvas = TouchScriptInputModule.Instance.GetCanvasForRaycaster(raycaster); if ((canvas == null) || (canvas.renderMode == RenderMode.ScreenSpaceOverlay) || (canvas.worldCamera != _camera)) continue; performUISearchForCanvas(pointer, canvas, raycaster, _camera, float.MaxValue, ray); } @@ -400,7 +400,7 @@ private HitResult performSSUISearch(IPointer pointer, out HitData hit) { var raycaster = raycasters[i] as GraphicRaycaster; if (raycaster == null) continue; - var canvas = TouchScriptInputModule.Instance.GetCanvasForRaycaster(raycaster); // TODO: cache + var canvas = TouchScriptInputModule.Instance.GetCanvasForRaycaster(raycaster); if ((canvas == null) || (canvas.renderMode != RenderMode.ScreenSpaceOverlay)) continue; performUISearchForCanvas(pointer, canvas, raycaster); } diff --git a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs index 742d5c148..09c769611 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs @@ -413,11 +413,13 @@ public virtual void ProcessUpdated(object sender, PointerEventArgs pointerEventA for (var i = 0; i < count; i++) { var pointer = pointers[i]; + + var over = pointer.GetOverData(); + if (over.Type != HitData.HitType.UI && over.Type != HitData.HitType.ScreenSpace) continue; + PointerEventData data; GetPointerData(pointer.Id, out data, true); data.Reset(); - - var over = pointer.GetOverData(); var target = over.Target; var currentOverGo = target == null ? null : target.gameObject; @@ -472,9 +474,12 @@ public virtual void ProcessPressed(object sender, PointerEventArgs pointerEventA for (var i = 0; i < count; i++) { var pointer = pointers[i]; + + var over = pointer.GetOverData(); + if (over.Type != HitData.HitType.UI && over.Type != HitData.HitType.ScreenSpace) continue; + PointerEventData data; GetPointerData(pointer.Id, out data, true); - var over = pointer.GetOverData(); var target = over.Target; var currentOverGo = target == null ? null : target.gameObject; @@ -542,10 +547,13 @@ public virtual void ProcessReleased(object sender, PointerEventArgs pointerEvent for (var i = 0; i < count; i++) { var pointer = pointers[i]; + + var over = pointer.GetOverData(); + if (over.Type != HitData.HitType.UI && over.Type != HitData.HitType.ScreenSpace) continue; + PointerEventData data; GetPointerData(pointer.Id, out data, true); - - var target = pointer.GetOverData().Target; + var target = over.Target; var currentOverGo = target == null ? null : target.gameObject; ExecuteEvents.Execute(data.pointerPress, data, ExecuteEvents.pointerUpHandler); @@ -592,10 +600,13 @@ public virtual void ProcessCancelled(object sender, PointerEventArgs pointerEven for (var i = 0; i < count; i++) { var pointer = pointers[i]; + + var over = pointer.GetOverData(); + if (over.Type != HitData.HitType.UI && over.Type != HitData.HitType.ScreenSpace) continue; + PointerEventData data; GetPointerData(pointer.Id, out data, true); - - var target = pointer.GetOverData().Target; + var target = over.Target; var currentOverGo = target == null ? null : target.gameObject; ExecuteEvents.Execute(data.pointerPress, data, ExecuteEvents.pointerUpHandler); From 58ad2d9677f88b90a278dd3c3c403afb494f8b08 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Fri, 21 Jul 2017 23:02:05 +0300 Subject: [PATCH 23/58] Moved some of the native Windows APIs to WindowsUtils. --- .../InputHandlers/WindowsPointerHandlers.cs | 108 +++--------------- .../Scripts/Layers/ProjectionParams.cs | 2 +- .../Utils/{ => Geom}/ProjectionUtils.cs | 2 +- .../Utils/{ => Geom}/ProjectionUtils.cs.meta | 0 .../TouchScript/Scripts/Utils/Platform.meta | 9 ++ .../Scripts/Utils/Platform/WindowsUtils.cs | 107 +++++++++++++++++ .../Utils/Platform/WindowsUtils.cs.meta | 12 ++ 7 files changed, 143 insertions(+), 97 deletions(-) rename Source/Assets/TouchScript/Scripts/Utils/{ => Geom}/ProjectionUtils.cs (98%) rename Source/Assets/TouchScript/Scripts/Utils/{ => Geom}/ProjectionUtils.cs.meta (100%) create mode 100644 Source/Assets/TouchScript/Scripts/Utils/Platform.meta create mode 100644 Source/Assets/TouchScript/Scripts/Utils/Platform/WindowsUtils.cs create mode 100644 Source/Assets/TouchScript/Scripts/Utils/Platform/WindowsUtils.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs index a722f584e..28f6642df 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs @@ -11,6 +11,7 @@ using System.Runtime.InteropServices; using TouchScript.Pointers; using TouchScript.Utils; +using TouchScript.Utils.Platform; using UnityEngine; namespace TouchScript.InputSources.InputHandlers @@ -27,7 +28,7 @@ public bool MouseInPointer get { return mouseInPointer; } set { - EnableMouseInPointer(value); + WindowsUtils.EnableMouseInPointer(value); mouseInPointer = value; if (mouseInPointer) { @@ -113,7 +114,7 @@ public override void Dispose() penPointer = null; } - EnableMouseInPointer(false); + WindowsUtils.EnableMouseInPointer(false); base.Dispose(); } @@ -228,7 +229,7 @@ public WindowsPointerHandler(PointerDelegate addPointer, PointerDelegate updateP touchPool = new ObjectPool(10, () => new TouchPointer(this), null, resetPointer); - hMainWindow = GetActiveWindow(); + hMainWindow = WindowsUtils.GetActiveWindow(); disablePressAndHold(); setScaling(); } @@ -401,12 +402,12 @@ protected void resetPointer(Pointer p) private void disablePressAndHold() { // https://msdn.microsoft.com/en-us/library/bb969148(v=vs.85).aspx - pressAndHoldAtomID = GlobalAddAtom(PRESS_AND_HOLD_ATOM); - SetProp(hMainWindow, PRESS_AND_HOLD_ATOM, - TABLET_DISABLE_PRESSANDHOLD | // disables press and hold (right-click) gesture - TABLET_DISABLE_PENTAPFEEDBACK | // disables UI feedback on pen up (waves) - TABLET_DISABLE_PENBARRELFEEDBACK | // disables UI feedback on pen button down (circle) - TABLET_DISABLE_FLICKS // disables pen flicks (back, forward, drag down, drag up); + pressAndHoldAtomID = WindowsUtils.GlobalAddAtom(PRESS_AND_HOLD_ATOM); + WindowsUtils.SetProp(hMainWindow, PRESS_AND_HOLD_ATOM, + WindowsUtils.TABLET_DISABLE_PRESSANDHOLD | // disables press and hold (right-click) gesture + WindowsUtils.TABLET_DISABLE_PENTAPFEEDBACK | // disables UI feedback on pen up (waves) + WindowsUtils.TABLET_DISABLE_PENBARRELFEEDBACK | // disables UI feedback on pen button down (circle) + WindowsUtils.TABLET_DISABLE_FLICKS // disables pen flicks (back, forward, drag down, drag up); ); } @@ -414,8 +415,8 @@ private void enablePressAndHold() { if (pressAndHoldAtomID != 0) { - RemoveProp(hMainWindow, PRESS_AND_HOLD_ATOM); - GlobalDeleteAtom(pressAndHoldAtomID); + WindowsUtils.RemoveProp(hMainWindow, PRESS_AND_HOLD_ATOM); + WindowsUtils.GlobalDeleteAtom(pressAndHoldAtomID); } } @@ -431,28 +432,11 @@ private void setScaling() } int width, height; - getNativeMonitorResolution(out width, out height); + WindowsUtils.GetNativeMonitorResolution(out width, out height); float scale = Mathf.Max(screenWidth / ((float) width), screenHeight / ((float) height)); SetScreenParams(screenWidth, screenHeight, (width - screenWidth / scale) * .5f, (height - screenHeight / scale) * .5f, scale, scale); } - private void getNativeMonitorResolution(out int width, out int height) - { - var monitor = MonitorFromWindow(GetActiveWindow(), MONITOR_DEFAULTTONEAREST); - MONITORINFO monitorInfo = new MONITORINFO(); - monitorInfo.cbSize = Marshal.SizeOf(monitorInfo); - if (!GetMonitorInfo(monitor, ref monitorInfo)) - { - width = Screen.width; - height = Screen.height; - } - else - { - width = monitorInfo.rcMonitor.Width; - height = monitorInfo.rcMonitor.Height; - } - } - #endregion #region Pointer callbacks @@ -725,48 +709,6 @@ protected struct PointerData public int TiltY; } - private const int TABLET_DISABLE_PRESSANDHOLD = 0x00000001; - private const int TABLET_DISABLE_PENTAPFEEDBACK = 0x00000008; - private const int TABLET_DISABLE_PENBARRELFEEDBACK = 0x00000010; - private const int TABLET_DISABLE_FLICKS = 0x00010000; - - private const int MONITOR_DEFAULTTONEAREST = 2; - - [StructLayout(LayoutKind.Sequential)] - private struct MONITORINFO - { - public int cbSize; - public RECT rcMonitor; - public RECT rcWork; - public uint dwFlags; - } - - [StructLayout(LayoutKind.Sequential)] - private struct RECT - { - public int Left, Top, Right, Bottom; - - public RECT(int left, int top, int right, int bottom) - { - Left = left; - Top = top; - Right = right; - Bottom = bottom; - } - - public int Height - { - get { return Bottom - Top; } - set { Bottom = value + Top; } - } - - public int Width - { - get { return Right - Left; } - set { Right = value + Left; } - } - } - [DllImport("WindowsTouch", CallingConvention = CallingConvention.StdCall)] private static extern void Init(TOUCH_API api, NativeLog log, NativePointerDelegate pointerDelegate); @@ -776,30 +718,6 @@ public int Width [DllImport("WindowsTouch", CallingConvention = CallingConvention.StdCall)] private static extern void SetScreenParams(int width, int height, float offsetX, float offsetY, float scaleX, float scaleY); - [DllImport("user32.dll")] - private static extern IntPtr GetActiveWindow(); - - [DllImport("user32.dll")] - private static extern IntPtr MonitorFromWindow(IntPtr hwnd, uint dwFlags); - - [DllImport("user32.dll")] - private static extern bool GetMonitorInfo(IntPtr hMonitor, ref MONITORINFO lpmi); - - [DllImport("Kernel32.dll")] - private static extern ushort GlobalAddAtom(string lpString); - - [DllImport("Kernel32.dll")] - private static extern ushort GlobalDeleteAtom(ushort nAtom); - - [DllImport("user32.dll")] - private static extern int SetProp(IntPtr hWnd, string lpString, int hData); - - [DllImport("user32.dll")] - private static extern int RemoveProp(IntPtr hWnd, string lpString); - - [DllImport("user32.dll")] - public static extern IntPtr EnableMouseInPointer(bool value); - #endregion } } diff --git a/Source/Assets/TouchScript/Scripts/Layers/ProjectionParams.cs b/Source/Assets/TouchScript/Scripts/Layers/ProjectionParams.cs index 7c5addf77..3a68972a2 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/ProjectionParams.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/ProjectionParams.cs @@ -2,7 +2,7 @@ * @author Valentin Simonov / http://va.lent.in/ */ -using TouchScript.Utils; +using TouchScript.Utils.Geom; using UnityEngine; namespace TouchScript.Layers diff --git a/Source/Assets/TouchScript/Scripts/Utils/ProjectionUtils.cs b/Source/Assets/TouchScript/Scripts/Utils/Geom/ProjectionUtils.cs similarity index 98% rename from Source/Assets/TouchScript/Scripts/Utils/ProjectionUtils.cs rename to Source/Assets/TouchScript/Scripts/Utils/Geom/ProjectionUtils.cs index 94e8d745a..3acb24629 100644 --- a/Source/Assets/TouchScript/Scripts/Utils/ProjectionUtils.cs +++ b/Source/Assets/TouchScript/Scripts/Utils/Geom/ProjectionUtils.cs @@ -4,7 +4,7 @@ using UnityEngine; -namespace TouchScript.Utils +namespace TouchScript.Utils.Geom { /// /// Projection utils. diff --git a/Source/Assets/TouchScript/Scripts/Utils/ProjectionUtils.cs.meta b/Source/Assets/TouchScript/Scripts/Utils/Geom/ProjectionUtils.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/Utils/ProjectionUtils.cs.meta rename to Source/Assets/TouchScript/Scripts/Utils/Geom/ProjectionUtils.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/Utils/Platform.meta b/Source/Assets/TouchScript/Scripts/Utils/Platform.meta new file mode 100644 index 000000000..0b9109615 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Utils/Platform.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e3045b87ade623e42ade0bb0df4f6d5c +folderAsset: yes +timeCreated: 1500666269 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Utils/Platform/WindowsUtils.cs b/Source/Assets/TouchScript/Scripts/Utils/Platform/WindowsUtils.cs new file mode 100644 index 000000000..5c4d954e3 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Utils/Platform/WindowsUtils.cs @@ -0,0 +1,107 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +#if UNITY_STANDALONE_WIN + +using System; +using System.Runtime.InteropServices; +using UnityEngine; + +namespace TouchScript.Utils.Platform +{ + + public static class WindowsUtils + { + + // disables press and hold (right-click) gesture + public const int TABLET_DISABLE_PRESSANDHOLD = 0x00000001; + // disables UI feedback on pen up (waves) + public const int TABLET_DISABLE_PENTAPFEEDBACK = 0x00000008; + // disables UI feedback on pen button down (circle) + public const int TABLET_DISABLE_PENBARRELFEEDBACK = 0x00000010; + // disables pen flicks (back, forward, drag down, drag up); + public const int TABLET_DISABLE_FLICKS = 0x00010000; + + public const int MONITOR_DEFAULTTONEAREST = 2; + + [StructLayout(LayoutKind.Sequential)] + public struct RECT + { + public int Left, Top, Right, Bottom; + + public RECT(int left, int top, int right, int bottom) + { + Left = left; + Top = top; + Right = right; + Bottom = bottom; + } + + public int Height + { + get { return Bottom - Top; } + set { Bottom = value + Top; } + } + + public int Width + { + get { return Right - Left; } + set { Right = value + Left; } + } + } + + [StructLayout(LayoutKind.Sequential)] + public struct MONITORINFO + { + public int cbSize; + public RECT rcMonitor; + public RECT rcWork; + public uint dwFlags; + } + + public static void GetNativeMonitorResolution(out int width, out int height) + { + var monitor = MonitorFromWindow(GetActiveWindow(), MONITOR_DEFAULTTONEAREST); + MONITORINFO monitorInfo = new MONITORINFO(); + monitorInfo.cbSize = Marshal.SizeOf(monitorInfo); + if (!GetMonitorInfo(monitor, ref monitorInfo)) + { + width = Screen.width; + height = Screen.height; + } + else + { + width = monitorInfo.rcMonitor.Width; + height = monitorInfo.rcMonitor.Height; + } + } + + [DllImport("user32.dll")] + public static extern IntPtr GetActiveWindow(); + + [DllImport("user32.dll")] + public static extern IntPtr MonitorFromWindow(IntPtr hwnd, uint dwFlags); + + [DllImport("user32.dll")] + public static extern bool GetMonitorInfo(IntPtr hMonitor, ref MONITORINFO lpmi); + + [DllImport("Kernel32.dll")] + public static extern ushort GlobalAddAtom(string lpString); + + [DllImport("Kernel32.dll")] + public static extern ushort GlobalDeleteAtom(ushort nAtom); + + [DllImport("user32.dll")] + public static extern int SetProp(IntPtr hWnd, string lpString, int hData); + + [DllImport("user32.dll")] + public static extern int RemoveProp(IntPtr hWnd, string lpString); + + [DllImport("user32.dll")] + public static extern IntPtr EnableMouseInPointer(bool value); + + } +} + +#endif \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Utils/Platform/WindowsUtils.cs.meta b/Source/Assets/TouchScript/Scripts/Utils/Platform/WindowsUtils.cs.meta new file mode 100644 index 000000000..bab1f5aa5 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Utils/Platform/WindowsUtils.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 553858766c518794ea00a0d9f11b20e0 +timeCreated: 1500666524 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From 67e867e8f9b02ea5358e150b819fcdfe3318e4ec Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sat, 22 Jul 2017 01:16:03 +0300 Subject: [PATCH 24/58] Updated DPI calculation, fixed cursors. --- .../Devices/Display/TVs/FullHD TV 42.asset | 4 +- .../Display/TVs/FullHD TV 42.asset.meta | 7 +- .../Devices/Display/TVs/FullHD TV 50.asset | 4 +- .../Display/TVs/FullHD TV 50.asset.meta | 7 +- .../Devices/Display/TVs/FullHD TV 55.asset | 4 +- .../Devices/Display/Unknown Device.asset | 4 +- .../Devices/Display/Unknown Device.asset.meta | 7 +- .../TouchScript/Editor/TouchManagerEditor.cs | 25 +- .../Behaviors/Cursors/CursorManager.cs | 2 + .../Scripts/Devices/Display/DisplayDevice.cs | 33 ++- .../Devices/Display/GenericDisplayDevice.cs | 273 ++++++++++++------ .../Scripts/Devices/Display/IDisplayDevice.cs | 12 +- .../TouchScript/Scripts/ITouchManager.cs | 2 + .../Scripts/InputSources/IInputSource.cs | 2 + .../InputHandlers/MouseHandler.cs | 6 + .../InputHandlers/TouchHandler.cs | 3 + .../InputHandlers/WindowsPointerHandlers.cs | 14 +- .../Scripts/InputSources/InputSource.cs | 3 + .../Scripts/InputSources/StandardInput.cs | 11 + .../Scripts/TouchManagerInstance.cs | 93 +++--- 20 files changed, 370 insertions(+), 146 deletions(-) diff --git a/Source/Assets/TouchScript/Devices/Display/TVs/FullHD TV 42.asset b/Source/Assets/TouchScript/Devices/Display/TVs/FullHD TV 42.asset index 501628013..cc53ace5a 100644 --- a/Source/Assets/TouchScript/Devices/Display/TVs/FullHD TV 42.asset +++ b/Source/Assets/TouchScript/Devices/Display/TVs/FullHD TV 42.asset @@ -8,8 +8,10 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 927472823, guid: 20c2a163775f09b4cafa29b19d0c9204, type: 3} + m_Script: {fileID: 11500000, guid: 3bb766ec5aebe4332b86a7b9b50eb01d, type: 3} m_Name: FullHD TV 42 m_EditorClassIdentifier: name: FullHD TV 42 dpi: 52 + nativeDPI: 52 + nativeResolution: {x: 1920, y: 1080} diff --git a/Source/Assets/TouchScript/Devices/Display/TVs/FullHD TV 42.asset.meta b/Source/Assets/TouchScript/Devices/Display/TVs/FullHD TV 42.asset.meta index 24e043f37..b006cddf5 100644 --- a/Source/Assets/TouchScript/Devices/Display/TVs/FullHD TV 42.asset.meta +++ b/Source/Assets/TouchScript/Devices/Display/TVs/FullHD TV 42.asset.meta @@ -1,4 +1,9 @@ fileFormatVersion: 2 -guid: 2bc291805b9384c48a7b1776bff51829 +guid: cce7a04b5eb9d024899e39e60d27db64 +timeCreated: 1500668483 +licenseType: Pro NativeFormatImporter: + mainObjectFileID: 11400000 userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Devices/Display/TVs/FullHD TV 50.asset b/Source/Assets/TouchScript/Devices/Display/TVs/FullHD TV 50.asset index fe22896ed..9ec9303da 100644 --- a/Source/Assets/TouchScript/Devices/Display/TVs/FullHD TV 50.asset +++ b/Source/Assets/TouchScript/Devices/Display/TVs/FullHD TV 50.asset @@ -8,8 +8,10 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 927472823, guid: 20c2a163775f09b4cafa29b19d0c9204, type: 3} + m_Script: {fileID: 11500000, guid: 3bb766ec5aebe4332b86a7b9b50eb01d, type: 3} m_Name: FullHD TV 50 m_EditorClassIdentifier: name: FullHD TV 50 dpi: 44 + nativeDPI: 44 + nativeResolution: {x: 1920, y: 1080} diff --git a/Source/Assets/TouchScript/Devices/Display/TVs/FullHD TV 50.asset.meta b/Source/Assets/TouchScript/Devices/Display/TVs/FullHD TV 50.asset.meta index 02556d447..fd9eaaf68 100644 --- a/Source/Assets/TouchScript/Devices/Display/TVs/FullHD TV 50.asset.meta +++ b/Source/Assets/TouchScript/Devices/Display/TVs/FullHD TV 50.asset.meta @@ -1,4 +1,9 @@ fileFormatVersion: 2 -guid: 04c17a8fa37b750408c1aaa5a0fb31af +guid: ee9d224e766697b43a3bbc68ff230c15 +timeCreated: 1500668483 +licenseType: Pro NativeFormatImporter: + mainObjectFileID: 11400000 userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Devices/Display/TVs/FullHD TV 55.asset b/Source/Assets/TouchScript/Devices/Display/TVs/FullHD TV 55.asset index 2a71f411e..bc9b0012f 100644 --- a/Source/Assets/TouchScript/Devices/Display/TVs/FullHD TV 55.asset +++ b/Source/Assets/TouchScript/Devices/Display/TVs/FullHD TV 55.asset @@ -8,8 +8,10 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 927472823, guid: 20c2a163775f09b4cafa29b19d0c9204, type: 3} + m_Script: {fileID: 11500000, guid: 3bb766ec5aebe4332b86a7b9b50eb01d, type: 3} m_Name: FullHD TV 55 m_EditorClassIdentifier: name: FullHD TV 55 dpi: 40 + nativeDPI: 40 + nativeResolution: {x: 1920, y: 1080} diff --git a/Source/Assets/TouchScript/Devices/Display/Unknown Device.asset b/Source/Assets/TouchScript/Devices/Display/Unknown Device.asset index 9e67fcbae..0dc3fff25 100644 --- a/Source/Assets/TouchScript/Devices/Display/Unknown Device.asset +++ b/Source/Assets/TouchScript/Devices/Display/Unknown Device.asset @@ -8,8 +8,10 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 927472823, guid: 20c2a163775f09b4cafa29b19d0c9204, type: 3} + m_Script: {fileID: 11500000, guid: 3bb766ec5aebe4332b86a7b9b50eb01d, type: 3} m_Name: Unknown Device m_EditorClassIdentifier: name: Unknown Device dpi: 96 + nativeDPI: 96 + nativeResolution: {x: 1920, y: 1080} diff --git a/Source/Assets/TouchScript/Devices/Display/Unknown Device.asset.meta b/Source/Assets/TouchScript/Devices/Display/Unknown Device.asset.meta index 0a5e73264..899c0af80 100644 --- a/Source/Assets/TouchScript/Devices/Display/Unknown Device.asset.meta +++ b/Source/Assets/TouchScript/Devices/Display/Unknown Device.asset.meta @@ -1,4 +1,9 @@ fileFormatVersion: 2 -guid: e47dcd113beb42843965ea5aa86272dc +guid: 1d1252c9bfc58b44293c994720c07f5e +timeCreated: 1500668483 +licenseType: Pro NativeFormatImporter: + mainObjectFileID: 11400000 userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs b/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs index c62f60271..e620a4478 100644 --- a/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs +++ b/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs @@ -173,22 +173,19 @@ public override void OnInspectorGUI() private void drawAdvanced() { - if (debugMode != null) + var r = EditorGUILayout.GetControlRect(true, 16f, EditorStyles.objectField); + var label = EditorGUI.BeginProperty(r, TEXT_DISPLAY_DEVICE, displayDevice); + EditorGUI.BeginChangeCheck(); + r = EditorGUI.PrefixLabel(r, label); + var newDevice = EditorGUI.ObjectField(r, instance.DisplayDevice as Object, typeof(IDisplayDevice), true) as IDisplayDevice; + if (EditorGUI.EndChangeCheck()) { - var r = EditorGUILayout.GetControlRect(true, 16f, EditorStyles.objectField); - var label = EditorGUI.BeginProperty(r, TEXT_DISPLAY_DEVICE, displayDevice); - EditorGUI.BeginChangeCheck(); - r = EditorGUI.PrefixLabel(r, label); - var newDevice = EditorGUI.ObjectField(r, instance.DisplayDevice as Object, typeof(IDisplayDevice), true) as IDisplayDevice; - if (EditorGUI.EndChangeCheck()) - { - instance.DisplayDevice = newDevice; - EditorUtility.SetDirty(instance); - } - EditorGUI.EndProperty(); - - drawDebug(); + instance.DisplayDevice = newDevice; + EditorUtility.SetDirty(instance); } + EditorGUI.EndProperty(); + + drawDebug(); } private void drawDebug() diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs index f0ab826af..7a5895067 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs @@ -207,6 +207,8 @@ private void updateCursorSize() private void pointersAddedHandler(object sender, PointerEventArgs e) { + updateCursorSize(); + var count = e.Pointers.Count; for (var i = 0; i < count; i++) { diff --git a/Source/Assets/TouchScript/Scripts/Devices/Display/DisplayDevice.cs b/Source/Assets/TouchScript/Scripts/Devices/Display/DisplayDevice.cs index 8958d8468..9639ee0da 100644 --- a/Source/Assets/TouchScript/Scripts/Devices/Display/DisplayDevice.cs +++ b/Source/Assets/TouchScript/Scripts/Devices/Display/DisplayDevice.cs @@ -2,6 +2,9 @@ * @author Valentin Simonov / http://va.lent.in/ */ + #if UNITY_EDITOR +using UnityEditor; +#endif using UnityEngine; namespace TouchScript.Devices.Display @@ -11,6 +14,17 @@ namespace TouchScript.Devices.Display /// public class DisplayDevice : ScriptableObject, IDisplayDevice { + +#if UNITY_EDITOR + [MenuItem("Window/TouchScript/CreateDisplayDevice")] + private static DisplayDevice CreateDisplayDevice() + { + var dd = CreateInstance(); + AssetDatabase.CreateAsset(dd,"Assets/DisplayDevice.asset"); + return dd; + } +#endif + /// public string Name { @@ -26,7 +40,16 @@ public string Name public virtual float DPI { get { return dpi; } - set { dpi = value; } + } + + public virtual float NativeDPI + { + get { return nativeDPI; } + } + + public virtual Vector2 NativeResolution + { + get { return nativeResolution; } } /// @@ -41,6 +64,14 @@ public virtual float DPI [SerializeField] protected float dpi = 96; + [SerializeField] + protected float nativeDPI = 96; + + [SerializeField] + protected Vector2 nativeResolution = new Vector2(1920, 1080); + + public virtual void UpdateDPI() {} + /// /// OnEnable Unity method. /// diff --git a/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs b/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs index 091138dd1..08e8fca0a 100644 --- a/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs +++ b/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs @@ -1,8 +1,9 @@ -/* +/* * @author Valentin Simonov / http://va.lent.in/ */ using System.Text.RegularExpressions; +using TouchScript.Utils.Platform; using UnityEngine; namespace TouchScript.Devices.Display @@ -12,13 +13,13 @@ namespace TouchScript.Devices.Display /// public class GenericDisplayDevice : DisplayDevice { - internal static bool INTERNAL_IsLaptop + private static bool IsLaptop { get { if (isLaptop == null) { - var gpuName = SystemInfo.graphicsDeviceName.ToLower(); + var gpuName = SystemInfo.graphicsDeviceName.ToLower(); var regex = new Regex(@"^(.*mobile.*|intel hd graphics.*|.*m\s*(series)?\s*(opengl engine)?)$", RegexOptions.IgnoreCase); if (regex.IsMatch(gpuName)) isLaptop = true; else isLaptop = false; @@ -28,6 +29,21 @@ internal static bool INTERNAL_IsLaptop } private static bool? isLaptop = null; + private int oldWidth, oldHeight; + private bool oldFullscreen; + + public override void UpdateDPI() + { + if (Screen.fullScreen) + { + var res = Screen.currentResolution; + dpi = Mathf.Max(res.width / nativeResolution.x, res.height / nativeResolution.y) * nativeDPI; + } + else + { + dpi = nativeDPI; + } + } /// protected override void OnEnable() @@ -35,97 +51,192 @@ protected override void OnEnable() base.OnEnable(); Name = Application.platform.ToString(); - if (INTERNAL_IsLaptop) Name += " (Laptop)"; + if (IsLaptop) Name += " (Laptop)"; + + updateNativeResulotion(); + updateNativeDPI(); + UpdateDPI(); - dpi = Screen.dpi; - if (dpi < float.Epsilon) + Debug.LogFormat("{0}x{1} {2}x{3}", Screen.width, Screen.height, Screen.currentResolution.width, Screen.currentResolution.height); + Debug.LogFormat("Device Model: {0}, Device Name: {1}, GPU: {2}", SystemInfo.deviceModel, SystemInfo.deviceName, SystemInfo.graphicsDeviceName); + } + + private void updateNativeResulotion() + { + switch (Application.platform) { - // Calculations based on http://en.wikipedia.org/wiki/List_of_displays_by_pixel_density and probability - switch (Application.platform) - { - case RuntimePlatform.OSXEditor: - case RuntimePlatform.OSXDashboardPlayer: - case RuntimePlatform.OSXPlayer: - case RuntimePlatform.WindowsEditor: - case RuntimePlatform.WindowsPlayer: - case RuntimePlatform.LinuxPlayer: - { - var width = Mathf.Max(Screen.currentResolution.width, Screen.currentResolution.height); - var height = Mathf.Min(Screen.currentResolution.width, Screen.currentResolution.height); + // Editors / windowed + case RuntimePlatform.LinuxEditor: + case RuntimePlatform.OSXEditor: + case RuntimePlatform.WindowsEditor: + // This has not been tested and is probably wrong. + if (getHighestResolution(out nativeResolution)) break; + var res = Screen.currentResolution; + nativeResolution = new Vector2(res.width, res.height); + break; + // Mobiles / fullscreen + case RuntimePlatform.Android: + case RuntimePlatform.IPhonePlayer: + case RuntimePlatform.TizenPlayer: + case RuntimePlatform.WSAPlayerARM: + case RuntimePlatform.WSAPlayerX64: + case RuntimePlatform.WSAPlayerX86: + // This has not been tested and is probably wrong. + if (getHighestResolution(out nativeResolution)) break; + res = Screen.currentResolution; + nativeResolution = new Vector2(res.width, res.height); + break; + // PCs + case RuntimePlatform.WindowsPlayer: +#if UNITY_STANDALONE_WIN + int width, height; + WindowsUtils.GetNativeMonitorResolution(out width, out height); + nativeResolution = new Vector2(width, height); +#endif + break; + case RuntimePlatform.LinuxPlayer: + case RuntimePlatform.OSXPlayer: + case RuntimePlatform.WebGLPlayer: + // This has not been tested and is probably wrong. + if (getHighestResolution(out nativeResolution)) break; + res = Screen.currentResolution; + nativeResolution = new Vector2(res.width, res.height); + break; + // Probably TVs + case RuntimePlatform.SamsungTVPlayer: + case RuntimePlatform.Switch: + case RuntimePlatform.WiiU: + case RuntimePlatform.XboxOne: + case RuntimePlatform.tvOS: + // This has not been tested and is probably wrong. + if (getHighestResolution(out nativeResolution)) break; + res = Screen.currentResolution; + nativeResolution = new Vector2(res.width, res.height); + break; + case RuntimePlatform.PSP2: + nativeResolution = new Vector2(960, 544); + break; + default: + // This has not been tested and is probably wrong. + if (getHighestResolution(out nativeResolution)) break; + res = Screen.currentResolution; + nativeResolution = new Vector2(res.width, res.height); + break; + } + } - if (width >= 3840) - { - if (height <= 2160) dpi = 150; // 28-31" - else dpi = 200; - } - else if (width >= 2880 && height == 1800) dpi = 220; // 15" retina - else if (width >= 2560) - { - if (height >= 1600) - { - if (INTERNAL_IsLaptop) dpi = 226; // 13.3" retina - else dpi = 101; // 30" display - } - else if (height >= 1440) dpi = 109; // 27" iMac - } - else if (width >= 2048) - { - if (height <= 1152) dpi = 100; // 23-27" - else dpi = 171; // 15" laptop - } - else if (width >= 1920) - { - if (height >= 1440) dpi = 110; // 24" - else if (height >= 1200) dpi = 90; // 26-27" - else if (height >= 1080) - { - if (INTERNAL_IsLaptop) dpi = 130; // 15" - 18" laptop - else dpi = 92; // +-24" display - } - } - else if (width >= 1680) dpi = 129; // 15" laptop - else if (width >= 1600) dpi = 140; // 13" laptop - else if (width >= 1440) + private void updateNativeDPI() + { + nativeDPI = Screen.dpi; + if (nativeDPI > float.Epsilon) return; + + var res = Screen.currentResolution; + var width = Mathf.Max(res.width, res.height); + var height = Mathf.Min(res.width, res.height); + + switch (Application.platform) + { + // Editors / windowed + case RuntimePlatform.LinuxEditor: + case RuntimePlatform.OSXEditor: + case RuntimePlatform.WindowsEditor: + // PCs + case RuntimePlatform.WindowsPlayer: + case RuntimePlatform.LinuxPlayer: + case RuntimePlatform.OSXPlayer: + case RuntimePlatform.WebGLPlayer: + // This has not been tested and is probably wrong. + // Let's guess + if (width >= 3840) + { + if (height <= 2160) dpi = 150; // 28-31" + else dpi = 200; + } + else if (width >= 2880 && height == 1800) dpi = 220; // 15" retina + else if (width >= 2560) + { + if (height >= 1600) { - if (height >= 1050) dpi = 125; // 14" laptop - else dpi = 110; // 13" air or 15" macbook pro + if (IsLaptop) dpi = 226; // 13.3" retina + else dpi = 101; // 30" display } - else if (width >= 1366) dpi = 125; // 10"-14" laptops - else if (width >= 1280) dpi = 110; - else dpi = 96; - break; + else if (height >= 1440) dpi = 109; // 27" iMac } - case RuntimePlatform.Android: + else if (width >= 2048) { - var width = Mathf.Max(Screen.currentResolution.width, Screen.currentResolution.height); - var height = Mathf.Min(Screen.currentResolution.width, Screen.currentResolution.height); - if (width >= 1280) + if (height <= 1152) dpi = 100; // 23-27" + else dpi = 171; // 15" laptop + } + else if (width >= 1920) + { + if (height >= 1440) dpi = 110; // 24" + else if (height >= 1200) dpi = 90; // 26-27" + else if (height >= 1080) { - if (height >= 800) dpi = 285; //Galaxy Note - else dpi = 312; //Galaxy S3, Xperia S + if (IsLaptop) dpi = 130; // 15" - 18" laptop + else dpi = 92; // +-24" display } - else if (width >= 1024) dpi = 171; // Galaxy Tab - else if (width >= 960) dpi = 256; // Sensation - else if (width >= 800) dpi = 240; // Galaxy S2... - else dpi = 160; - break; } - case RuntimePlatform.IPhonePlayer: + else if (width >= 1680) dpi = 129; // 15" laptop + else if (width >= 1600) dpi = 140; // 13" laptop + else if (width >= 1440) { - var width = Mathf.Max(Screen.currentResolution.width, Screen.currentResolution.height); -// var height = Mathf.Min(Screen.currentResolution.width, Screen.currentResolution.height); - if (width >= 2048) dpi = 290; // iPad4 or ipad2 mini - else if (width >= 1136) dpi = 326; // iPhone 5+ - else if (width >= 1024) dpi = 160; // iPad mini1 - else if (width >= 960) dpi = 326; // iPhone 4+ - else dpi = 160; - break; + if (height >= 1050) dpi = 125; // 14" laptop + else dpi = 110; // 13" air or 15" macbook pro } - default: - dpi = 160; - break; - } + else if (width >= 1366) dpi = 125; // 10"-14" laptops + else if (width >= 1280) dpi = 110; + else dpi = 96; + break; + // Mobiles / fullscreen + case RuntimePlatform.Android: + case RuntimePlatform.IPhonePlayer: + case RuntimePlatform.TizenPlayer: + case RuntimePlatform.WSAPlayerARM: + case RuntimePlatform.WSAPlayerX64: + case RuntimePlatform.WSAPlayerX86: + // We just hope that mobiles report their DPI correctly + break; + // Probably TVs + case RuntimePlatform.SamsungTVPlayer: + case RuntimePlatform.Switch: + case RuntimePlatform.WiiU: + case RuntimePlatform.XboxOne: + case RuntimePlatform.tvOS: + // This has not been tested and is probably wrong. + if (width >= 3840) + { + nativeDPI = 96; + } else if (width >= 1920) + { + nativeDPI = 50; + } + else + { + nativeDPI = 40; + } + break; + case RuntimePlatform.PSP2: + nativeDPI = 220.68f; + break; + default: + // This has not been tested and is probably wrong. + nativeDPI = 160; + break; } } + + private bool getHighestResolution(out Vector2 resolution) + { + resolution = new Vector2(); + + var resolutions = Screen.resolutions; + if (resolutions.Length == 0) return false; + + var r = resolutions[resolutions.Length - 1]; + resolution = new Vector2(r.width, r.height); + return true; + } + } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Devices/Display/IDisplayDevice.cs b/Source/Assets/TouchScript/Scripts/Devices/Display/IDisplayDevice.cs index 21e3e3c78..12df87100 100644 --- a/Source/Assets/TouchScript/Scripts/Devices/Display/IDisplayDevice.cs +++ b/Source/Assets/TouchScript/Scripts/Devices/Display/IDisplayDevice.cs @@ -2,6 +2,8 @@ * @author Valentin Simonov / http://va.lent.in/ */ +using UnityEngine; + namespace TouchScript.Devices.Display { /// @@ -17,12 +19,18 @@ public interface IDisplayDevice /// Gets or sets the name of display device. /// /// The name of display device. - string Name { get; set; } + string Name { get; } /// /// Gets or sets DPI of display device. /// /// DPI used by display device. - float DPI { get; set; } + float DPI { get; } + + float NativeDPI { get; } + + Vector2 NativeResolution { get; } + + void UpdateDPI(); } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/ITouchManager.cs b/Source/Assets/TouchScript/Scripts/ITouchManager.cs index c7c8b567b..fc116e4d3 100644 --- a/Source/Assets/TouchScript/Scripts/ITouchManager.cs +++ b/Source/Assets/TouchScript/Scripts/ITouchManager.cs @@ -197,6 +197,8 @@ public interface ITouchManager /// /// Pointer id to cancel. void CancelPointer(int id); + + void UpdateResolution(); } /// diff --git a/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs b/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs index 4034b61f7..eee16bfe7 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs @@ -27,6 +27,8 @@ public interface IInputSource : INTERNAL_IInputSource /// bool UpdateInput(); + void UpdateResolution(); + /// /// Cancels the pointer. /// diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs index c474a0442..90dfbf11f 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs @@ -234,6 +234,12 @@ public bool UpdateInput() return updated; } + /// + public void UpdateResolution() + { + TouchManager.Instance.CancelPointer(mousePointer.Id); + } + /// public bool CancelPointer(Pointer pointer, bool shouldReturn) { diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs index 4012497ae..8cb6cd85e 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs @@ -151,6 +151,9 @@ public bool UpdateInput() return Input.touchCount > 0; } + /// + public void UpdateResolution() { } + /// public bool CancelPointer(Pointer pointer, bool shouldReturn) { diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs index 28f6642df..d7d621c5f 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs @@ -200,8 +200,6 @@ public abstract class WindowsPointerHandler : IInputSource, IDisposable protected MousePointer mousePointer; protected PenPointer penPointer; - private int screenWidth, screenHeight; - #endregion #region Constructor @@ -241,10 +239,16 @@ public WindowsPointerHandler(PointerDelegate addPointer, PointerDelegate updateP /// public virtual bool UpdateInput() { - if (Screen.width != screenWidth || Screen.height != screenHeight) setScaling(); return false; } + /// + public virtual void UpdateResolution() + { + setScaling(); + TouchManager.Instance.CancelPointer(mousePointer.Id); + } + /// public virtual bool CancelPointer(Pointer pointer, bool shouldReturn) { @@ -422,8 +426,8 @@ private void enablePressAndHold() private void setScaling() { - screenWidth = Screen.width; - screenHeight = Screen.height; + var screenWidth = Screen.width; + var screenHeight = Screen.height; if (!Screen.fullScreen) { diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs index 71212dc86..78962db9e 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs @@ -56,6 +56,9 @@ public virtual bool UpdateInput() return false; } + /// + public virtual void UpdateResolution() {} + /// public virtual bool CancelPointer(Pointer pointer, bool shouldReturn) { diff --git a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs index 2f65f1022..6ff47c055 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs @@ -223,6 +223,17 @@ public override bool UpdateInput() return handled; } + /// + public override void UpdateResolution() + { +#if UNITY_STANDALONE_WIN && !UNITY_EDITOR + if (windows8PointerHandler != null) windows8PointerHandler.UpdateResolution(); + else if (windows7PointerHandler != null) windows7PointerHandler.UpdateResolution(); +#endif + if (touchHandler != null) touchHandler.UpdateResolution(); + if (mouseHandler != null) mouseHandler.UpdateResolution(); + } + /// public override bool CancelPointer(Pointer pointer, bool shouldReturn) { diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs index 54f6c588a..e9b6aa55b 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs @@ -141,7 +141,7 @@ public IDisplayDevice DisplayDevice { displayDevice = value; } - updateDPI(); + UpdateResolution(); } } @@ -351,6 +351,25 @@ public void CancelPointer(int id) CancelPointer(id, false); } + public void UpdateResolution() + { + if (DisplayDevice != null) + { + DisplayDevice.UpdateDPI(); + dpi = DisplayDevice.DPI; + } + else + { + dpi = 96; + } + dotsPerCentimeter = TouchManager.CM_TO_INCH * dpi; +#if TOUCHSCRIPT_DEBUG + debugPointerSize = Vector2.one * dotsPerCentimeter; +#endif + + foreach (var input in inputs) input.UpdateResolution(); + } + #endregion #region Internal methods @@ -386,7 +405,7 @@ internal void INTERNAL_AddPointer(Pointer pointer) #if TOUCHSCRIPT_DEBUG pLogger.Log(pointer, PointerEvent.IDAllocated); - if (DebugMode) Debug.Log("TouchScript > Pointer Added: " + pointer); + if (DebugMode) Debug.Log("TouchScript > Pointer Added: " + pointer); #endif nextPointerId++; @@ -433,16 +452,18 @@ internal void INTERNAL_PressPointer(int id) if (pointer == null) { #if TOUCHSCRIPT_DEBUG - if (DebugMode) Debug.LogWarning("TouchScript > Pointer with id [" + id + - "] is requested to PRESS but no pointer with such id found."); + if (DebugMode) + Debug.LogWarning("TouchScript > Pointer with id [" + id + + "] is requested to PRESS but no pointer with such id found."); #endif return; } } #if TOUCHSCRIPT_DEBUG if (!pointersPressed.Add(id)) - if (DebugMode) Debug.LogWarning("TouchScript > Pointer with id [" + id + - "] is requested to PRESS more than once this frame."); + if (DebugMode) + Debug.LogWarning("TouchScript > Pointer with id [" + id + + "] is requested to PRESS more than once this frame."); #else pointersPressed.Add(id); #endif @@ -467,16 +488,18 @@ internal void INTERNAL_ReleasePointer(int id) if (pointer == null) { #if TOUCHSCRIPT_DEBUG - if (DebugMode) Debug.LogWarning("TouchScript > Pointer with id [" + id + - "] is requested to END but no pointer with such id found."); + if (DebugMode) + Debug.LogWarning("TouchScript > Pointer with id [" + id + + "] is requested to END but no pointer with such id found."); #endif return; } } #if TOUCHSCRIPT_DEBUG if (!pointersReleased.Add(id)) - if (DebugMode) Debug.LogWarning("TouchScript > Pointer with id [" + id + - "] is requested to END more than once this frame."); + if (DebugMode) + Debug.LogWarning("TouchScript > Pointer with id [" + id + + "] is requested to END more than once this frame."); #else pointersReleased.Add(id); #endif @@ -501,16 +524,18 @@ internal void INTERNAL_RemovePointer(int id) if (pointer == null) { #if TOUCHSCRIPT_DEBUG - if (DebugMode) Debug.LogWarning("TouchScript > Pointer with id [" + id + - "] is requested to REMOVE but no pointer with such id found."); + if (DebugMode) + Debug.LogWarning("TouchScript > Pointer with id [" + id + + "] is requested to REMOVE but no pointer with such id found."); #endif return; } } #if TOUCHSCRIPT_DEBUG if (!pointersRemoved.Add(pointer.Id)) - if (DebugMode) Debug.LogWarning("TouchScript > Pointer with id [" + id + - "] is requested to REMOVE more than once this frame."); + if (DebugMode) + Debug.LogWarning("TouchScript > Pointer with id [" + id + + "] is requested to REMOVE more than once this frame."); #else pointersRemoved.Add(pointer.Id); #endif @@ -535,16 +560,18 @@ internal void INTERNAL_CancelPointer(int id) if (pointer == null) { #if TOUCHSCRIPT_DEBUG - if (DebugMode) Debug.LogWarning("TouchScript > Pointer with id [" + id + - "] is requested to CANCEL but no pointer with such id found."); + if (DebugMode) + Debug.LogWarning("TouchScript > Pointer with id [" + id + + "] is requested to CANCEL but no pointer with such id found."); #endif return; } } #if TOUCHSCRIPT_DEBUG if (!pointersCancelled.Add(pointer.Id)) - if (DebugMode) Debug.LogWarning("TouchScript > Pointer with id [" + id + - "] is requested to CANCEL more than once this frame."); + if (DebugMode) + Debug.LogWarning("TouchScript > Pointer with id [" + id + + "] is requested to CANCEL more than once this frame."); #else pointersCancelled.Add(pointer.Id); #endif @@ -582,7 +609,7 @@ private void Awake() gameObject.hideFlags = HideFlags.HideInHierarchy; DontDestroyOnLoad(gameObject); - updateDPI(); + UpdateResolution(); StopAllCoroutines(); StartCoroutine(lateAwake()); @@ -638,15 +665,6 @@ private void OnApplicationQuit() #region Private functions - private void updateDPI() - { - dpi = DisplayDevice == null ? 96 : DisplayDevice.DPI; - dotsPerCentimeter = TouchManager.CM_TO_INCH * dpi; -#if TOUCHSCRIPT_DEBUG - debugPointerSize = Vector2.one*dotsPerCentimeter; -#endif - } - private void updateLayers() { // filter empty layers @@ -740,8 +758,9 @@ private void updateUpdated(List pointers) if (!idToPointer.TryGetValue(id, out pointer)) { #if TOUCHSCRIPT_DEBUG - if (DebugMode) Debug.LogWarning("TouchScript > Id [" + id + - "] was in UPDATED list but no pointer with such id found."); + if (DebugMode) + Debug.LogWarning("TouchScript > Id [" + id + + "] was in UPDATED list but no pointer with such id found."); #endif continue; } @@ -784,8 +803,9 @@ private void updatePressed(List pointers) if (!idToPointer.TryGetValue(id, out pointer)) { #if TOUCHSCRIPT_DEBUG - if (DebugMode) Debug.LogWarning("TouchScript > Id [" + id + - "] was in PRESSED list but no pointer with such id found."); + if (DebugMode) + Debug.LogWarning("TouchScript > Id [" + id + + "] was in PRESSED list but no pointer with such id found."); #endif continue; } @@ -800,11 +820,11 @@ private void updatePressed(List pointers) } #if TOUCHSCRIPT_DEBUG - pLogger.Log(pointer, PointerEvent.Pressed); + pLogger.Log(pointer, PointerEvent.Pressed); #endif #if TOUCHSCRIPT_DEBUG - if (DebugMode) addDebugFigureForPointer(pointer); + if (DebugMode) addDebugFigureForPointer(pointer); #endif } @@ -914,8 +934,9 @@ private void updateCancelled(List pointers) if (!idToPointer.TryGetValue(id, out pointer)) { #if TOUCHSCRIPT_DEBUG - if (DebugMode) Debug.LogWarning("TouchScript > Id [" + id + - "] was in CANCELLED list but no pointer with such id found."); + if (DebugMode) + Debug.LogWarning("TouchScript > Id [" + id + + "] was in CANCELLED list but no pointer with such id found."); #endif continue; } From 07031dd970f9842d95ca3ff1c7daf2f71b1bbfcd Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 23 Jul 2017 00:06:02 +0300 Subject: [PATCH 25/58] Moved layer manager functionality into LayerManager class. --- .../TouchScript/Editor/TouchManagerEditor.cs | 8 +- .../Examples/_misc/Scripts/Runner.cs | 75 +++---- .../Devices/Display/GenericDisplayDevice.cs | 3 - .../TouchScript/Scripts/GestureManager.cs | 2 +- .../TouchScript/Scripts/Gestures/Gesture.cs | 2 +- .../TouchScript/Scripts/ILayerManager.cs | 53 +++++ .../TouchScript/Scripts/ILayerManager.cs.meta | 12 ++ .../TouchScript/Scripts/ITouchManager.cs | 32 --- .../TouchScript/Scripts/LayerManager.cs | 16 ++ .../TouchScript/Scripts/LayerManager.cs.meta | 12 ++ .../Scripts/LayerManagerInstance.cs | 185 ++++++++++++++++++ .../Scripts/LayerManagerInstance.cs.meta | 12 ++ .../TouchScript/Scripts/Layers/TouchLayer.cs | 4 +- .../Scripts/Pointers/FakePointer.cs | 2 +- .../TouchScript/Scripts/Pointers/Pointer.cs | 6 +- .../TouchScript/Scripts/TouchManager.cs | 3 +- .../Scripts/TouchManagerInstance.cs | 169 +++++----------- 17 files changed, 391 insertions(+), 205 deletions(-) create mode 100644 Source/Assets/TouchScript/Scripts/ILayerManager.cs create mode 100644 Source/Assets/TouchScript/Scripts/ILayerManager.cs.meta create mode 100644 Source/Assets/TouchScript/Scripts/LayerManager.cs create mode 100644 Source/Assets/TouchScript/Scripts/LayerManager.cs.meta create mode 100644 Source/Assets/TouchScript/Scripts/LayerManagerInstance.cs create mode 100644 Source/Assets/TouchScript/Scripts/LayerManagerInstance.cs.meta diff --git a/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs b/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs index e620a4478..b9ab847cf 100644 --- a/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs +++ b/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs @@ -200,13 +200,13 @@ private void refresh() { if (Application.isPlaying) { - var l = TouchManager.Instance.Layers; layers.arraySize = 0; - for (var i = 0; i < l.Count; i++) + LayerManager.Instance.ForEach((l) => { layers.arraySize++; - layers.GetArrayElementAtIndex(layers.arraySize - 1).objectReferenceValue = l[i]; - } + layers.GetArrayElementAtIndex(layers.arraySize - 1).objectReferenceValue = l; + return true; + }); } else { diff --git a/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs b/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs index 304679f36..cae28f1cd 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs +++ b/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs @@ -5,14 +5,13 @@ using UnityEngine; using TouchScript.Layers; using System.Collections; - #if UNITY_EDITOR using UnityEditor; using System; #endif - #if UNITY_5_3_OR_NEWER using UnityEngine.SceneManagement; + #endif namespace TouchScript.Examples @@ -25,14 +24,14 @@ public class Runner : MonoBehaviour private static Runner instance; private TouchLayer layer; - public void LoadLevel(string name) - { + public void LoadLevel(string name) + { #if UNITY_5_3_OR_NEWER - SceneManager.LoadScene(name); + SceneManager.LoadScene(name); #else Application.LoadLevel(name); #endif - } + } public void LoadNextLevel() { @@ -43,20 +42,20 @@ public void LoadNextLevel() #endif } - public void LoadPreviousLevel() - { + public void LoadPreviousLevel() + { #if UNITY_5_3_OR_NEWER - var newLevel = SceneManager.GetActiveScene().buildIndex - 1; - if (newLevel == 0) newLevel = SceneManager.sceneCountInBuildSettings - 1; - SceneManager.LoadScene(newLevel); + var newLevel = SceneManager.GetActiveScene().buildIndex - 1; + if (newLevel == 0) newLevel = SceneManager.sceneCountInBuildSettings - 1; + SceneManager.LoadScene(newLevel); #else var newLevel = Application.loadedLevel - 1; if (newLevel == 0) newLevel = Application.levelCount - 1; Application.LoadLevel(newLevel); #endif - } + } - private void Start() + private void Start() { if (instance == null) { @@ -64,26 +63,27 @@ private void Start() DontDestroyOnLoad(gameObject); } - layer = GetComponent(); + layer = GetComponent(); #if UNITY_EDITOR - var guids = AssetDatabase.FindAssets("t:Scene", new string[]{"Assets/TouchScript/Examples"}); - if (EditorBuildSettings.scenes.Length != guids.Length) - { - if (EditorUtility.DisplayDialog("Add Example Scenes to Build Settings?", - "You are running Examples scene but example scenes are not added to Build Settings. Do you want to add them now?", "Yes", "No")) - { - var importers = Array.ConvertAll(guids, (string guid) => AssetImporter.GetAtPath(AssetDatabase.GUIDToAssetPath(guid))); - Array.Sort(importers, (AssetImporter a, AssetImporter b) => { - var i1 = string.IsNullOrEmpty(a.userData) ? 42 : Convert.ToInt32(a.userData); - var i2 = string.IsNullOrEmpty(b.userData) ? 42 : Convert.ToInt32(b.userData); - if (i1 == i2) return 0; - return i1 - i2; - }); - EditorBuildSettings.scenes = Array.ConvertAll(importers, (AssetImporter i) => new EditorBuildSettingsScene(i.assetPath, true)); - EditorUtility.DisplayDialog("Success", "Example scenes were added to Build Settings. Please restart Play Mode.", "OK"); - } - } + var guids = AssetDatabase.FindAssets("t:Scene", new string[] {"Assets/TouchScript/Examples"}); + if (EditorBuildSettings.scenes.Length != guids.Length) + { + if (EditorUtility.DisplayDialog("Add Example Scenes to Build Settings?", + "You are running Examples scene but example scenes are not added to Build Settings. Do you want to add them now?", "Yes", "No")) + { + var importers = Array.ConvertAll(guids, (string guid) => AssetImporter.GetAtPath(AssetDatabase.GUIDToAssetPath(guid))); + Array.Sort(importers, (AssetImporter a, AssetImporter b) => + { + var i1 = string.IsNullOrEmpty(a.userData) ? 42 : Convert.ToInt32(a.userData); + var i2 = string.IsNullOrEmpty(b.userData) ? 42 : Convert.ToInt32(b.userData); + if (i1 == i2) return 0; + return i1 - i2; + }); + EditorBuildSettings.scenes = Array.ConvertAll(importers, (AssetImporter i) => new EditorBuildSettingsScene(i.assetPath, true)); + EditorUtility.DisplayDialog("Success", "Example scenes were added to Build Settings. Please restart Play Mode.", "OK"); + } + } #endif #if UNITY_5_4_OR_NEWER @@ -103,14 +103,15 @@ private void Start() private void OnDestroy() { #if UNITY_5_4_OR_NEWER - SceneManager.sceneLoaded -= sceneLoadedHandler; + SceneManager.sceneLoaded -= sceneLoadedHandler; #endif - } + } private void Update() { if (Input.GetKeyDown(KeyCode.Escape)) Application.Quit(); } + #if UNITY_5_4_OR_NEWER private void sceneLoadedHandler(Scene scene, LoadSceneMode mode) { @@ -124,9 +125,9 @@ private void OnLevelWasLoaded(int num) #endif private IEnumerator resetUILayer() - { - yield return new WaitForEndOfFrame(); - TouchManager.Instance.AddLayer(layer, 0); - } + { + yield return new WaitForEndOfFrame(); + LayerManager.Instance.AddLayer(layer, 0); + } } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs b/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs index 08e8fca0a..6be0ccfe7 100644 --- a/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs +++ b/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs @@ -56,9 +56,6 @@ protected override void OnEnable() updateNativeResulotion(); updateNativeDPI(); UpdateDPI(); - - Debug.LogFormat("{0}x{1} {2}x{3}", Screen.width, Screen.height, Screen.currentResolution.width, Screen.currentResolution.height); - Debug.LogFormat("Device Model: {0}, Device Name: {1}, GPU: {2}", SystemInfo.deviceModel, SystemInfo.deviceName, SystemInfo.graphicsDeviceName); } private void updateNativeResulotion() diff --git a/Source/Assets/TouchScript/Scripts/GestureManager.cs b/Source/Assets/TouchScript/Scripts/GestureManager.cs index eb0b62747..c5f46e8f7 100644 --- a/Source/Assets/TouchScript/Scripts/GestureManager.cs +++ b/Source/Assets/TouchScript/Scripts/GestureManager.cs @@ -12,7 +12,7 @@ namespace TouchScript /// /// Why IList instead of Pointer in pointer events? /// Right now touchesBegan/touchesMoved/touchesEnded methods in Gesture class accept IList as their argument which seems to overcomplicate a lot of stuff and just calling touchBegan(TouchPoint) would be easier. - /// The later approach was tried in 7.0 and reverted in 8.0 since it introduced a really hard to fix gesture priority issue.If with lists a gesture knows all touches changed during current frame, individual touchMoved calls have to be buffered till the end of frame.But there's no way to execute gesture recognition logic at the end of frame in the right hierarchical order. This concern resulted in the following issue: https://github.com/TouchScript/TouchScript/issues/203 + /// The later approach was tried in 7.0 and reverted in 8.0 since it introduced a really hard to fix gesture priority issue. If with lists a gesture knows all touches changed during current frame, individual touchMoved calls have to be buffered till the end of frame. But there's no way to execute gesture recognition logic at the end of frame in the right hierarchical order. This concern resulted in the following issue: https://github.com/TouchScript/TouchScript/issues/203 /// /// public sealed class GestureManager : MonoBehaviour diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs index 1f331a9a3..20a830ee0 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs @@ -647,7 +647,7 @@ public virtual HitData GetScreenPositionHitData() { HitData hit; fakePointer.Position = ScreenPosition; - touchManager.INTERNAL_GetHitTarget(fakePointer, out hit); + LayerManager.Instance.GetHitTarget(fakePointer, out hit); return hit; } diff --git a/Source/Assets/TouchScript/Scripts/ILayerManager.cs b/Source/Assets/TouchScript/Scripts/ILayerManager.cs new file mode 100644 index 000000000..233da8c55 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/ILayerManager.cs @@ -0,0 +1,53 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using System; +using System.Collections.Generic; +using TouchScript.Hit; +using TouchScript.Layers; +using TouchScript.Pointers; + +namespace TouchScript +{ + public interface ILayerManager + { + /// + /// Gets the list of . + /// + /// A sorted list of currently active layers. + IList Layers { get; } + + int LayerCount { get; } + + /// + /// Adds a layer in a specific position. + /// + /// The layer to add. + /// Layer index to add the layer to or -1 to add to the end of the list. + /// if set to true move the layer to another index if it is already added; don't move otherwise. + /// + /// True if the layer was added. + /// + bool AddLayer(TouchLayer layer, int index = -1, bool addIfExists = true); + + /// + /// Removes a layer. + /// + /// The layer to remove. + /// True if the layer was removed. + bool RemoveLayer(TouchLayer layer); + + /// + /// Swaps layers. + /// + /// Layer index 1. + /// Layer index 2. + void ChangeLayerIndex(int at, int to); + + void ForEach(Func action); + + bool GetHitTarget(IPointer pointer, out HitData hit); + + } +} diff --git a/Source/Assets/TouchScript/Scripts/ILayerManager.cs.meta b/Source/Assets/TouchScript/Scripts/ILayerManager.cs.meta new file mode 100644 index 000000000..c13ed3987 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/ILayerManager.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2be5f17d5476d2e4a98d02449616ff1e +timeCreated: 1500755913 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/ITouchManager.cs b/Source/Assets/TouchScript/Scripts/ITouchManager.cs index fc116e4d3..1696f1190 100644 --- a/Source/Assets/TouchScript/Scripts/ITouchManager.cs +++ b/Source/Assets/TouchScript/Scripts/ITouchManager.cs @@ -6,7 +6,6 @@ using System.Collections.Generic; using TouchScript.Devices.Display; using TouchScript.InputSources; -using TouchScript.Layers; using TouchScript.Pointers; namespace TouchScript @@ -107,12 +106,6 @@ public interface ITouchManager /// This is usually a desired behavior but sometimes you would want to turn this off. bool ShouldCreateStandardInput { get; set; } - /// - /// Gets the list of . - /// - /// A sorted list of currently active layers. - IList Layers { get; } - /// /// Gets the list of /// @@ -146,31 +139,6 @@ public interface ITouchManager /// An unsorted list of all pointers which were pressed but not released yet. IList PressedPointers { get; } - /// - /// Adds a layer in a specific position. - /// - /// The layer to add. - /// Layer index to add the layer to or -1 to add to the end of the list. - /// if set to true move the layer to another index if it is already added; don't move otherwise. - /// - /// True if the layer was added. - /// - bool AddLayer(TouchLayer layer, int index = -1, bool addIfExists = true); - - /// - /// Removes a layer. - /// - /// The layer to remove. - /// True if the layer was removed. - bool RemoveLayer(TouchLayer layer); - - /// - /// Swaps layers. - /// - /// Layer index 1. - /// Layer index 2. - void ChangeLayerIndex(int at, int to); - /// /// Adds an input source. /// diff --git a/Source/Assets/TouchScript/Scripts/LayerManager.cs b/Source/Assets/TouchScript/Scripts/LayerManager.cs new file mode 100644 index 000000000..83c7f2528 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/LayerManager.cs @@ -0,0 +1,16 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using UnityEngine; + +namespace TouchScript +{ + public sealed class LayerManager : MonoBehaviour + { + public static ILayerManager Instance + { + get { return LayerManagerInstance.Instance; } + } + } +} diff --git a/Source/Assets/TouchScript/Scripts/LayerManager.cs.meta b/Source/Assets/TouchScript/Scripts/LayerManager.cs.meta new file mode 100644 index 000000000..fd683f038 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/LayerManager.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3e8fcbff26c96d94ab9865ea8a8607d4 +timeCreated: 1500755913 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/LayerManagerInstance.cs b/Source/Assets/TouchScript/Scripts/LayerManagerInstance.cs new file mode 100644 index 000000000..19015d66d --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/LayerManagerInstance.cs @@ -0,0 +1,185 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using System; +using System.Collections.Generic; +using TouchScript.Hit; +using TouchScript.Layers; +using TouchScript.Pointers; +using UnityEngine; + +namespace TouchScript +{ + internal sealed class LayerManagerInstance : MonoBehaviour, ILayerManager + { + #region Public properties + + public static ILayerManager Instance + { + get + { + if (shuttingDown) return null; + if (instance == null) + { + if (!Application.isPlaying) return null; + var objects = FindObjectsOfType(); + if (objects.Length == 0) + { + var go = new GameObject("GestureManager Instance"); + instance = go.AddComponent(); + } + else if (objects.Length >= 1) + { + instance = objects[0]; + } + } + return instance; + } + } + + /// + public IList Layers + { + get { return new List(layers); } + } + + /// + public int LayerCount + { + get { return layerCount; } + } + + #endregion + + #region Private variables + + private static LayerManagerInstance instance; + private static bool shuttingDown = false; + + private List layers = new List(10); + private int layerCount = 0; + + #endregion + + #region Public methods + + /// + public bool AddLayer(TouchLayer layer, int index = -1, bool addIfExists = true) + { + if (layer == null) return false; + + var i = layers.IndexOf(layer); + if (i != -1) + { + if (!addIfExists) return false; + layers.RemoveAt(i); + layerCount--; + } + if (index == 0) + { + layers.Insert(0, layer); + layerCount++; + return i == -1; + } + if (index == -1 || index >= layerCount) + { + layers.Add(layer); + layerCount++; + return i == -1; + } + if (i != -1) + { + if (index < i) layers.Insert(index, layer); + else layers.Insert(index - 1, layer); + layerCount++; + return false; + } + layers.Insert(index, layer); + layerCount++; + return true; + } + + /// + public bool RemoveLayer(TouchLayer layer) + { + if (layer == null) return false; + var result = layers.Remove(layer); + if (result) layerCount--; + return result; + } + + /// + public void ChangeLayerIndex(int at, int to) + { + if (at < 0 || at >= layerCount) return; + if (to < 0 || to >= layerCount) return; + var data = layers[at]; + layers.RemoveAt(at); + layers.Insert(to, data); + } + + /// + public void ForEach(Func action) + { + for (var i = 0; i < layerCount; i++) + { + if (!action(layers[i])) break; + } + } + + /// + public bool GetHitTarget(IPointer pointer, out HitData hit) + { + hit = default(HitData); + + for (var i = 0; i < layerCount; i++) + { + var touchLayer = layers[i]; + if (touchLayer == null) continue; + var result = touchLayer.Hit(pointer, out hit); + switch (result) + { + case HitResult.Hit: + return true; + case HitResult.Discard: + return false; + } + } + + return false; + } + + #endregion + + #region Unity + + private void Awake() + { + if (instance == null) + { + instance = this; + } + else if (instance != this) + { + Destroy(this); + return; + } + + gameObject.hideFlags = HideFlags.HideInHierarchy; + DontDestroyOnLoad(gameObject); + } + + private void OnApplicationQuit() + { + shuttingDown = true; + } + + #endregion + + #region Private functions + + #endregion + + } +} diff --git a/Source/Assets/TouchScript/Scripts/LayerManagerInstance.cs.meta b/Source/Assets/TouchScript/Scripts/LayerManagerInstance.cs.meta new file mode 100644 index 000000000..44da71ae4 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/LayerManagerInstance.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 61a2ae412ada86b48aa49c2ec1557dcb +timeCreated: 1500755913 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs index 36977e6e6..310a41eb0 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs @@ -129,7 +129,7 @@ private IEnumerator lateAwake() yield return null; // Add ourselves after TouchManager finished adding layers in order - TouchManager.Instance.AddLayer(this, -1, false); + LayerManager.Instance.AddLayer(this, -1, false); } // To be able to turn layers off @@ -143,7 +143,7 @@ protected virtual void OnDestroy() if (!Application.isPlaying || TouchManager.Instance == null) return; StopAllCoroutines(); - TouchManager.Instance.RemoveLayer(this); + LayerManager.Instance.RemoveLayer(this); } #endregion diff --git a/Source/Assets/TouchScript/Scripts/Pointers/FakePointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/FakePointer.cs index c145aed77..e2a9e840b 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/FakePointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/FakePointer.cs @@ -55,7 +55,7 @@ public FakePointer() public HitData GetOverData(bool forceRecalculate = false) { HitData overData; - TouchManagerInstance.Instance.INTERNAL_GetHitTarget(this, out overData); + LayerManager.Instance.GetHitTarget(this, out overData); return overData; } diff --git a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs index 81a356da0..3ec3f8a8e 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs @@ -231,7 +231,7 @@ public ProjectionParams ProjectionParams private static StringBuilder builder; - private TouchManagerInstance manager; + private LayerManagerInstance layerManager; private int refCount = 0; private Vector2 position, newPosition; private HitData pressData, overData; @@ -246,7 +246,7 @@ public HitData GetOverData(bool forceRecalculate = false) { if (overDataIsDirty || forceRecalculate) { - manager.INTERNAL_GetHitTarget(this, out overData); + layerManager.GetHitTarget(this, out overData); overDataIsDirty = false; } return overData; @@ -323,7 +323,7 @@ public override string ToString() /// public Pointer(IInputSource input) { - manager = TouchManager.Instance as TouchManagerInstance; + layerManager = LayerManager.Instance as LayerManagerInstance; Type = PointerType.Unknown; InputSource = input; INTERNAL_Reset(); diff --git a/Source/Assets/TouchScript/Scripts/TouchManager.cs b/Source/Assets/TouchScript/Scripts/TouchManager.cs index b762726d6..c90b8c57a 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManager.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManager.cs @@ -404,7 +404,8 @@ private void Awake() Instance.ShouldCreateStandardInput = ShouldCreateStandardInput; for (var i = 0; i < layers.Count; i++) { - Instance.AddLayer(layers[i], i); + var layer = layers[i]; + if (layer != null) LayerManager.Instance.AddLayer(layer, i); } } diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs index e9b6aa55b..81d1c12e4 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs @@ -19,7 +19,6 @@ #endif #if UNITY_5_4_OR_NEWER using UnityEngine.SceneManagement; - #endif namespace TouchScript @@ -165,12 +164,6 @@ public bool ShouldCreateStandardInput set { shouldCreateStandardInput = value; } } - /// - public IList Layers - { - get { return new List(layers); } - } - /// public IList Inputs { @@ -213,6 +206,7 @@ public IList PressedPointers private static bool shuttingDown = false; private static TouchManagerInstance instance; + private bool shouldCreateCameraLayer = true; private bool shouldCreateStandardInput = true; @@ -220,8 +214,8 @@ public IList PressedPointers private float dpi = 96; private float dotsPerCentimeter = TouchManager.CM_TO_INCH * 96; - private List layers = new List(10); - private int layerCount = 0; + private ILayerManager layerManager; + private List inputs = new List(3); private int inputCount = 0; @@ -248,6 +242,12 @@ public IList PressedPointers #endregion + #region Temporary variables + + private Pointer tmpPointer; + + #endregion + #region Debug #if TOUCHSCRIPT_DEBUG @@ -261,61 +261,6 @@ public IList PressedPointers #region Public methods - /// - public bool AddLayer(TouchLayer layer, int index = -1, bool addIfExists = true) - { - if (layer == null) return false; - - var i = layers.IndexOf(layer); - if (i != -1) - { - if (!addIfExists) return false; - layers.RemoveAt(i); - layerCount--; - } - if (index == 0) - { - layers.Insert(0, layer); - layerCount++; - return i == -1; - } - if (index == -1 || index >= layerCount) - { - layers.Add(layer); - layerCount++; - return i == -1; - } - if (i != -1) - { - if (index < i) layers.Insert(index, layer); - else layers.Insert(index - 1, layer); - layerCount++; - return false; - } - layers.Insert(index, layer); - layerCount++; - return true; - } - - /// - public bool RemoveLayer(TouchLayer layer) - { - if (layer == null) return false; - var result = layers.Remove(layer); - if (result) layerCount--; - return result; - } - - /// - public void ChangeLayerIndex(int at, int to) - { - if (at < 0 || at >= layerCount) return; - if (to < 0 || to >= layerCount) return; - var data = layers[at]; - layers.RemoveAt(at); - layers.Insert(to, data); - } - /// public bool AddInput(IInputSource input) { @@ -374,28 +319,6 @@ public void UpdateResolution() #region Internal methods - /// - internal bool INTERNAL_GetHitTarget(IPointer pointer, out HitData hit) - { - hit = default(HitData); - - for (var i = 0; i < layerCount; i++) - { - var touchLayer = layers[i]; - if (touchLayer == null) continue; - var result = touchLayer.Hit(pointer, out hit); - switch (result) - { - case HitResult.Hit: - return true; - case HitResult.Discard: - return false; - } - } - - return false; - } - internal void INTERNAL_AddPointer(Pointer pointer) { lock (pointerLock) @@ -609,6 +532,8 @@ private void Awake() gameObject.hideFlags = HideFlags.HideInHierarchy; DontDestroyOnLoad(gameObject); + layerManager = LayerManager.Instance; + UpdateResolution(); StopAllCoroutines(); @@ -644,7 +569,6 @@ private IEnumerator lateAwake() yield return null; yield return null; - updateLayers(); createCameraLayer(); createInput(); } @@ -665,16 +589,9 @@ private void OnApplicationQuit() #region Private functions - private void updateLayers() - { - // filter empty layers - layers = layers.FindAll(l => l != null); - layerCount = layers.Count; - } - private void createCameraLayer() { - if (layerCount == 0 && shouldCreateCameraLayer) + if (layerManager.LayerCount == 0 && shouldCreateCameraLayer) { if (Camera.main != null) { @@ -682,7 +599,7 @@ private void createCameraLayer() Debug.Log( "[TouchScript] No touch layers found, adding StandardLayer for the main camera. (this message is harmless)"); var layer = Camera.main.gameObject.AddComponent(); - AddLayer(layer); + layerManager.AddLayer(layer); } } } @@ -730,12 +647,9 @@ private void updateAdded(List pointers) pLogger.Log(pointer, PointerEvent.Added); #endif - for (var j = 0; j < layerCount; j++) - { - var touchLayer = layers[j]; - if (touchLayer == null) continue; - touchLayer.INTERNAL_AddPointer(pointer); - } + tmpPointer = pointer; + layerManager.ForEach(layerAddPointer); + tmpPointer = null; #if TOUCHSCRIPT_DEBUG if (DebugMode) addDebugFigureForPointer(pointer); @@ -747,6 +661,12 @@ private void updateAdded(List pointers) pointerListPool.Release(list); } + private bool layerAddPointer(TouchLayer layer) + { + layer.INTERNAL_AddPointer(tmpPointer); + return true; + } + private void updateUpdated(List pointers) { var updatedCount = pointers.Count; @@ -774,12 +694,9 @@ private void updateUpdated(List pointers) if (layer != null) layer.INTERNAL_UpdatePointer(pointer); else { - for (var j = 0; j < layerCount; j++) - { - var touchLayer = layers[j]; - if (touchLayer == null) continue; - touchLayer.INTERNAL_UpdatePointer(pointer); - } + tmpPointer = pointer; + layerManager.ForEach(layerUpdatePointer); + tmpPointer = null; } #if TOUCHSCRIPT_DEBUG @@ -792,6 +709,12 @@ private void updateUpdated(List pointers) pointerListPool.Release(list); } + private bool layerUpdatePointer(TouchLayer layer) + { + layer.INTERNAL_UpdatePointer(tmpPointer); + return true; + } + private void updatePressed(List pointers) { var pressedCount = pointers.Count; @@ -899,12 +822,9 @@ private void updateRemoved(List pointers) pLogger.Log(pointer, PointerEvent.Removed); #endif - for (var j = 0; j < layerCount; j++) - { - var touchLayer = layers[j]; - if (touchLayer == null) continue; - touchLayer.INTERNAL_RemovePointer(pointer); - } + tmpPointer = pointer; + layerManager.ForEach(layerRemovePointer); + tmpPointer = null; #if TOUCHSCRIPT_DEBUG if (DebugMode) removeDebugFigureForPointer(pointer); @@ -923,6 +843,12 @@ private void updateRemoved(List pointers) pointerListPool.Release(list); } + private bool layerRemovePointer(TouchLayer layer) + { + layer.INTERNAL_RemovePointer(tmpPointer); + return true; + } + private void updateCancelled(List pointers) { var cancelledCount = pointers.Count; @@ -949,12 +875,9 @@ private void updateCancelled(List pointers) pLogger.Log(pointer, PointerEvent.Cancelled); #endif - for (var j = 0; j < layerCount; j++) - { - var touchLayer = layers[j]; - if (touchLayer == null) continue; - touchLayer.INTERNAL_CancelPointer(pointer); - } + tmpPointer = pointer; + layerManager.ForEach(layerCancelPointer); + tmpPointer = null; #if TOUCHSCRIPT_DEBUG if (DebugMode) removeDebugFigureForPointer(pointer); @@ -972,6 +895,12 @@ private void updateCancelled(List pointers) pointerListPool.Release(list); } + private bool layerCancelPointer(TouchLayer layer) + { + layer.INTERNAL_CancelPointer(tmpPointer); + return true; + } + private void sendFrameStartedToPointers() { var count = pointers.Count; From d5c576a5d73a431324b79ff88717a69812386abb Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 23 Jul 2017 02:32:05 +0300 Subject: [PATCH 26/58] Recognized gestures can now be canceled. --- Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs index 20a830ee0..158c1193f 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs @@ -621,7 +621,6 @@ public void Cancel(bool cancelPointers, bool returnPointers) switch (state) { case GestureState.Cancelled: - case GestureState.Ended: case GestureState.Failed: return; } From 06a78ea8e4482ff75220f80a1ee6dfc24d803f61 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 23 Jul 2017 02:33:22 +0300 Subject: [PATCH 27/58] Added exclusive to LayerManager, updated Portal example to show how to use it. --- .../TouchScript/Examples/Portal/Portal.unity | 1884 ++++++++--------- .../TouchScript/Examples/Portal/Prefabs.meta | 9 + .../Examples/Portal/Prefabs/Planet 1.prefab | 273 +++ .../Portal/Prefabs/Planet 1.prefab.meta | 9 + .../Examples/Portal/Prefabs/Planet 2.prefab | 273 +++ .../Portal/Prefabs/Planet 2.prefab.meta | 9 + .../Examples/Portal/Prefabs/Planet 3.prefab | 273 +++ .../Portal/Prefabs/Planet 3.prefab.meta | 9 + .../Examples/Portal/Prefabs/Planet 4.prefab | 273 +++ .../Portal/Prefabs/Planet 4.prefab.meta | 9 + .../Examples/Portal/Scripts/Spawner.cs | 40 + .../Examples/Portal/Scripts/Spawner.cs.meta | 12 + .../Assets/TouchScript/Scripts/Hit/HitData.cs | 4 +- .../TouchScript/Scripts/Hit/RaycastHitUI.cs | 2 +- .../TouchScript/Scripts/ILayerManager.cs | 11 + .../TouchScript/Scripts/ITouchManager.cs | 2 + .../Scripts/LayerManagerInstance.cs | 83 + .../Scripts/Layers/StandardLayer.cs | 51 +- .../TouchScript/Scripts/Layers/TouchLayer.cs | 11 +- .../Layers/UI/TouchScriptInputModule.cs | 2 +- .../Scripts/TouchManagerInstance.cs | 6 + 21 files changed, 2256 insertions(+), 989 deletions(-) create mode 100644 Source/Assets/TouchScript/Examples/Portal/Prefabs.meta create mode 100644 Source/Assets/TouchScript/Examples/Portal/Prefabs/Planet 1.prefab create mode 100644 Source/Assets/TouchScript/Examples/Portal/Prefabs/Planet 1.prefab.meta create mode 100644 Source/Assets/TouchScript/Examples/Portal/Prefabs/Planet 2.prefab create mode 100644 Source/Assets/TouchScript/Examples/Portal/Prefabs/Planet 2.prefab.meta create mode 100644 Source/Assets/TouchScript/Examples/Portal/Prefabs/Planet 3.prefab create mode 100644 Source/Assets/TouchScript/Examples/Portal/Prefabs/Planet 3.prefab.meta create mode 100644 Source/Assets/TouchScript/Examples/Portal/Prefabs/Planet 4.prefab create mode 100644 Source/Assets/TouchScript/Examples/Portal/Prefabs/Planet 4.prefab.meta create mode 100644 Source/Assets/TouchScript/Examples/Portal/Scripts/Spawner.cs create mode 100644 Source/Assets/TouchScript/Examples/Portal/Scripts/Spawner.cs.meta diff --git a/Source/Assets/TouchScript/Examples/Portal/Portal.unity b/Source/Assets/TouchScript/Examples/Portal/Portal.unity index 2933a41b7..e59693e1f 100644 --- a/Source/Assets/TouchScript/Examples/Portal/Portal.unity +++ b/Source/Assets/TouchScript/Examples/Portal/Portal.unity @@ -1,19 +1,19 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: --- !u!29 &1 -SceneSettings: +OcclusionCullingSettings: m_ObjectHideFlags: 0 - m_PVSData: - m_PVSObjectsArray: [] - m_PVSPortalsArray: [] + serializedVersion: 2 m_OcclusionBakeSettings: smallestOccluder: 5 smallestHole: 0.25 backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 - serializedVersion: 6 + serializedVersion: 8 m_Fog: 0 m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 @@ -25,6 +25,7 @@ RenderSettings: m_AmbientGroundColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} m_AmbientIntensity: 1 m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} m_SkyboxMaterial: {fileID: 2100000, guid: a07fadb24ea940240afba3afc1a692cc, type: 2} m_HaloStrength: 0.5 m_FlareStrength: 1 @@ -37,12 +38,12 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} --- !u!157 &4 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 6 + serializedVersion: 9 m_GIWorkflowMode: 1 - m_LightmapsMode: 1 m_GISettings: serializedVersion: 2 m_BounceScale: 1 @@ -53,51 +54,73 @@ LightmapSettings: m_EnableBakedLightmaps: 1 m_EnableRealtimeLightmaps: 0 m_LightmapEditorSettings: - serializedVersion: 3 + serializedVersion: 8 m_Resolution: 1 m_BakeResolution: 50 m_TextureWidth: 1024 m_TextureHeight: 1024 + m_AO: 0 m_AOMaxDistance: 1 - m_Padding: 2 m_CompAOExponent: 0 + m_CompAOExponentDirect: 0 + m_Padding: 2 m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 m_TextureCompression: 0 m_FinalGather: 0 + m_FinalGatherFiltering: 1 m_FinalGatherRayCount: 1024 m_ReflectionCompression: 2 + m_MixedBakeMode: 1 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVRFiltering: 0 + m_PVRFilteringMode: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousColorSigma: 1 + m_PVRFilteringAtrousNormalSigma: 1 + m_PVRFilteringAtrousPositionSigma: 1 m_LightingDataAsset: {fileID: 0} - m_RuntimeCPUUsage: 25 + m_ShadowMaskMode: 2 --- !u!196 &5 NavMeshSettings: serializedVersion: 2 m_ObjectHideFlags: 0 m_BuildSettings: serializedVersion: 2 + agentTypeID: 0 agentRadius: 0.5 agentHeight: 2 agentSlope: 45 agentClimb: 0.4 ledgeDropHeight: 0 maxJumpAcrossDistance: 0 - accuratePlacement: 0 minRegionArea: 2 - cellSize: 0.16666666 manualCellSize: 0 + cellSize: 0.16666666 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 m_NavMeshData: {fileID: 0} --- !u!1 &62216951 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 62216952} - - 20: {fileID: 62216957} - - 92: {fileID: 62216956} - - 124: {fileID: 62216955} - - 81: {fileID: 62216954} - - 114: {fileID: 62216953} + - component: {fileID: 62216952} + - component: {fileID: 62216957} + - component: {fileID: 62216956} + - component: {fileID: 62216955} + - component: {fileID: 62216954} + - component: {fileID: 62216953} m_Layer: 0 m_Name: Camera m_TagString: MainCamera @@ -114,11 +137,11 @@ Transform: m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071067} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 89.980194, y: 0, z: 0} m_Children: - {fileID: 498618157} m_Father: {fileID: 930800601} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 89.980194, y: 0, z: 0} --- !u!114 &62216953 MonoBehaviour: m_ObjectHideFlags: 0 @@ -136,7 +159,7 @@ MonoBehaviour: hit3DObjects: 1 hit2DObjects: 0 hitWorldSpaceUI: 0 - hitScreenSpaceUI: 0 + hitScreenSpaceUI: 1 layerMask: serializedVersion: 2 m_Bits: 4294967295 @@ -192,19 +215,89 @@ Camera: m_TargetDisplay: 0 m_TargetEye: 3 m_HDR: 0 + m_AllowMSAA: 1 + m_ForceIntoRT: 0 m_OcclusionCulling: 1 m_StereoConvergence: 10 m_StereoSeparation: 0.022 m_StereoMirrorMode: 0 +--- !u!1 &161419863 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 161419864} + - component: {fileID: 161419866} + - component: {fileID: 161419865} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &161419864 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 161419863} + 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: 1005780168} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 31, y: 0} + m_SizeDelta: {x: 60, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &161419865 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 161419863} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 21300000, guid: 26489b03725f747f998c39661c2583b5, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &161419866 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 161419863} --- !u!1 &250857269 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 250857271} - - 114: {fileID: 250857270} + - component: {fileID: 250857271} + - component: {fileID: 250857270} m_Layer: 5 m_Name: List m_TagString: Untagged @@ -232,6 +325,8 @@ MonoBehaviour: m_Spacing: 0 m_ChildForceExpandWidth: 1 m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 --- !u!224 &250857271 RectTransform: m_ObjectHideFlags: 0 @@ -241,275 +336,25 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: + - {fileID: 1005780168} - {fileID: 1679844150} m_Father: {fileID: 1981142013} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &481822342 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 4 - m_Component: - - 4: {fileID: 481822343} - - 33: {fileID: 481822346} - - 23: {fileID: 481822345} - - 114: {fileID: 481822344} - - 135: {fileID: 481822347} - - 114: {fileID: 481822349} - - 114: {fileID: 481822348} - - 114: {fileID: 481822351} - - 114: {fileID: 481822350} - - 54: {fileID: 481822352} - m_Layer: 0 - m_Name: Planet - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &481822343 -Transform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 481822342} - m_LocalRotation: {x: -0.00000008940697, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -4.3, y: -6.06, z: 0.4} - m_LocalScale: {x: 5, y: 5, z: 5} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_Children: [] - m_Father: {fileID: 1158035086} - m_RootOrder: 3 ---- !u!114 &481822344 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 481822342} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 11cabe64e6b9945c88b060d042861428, type: 3} - m_Name: - m_EditorClassIdentifier: - Speed: 100 - RotationSpeed: 40 - FallSpeed: 0.01 ---- !u!23 &481822345 -MeshRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 481822342} - m_Enabled: 1 - m_CastShadows: 0 - m_ReceiveShadows: 0 - m_Materials: - - {fileID: 2100000, guid: 10bd026932ba047dcaca956b30263df6, type: 2} - m_SubsetIndices: - m_StaticBatchRoot: {fileID: 0} - m_UseLightProbes: 0 - m_ReflectionProbeUsage: 1 - m_ProbeAnchor: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingOrder: 0 ---- !u!33 &481822346 -MeshFilter: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 481822342} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!135 &481822347 -SphereCollider: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 481822342} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Radius: 0.5 - m_Center: {x: 0, y: 0.0000009536743, z: -0.00000023841858} ---- !u!114 &481822348 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 481822342} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 978a486d8ecf8437cbb87e8534908895, type: 3} - m_Name: - m_EditorClassIdentifier: - enableSmoothing: 0 - smoothingFactor: 0.0001 - positionThreshold: 0.0001 - rotationThreshold: 0.01 - scaleThreshold: 0.0001 - allowChangingFromOutside: 0 ---- !u!114 &481822349 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 481822342} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} - m_Name: - m_EditorClassIdentifier: - OnStateChange: - m_PersistentCalls: - m_Calls: [] - m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - generalProps: 0 - limitsProps: 0 - advancedProps: 0 - minPointers: 0 - maxPointers: 0 - combinePointers: 0 - combinePointersInterval: 0.3 - useSendMessage: 0 - sendStateChangeMessages: 0 - sendMessageTarget: {fileID: 0} - useUnityEvents: 0 - sendStateChangeEvents: 0 - requireGestureToFail: {fileID: 0} - friendlyGestures: [] - OnTransformStart: - m_PersistentCalls: - m_Calls: [] - m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - OnTransform: - m_PersistentCalls: - m_Calls: [] - m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - OnTransformComplete: - m_PersistentCalls: - m_Calls: [] - m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - type: 1 - screenTransformThreshold: 0.1 - minScreenPointsDistance: 0.5 - projectionProps: 0 - projection: 1 - projectionPlaneNormal: {x: 0, y: 0, z: 1} ---- !u!114 &481822350 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 481822342} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 141e75b9b7edb42df80a22a14f03ae4b, type: 3} - m_Name: - m_EditorClassIdentifier: - OnStateChange: - m_PersistentCalls: - m_Calls: [] - m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - generalProps: 0 - limitsProps: 0 - advancedProps: 0 - minPointers: 0 - maxPointers: 0 - combinePointers: 0 - combinePointersInterval: 0.3 - useSendMessage: 0 - sendStateChangeMessages: 0 - sendMessageTarget: {fileID: 0} - useUnityEvents: 0 - sendStateChangeEvents: 0 - requireGestureToFail: {fileID: 0} - friendlyGestures: [] - OnRelease: - m_PersistentCalls: - m_Calls: [] - m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - ignoreChildren: 0 ---- !u!114 &481822351 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 481822342} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} - m_Name: - m_EditorClassIdentifier: - OnStateChange: - m_PersistentCalls: - m_Calls: [] - m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - generalProps: 0 - limitsProps: 0 - advancedProps: 0 - minPointers: 0 - maxPointers: 0 - combinePointers: 0 - combinePointersInterval: 0.3 - useSendMessage: 0 - sendStateChangeMessages: 0 - sendMessageTarget: {fileID: 0} - useUnityEvents: 0 - sendStateChangeEvents: 0 - requireGestureToFail: {fileID: 0} - friendlyGestures: [] - OnPress: - m_PersistentCalls: - m_Calls: [] - m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - ignoreChildren: 0 ---- !u!54 &481822352 -Rigidbody: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 481822342} - serializedVersion: 2 - m_Mass: 1 - m_Drag: 0 - m_AngularDrag: 0.05 - m_UseGravity: 0 - m_IsKinematic: 1 - m_Interpolate: 0 - m_Constraints: 0 - m_CollisionDetection: 0 --- !u!1 &498618156 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 498618157} + - component: {fileID: 498618157} m_Layer: 0 m_Name: Stuff m_TagString: Untagged @@ -526,12 +371,12 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 2.15, y: 0, z: 10} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1283428183} - {fileID: 1158035086} m_Father: {fileID: 62216952} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &543251036 Prefab: m_ObjectHideFlags: 0 @@ -578,38 +423,214 @@ Prefab: m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} m_IsPrefabParent: 0 ---- !u!1 &740851131 +--- !u!1 &587840591 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 740851132} - - 223: {fileID: 740851135} - - 114: {fileID: 740851134} + - component: {fileID: 587840592} + - component: {fileID: 587840596} + - component: {fileID: 587840595} + - component: {fileID: 587840594} + - component: {fileID: 587840593} m_Layer: 5 - m_Name: Canvas + m_Name: Spawner 2 m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &740851132 +--- !u!224 &587840592 RectTransform: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 740851131} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 587840591} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 782750265} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 1981142013} - - {fileID: 1552723601} - m_Father: {fileID: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 282, y: -120} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &587840593 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 587840591} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 712d87efeee01774088f382a8449caab, type: 3} + m_Name: + m_EditorClassIdentifier: + Prefab: {fileID: 4252442136654676, guid: bff70878d8bdbdd409be0cca1fc3cfce, type: 2} + Position: {fileID: 699119955} +--- !u!114 &587840594 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 587840591} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} + m_Name: + m_EditorClassIdentifier: + debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 + advancedProps: 0 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: 0.3 + useSendMessage: 0 + sendStateChangeMessages: 0 + sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 + requireGestureToFail: {fileID: 0} + friendlyGestures: [] + OnPress: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + ignoreChildren: 0 +--- !u!114 &587840595 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 587840591} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 21300000, guid: 533b9df4691d947d9921a0053b5ce231, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &587840596 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 587840591} +--- !u!1 &699119954 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 699119955} + m_Layer: 0 + m_Name: Planet 2 Position + m_TagString: Untagged + m_Icon: {fileID: -964228994112308473, guid: 0000000000000000d000000000000000, type: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &699119955 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 699119954} + m_LocalRotation: {x: -0.00000005960465, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 9.3, y: -4.8, z: 0.3} + m_LocalScale: {x: 5, y: 4.999998, z: 4.999998} + m_Children: [] + m_Father: {fileID: 1158035086} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &718339113 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 718339114} + m_Layer: 0 + m_Name: Planet 4 Position + m_TagString: Untagged + m_Icon: {fileID: -964228994112308473, guid: 0000000000000000d000000000000000, type: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &718339114 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 718339113} + m_LocalRotation: {x: -0.00000005960465, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -12, y: 0.7, z: 0.3} + m_LocalScale: {x: 5, y: 4.999998, z: 4.999998} + m_Children: [] + m_Father: {fileID: 1158035086} m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &740851131 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 740851132} + - component: {fileID: 740851135} + - component: {fileID: 740851134} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &740851132 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 740851131} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 1981142013} + - {fileID: 1552723601} + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -643,7 +664,7 @@ Canvas: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 740851131} m_Enabled: 1 - serializedVersion: 2 + serializedVersion: 3 m_RenderMode: 0 m_Camera: {fileID: 0} m_PlaneDistance: 100 @@ -652,20 +673,21 @@ Canvas: m_OverrideSorting: 0 m_OverridePixelPerfect: 0 m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 m_SortingLayerID: 0 - m_SortingOrder: 0 + m_SortingOrder: 1 m_TargetDisplay: 0 --- !u!1 &762219656 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 762219657} - - 33: {fileID: 762219661} - - 23: {fileID: 762219659} - - 114: {fileID: 762219658} + - component: {fileID: 762219657} + - component: {fileID: 762219661} + - component: {fileID: 762219659} + - component: {fileID: 762219658} m_Layer: 0 m_Name: Quad m_TagString: Untagged @@ -682,10 +704,10 @@ Transform: m_LocalRotation: {x: -0.00000005960465, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: -0.1} m_LocalScale: {x: 6, y: 6, z: 6} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1283428183} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &762219658 MonoBehaviour: m_ObjectHideFlags: 0 @@ -707,22 +729,28 @@ MeshRenderer: m_Enabled: 1 m_CastShadows: 1 m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 m_Materials: - {fileID: 2100000, guid: 2105a6ce9f7624161ba30eefc0d839f3, type: 2} - m_SubsetIndices: + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 m_StaticBatchRoot: {fileID: 0} - m_UseLightProbes: 0 - m_ReflectionProbeUsage: 1 m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} m_ScaleInLightmap: 1 m_PreserveUVs: 0 m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 m_MinimumChartSize: 4 m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} m_SortingLayerID: 0 + m_SortingLayer: 0 m_SortingOrder: 0 --- !u!33 &762219661 MeshFilter: @@ -731,381 +759,284 @@ MeshFilter: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 762219656} m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &851559560 +--- !u!1 &782750261 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 851559561} - - 33: {fileID: 851559563} - - 23: {fileID: 851559562} - - 114: {fileID: 851559564} - - 135: {fileID: 851559567} - - 114: {fileID: 851559566} - - 114: {fileID: 851559565} - - 114: {fileID: 851559569} - - 114: {fileID: 851559568} - - 54: {fileID: 851559570} - m_Layer: 0 - m_Name: Planet + - component: {fileID: 782750265} + - component: {fileID: 782750264} + - component: {fileID: 782750262} + - component: {fileID: 782750263} + m_Layer: 5 + m_Name: Game Canvas m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &851559561 -Transform: +--- !u!114 &782750262 +MonoBehaviour: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 851559560} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 7.01, y: -3.64, z: 0.1} - m_LocalScale: {x: 5, y: 5, z: 5} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_Children: [] - m_Father: {fileID: 1158035086} - m_RootOrder: 0 ---- !u!23 &851559562 -MeshRenderer: + m_GameObject: {fileID: 782750261} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1301386320, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &782750263 +MonoBehaviour: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 851559560} + m_GameObject: {fileID: 782750261} m_Enabled: 1 - m_CastShadows: 0 - m_ReceiveShadows: 0 - m_Materials: - - {fileID: 2100000, guid: 150b901d18f3f45d08b29f50aaec86b9, type: 2} - m_SubsetIndices: - m_StaticBatchRoot: {fileID: 0} - m_UseLightProbes: 0 - m_ReflectionProbeUsage: 1 - m_ProbeAnchor: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} + m_EditorHideFlags: 0 + m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 640, y: 480} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 1 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 +--- !u!223 &782750264 +Canvas: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 782750261} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 m_SortingLayerID: 0 m_SortingOrder: 0 ---- !u!33 &851559563 -MeshFilter: + m_TargetDisplay: 0 +--- !u!224 &782750265 +RectTransform: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 851559560} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!114 &851559564 -MonoBehaviour: + m_GameObject: {fileID: 782750261} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 965152938} + - {fileID: 587840592} + - {fileID: 1732869220} + - {fileID: 1247142069} + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &854248630 +GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 851559560} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 11cabe64e6b9945c88b060d042861428, type: 3} - m_Name: - m_EditorClassIdentifier: - Speed: 100 - RotationSpeed: 10 - FallSpeed: 0.01 ---- !u!114 &851559565 + serializedVersion: 5 + m_Component: + - component: {fileID: 854248631} + - component: {fileID: 854248634} + - component: {fileID: 854248633} + - component: {fileID: 854248632} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &854248631 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 854248630} + 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: 1005780168} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 193, y: 0} + m_SizeDelta: {x: 235, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &854248632 MonoBehaviour: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 851559560} + m_GameObject: {fileID: 854248630} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 978a486d8ecf8437cbb87e8534908895, type: 3} + m_Script: {fileID: 1573420865, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} m_Name: m_EditorClassIdentifier: - enableSmoothing: 0 - smoothingFactor: 0.0001 - positionThreshold: 0.0001 - rotationThreshold: 0.01 - scaleThreshold: 0.0001 - allowChangingFromOutside: 0 ---- !u!114 &851559566 + m_EffectColor: {r: 0, g: 0, b: 0, a: 1} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 1 +--- !u!114 &854248633 MonoBehaviour: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 851559560} + m_GameObject: {fileID: 854248630} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} m_Name: m_EditorClassIdentifier: - OnStateChange: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - generalProps: 0 - limitsProps: 0 - advancedProps: 0 - minPointers: 0 - maxPointers: 0 - combinePointers: 0 - combinePointersInterval: 0.3 - useSendMessage: 0 - sendStateChangeMessages: 0 - sendMessageTarget: {fileID: 0} - useUnityEvents: 0 - sendStateChangeEvents: 0 - requireGestureToFail: {fileID: 0} - friendlyGestures: [] - OnTransformStart: - m_PersistentCalls: - m_Calls: [] - m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - OnTransform: - m_PersistentCalls: - m_Calls: [] - m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - OnTransformComplete: - m_PersistentCalls: - m_Calls: [] - m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - type: 1 - screenTransformThreshold: 0.1 - minScreenPointsDistance: 0.5 - projectionProps: 0 - projection: 1 - projectionPlaneNormal: {x: 0, y: 0, z: 1} ---- !u!135 &851559567 -SphereCollider: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 851559560} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Radius: 0.5 - m_Center: {x: 0, y: -0.00000047683716, z: -0.00000023841858} ---- !u!114 &851559568 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 851559560} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 141e75b9b7edb42df80a22a14f03ae4b, type: 3} - m_Name: - m_EditorClassIdentifier: - OnStateChange: - m_PersistentCalls: - m_Calls: [] - m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - generalProps: 0 - limitsProps: 0 - advancedProps: 0 - minPointers: 0 - maxPointers: 0 - combinePointers: 0 - combinePointersInterval: 0.3 - useSendMessage: 0 - sendStateChangeMessages: 0 - sendMessageTarget: {fileID: 0} - useUnityEvents: 0 - sendStateChangeEvents: 0 - requireGestureToFail: {fileID: 0} - friendlyGestures: [] - OnRelease: - m_PersistentCalls: - m_Calls: [] - m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - ignoreChildren: 0 ---- !u!114 &851559569 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 851559560} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} - m_Name: - m_EditorClassIdentifier: - OnStateChange: - m_PersistentCalls: - m_Calls: [] - m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - generalProps: 0 - limitsProps: 0 - advancedProps: 0 - minPointers: 0 - maxPointers: 0 - combinePointers: 0 - combinePointersInterval: 0.3 - useSendMessage: 0 - sendStateChangeMessages: 0 - sendMessageTarget: {fileID: 0} - useUnityEvents: 0 - sendStateChangeEvents: 0 - requireGestureToFail: {fileID: 0} - friendlyGestures: [] - OnPress: - m_PersistentCalls: - m_Calls: [] - m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - ignoreChildren: 0 ---- !u!54 &851559570 -Rigidbody: + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Press a Unity logo to spawn a planet. +--- !u!222 &854248634 +CanvasRenderer: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 851559560} - serializedVersion: 2 - m_Mass: 1 - m_Drag: 0 - m_AngularDrag: 0.05 - m_UseGravity: 0 - m_IsKinematic: 1 - m_Interpolate: 0 - m_Constraints: 0 - m_CollisionDetection: 0 ---- !u!1 &893756805 + m_GameObject: {fileID: 854248630} +--- !u!1 &930800600 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 893756806} - - 33: {fileID: 893756809} - - 23: {fileID: 893756808} - - 114: {fileID: 893756807} - - 135: {fileID: 893756810} - - 114: {fileID: 893756812} - - 114: {fileID: 893756811} - - 114: {fileID: 893756814} - - 114: {fileID: 893756813} - - 54: {fileID: 893756815} + - component: {fileID: 930800601} m_Layer: 0 - m_Name: Planet + m_Name: Scene m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &893756806 +--- !u!4 &930800601 Transform: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 893756805} - m_LocalRotation: {x: -0.00000008940697, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 6.24, y: 6.08, z: 0.3} - m_LocalScale: {x: 5, y: 5, z: 5} + m_GameObject: {fileID: 930800600} + 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: 2135305920} + - {fileID: 62216952} + m_Father: {fileID: 0} + m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_Children: [] - m_Father: {fileID: 1158035086} - m_RootOrder: 2 ---- !u!114 &893756807 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 893756805} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 11cabe64e6b9945c88b060d042861428, type: 3} - m_Name: - m_EditorClassIdentifier: - Speed: 100 - RotationSpeed: 30 - FallSpeed: 0.01 ---- !u!23 &893756808 -MeshRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 893756805} - m_Enabled: 1 - m_CastShadows: 0 - m_ReceiveShadows: 0 - m_Materials: - - {fileID: 2100000, guid: 148079725ce574b75ae65e81f6be1567, type: 2} - m_SubsetIndices: - m_StaticBatchRoot: {fileID: 0} - m_UseLightProbes: 0 - m_ReflectionProbeUsage: 1 - m_ProbeAnchor: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingOrder: 0 ---- !u!33 &893756809 -MeshFilter: +--- !u!1 &965152937 +GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 893756805} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!135 &893756810 -SphereCollider: + serializedVersion: 5 + m_Component: + - component: {fileID: 965152938} + - component: {fileID: 965152942} + - component: {fileID: 965152941} + - component: {fileID: 965152940} + - component: {fileID: 965152939} + m_Layer: 5 + m_Name: Spawner 1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &965152938 +RectTransform: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 893756805} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Radius: 0.5 - m_Center: {x: 0, y: -0.00000071525574, z: -0.00000023841858} ---- !u!114 &893756811 + m_GameObject: {fileID: 965152937} + 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: 782750265} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 259, y: 126} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &965152939 MonoBehaviour: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 893756805} + m_GameObject: {fileID: 965152937} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 978a486d8ecf8437cbb87e8534908895, type: 3} + m_Script: {fileID: 11500000, guid: 712d87efeee01774088f382a8449caab, type: 3} m_Name: m_EditorClassIdentifier: - enableSmoothing: 0 - smoothingFactor: 0.0001 - positionThreshold: 0.0001 - rotationThreshold: 0.01 - scaleThreshold: 0.0001 - allowChangingFromOutside: 0 ---- !u!114 &893756812 + Prefab: {fileID: 4587602474649486, guid: 7c0291284cacbcf4d93907ef9bfae4b9, type: 2} + Position: {fileID: 1730821178} +--- !u!114 &965152940 MonoBehaviour: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 893756805} + m_GameObject: {fileID: 965152937} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} + m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 OnStateChange: m_PersistentCalls: m_Calls: [] @@ -1125,154 +1056,137 @@ MonoBehaviour: sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] - OnTransformStart: - m_PersistentCalls: - m_Calls: [] - m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - OnTransform: - m_PersistentCalls: - m_Calls: [] - m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - OnTransformComplete: + OnPress: m_PersistentCalls: m_Calls: [] m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - type: 1 - screenTransformThreshold: 0.1 - minScreenPointsDistance: 0.5 - projectionProps: 0 - projection: 1 - projectionPlaneNormal: {x: 0, y: 0, z: 1} ---- !u!114 &893756813 + ignoreChildren: 0 +--- !u!114 &965152941 MonoBehaviour: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 893756805} + m_GameObject: {fileID: 965152937} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 141e75b9b7edb42df80a22a14f03ae4b, type: 3} + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} m_Name: m_EditorClassIdentifier: - OnStateChange: - m_PersistentCalls: - m_Calls: [] - m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - generalProps: 0 - limitsProps: 0 - advancedProps: 0 - minPointers: 0 - maxPointers: 0 - combinePointers: 0 - combinePointersInterval: 0.3 - useSendMessage: 0 - sendStateChangeMessages: 0 - sendMessageTarget: {fileID: 0} - useUnityEvents: 0 - sendStateChangeEvents: 0 - requireGestureToFail: {fileID: 0} - friendlyGestures: [] - OnRelease: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - ignoreChildren: 0 ---- !u!114 &893756814 + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 21300000, guid: 533b9df4691d947d9921a0053b5ce231, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &965152942 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 965152937} +--- !u!1 &1005780167 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1005780168} + - component: {fileID: 1005780169} + m_Layer: 5 + m_Name: Press + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1005780168 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1005780167} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.9999968, y: 0.9999968, z: 0.9999968} + m_Children: + - {fileID: 161419864} + - {fileID: 854248631} + m_Father: {fileID: 250857271} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1005780169 MonoBehaviour: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 893756805} + m_GameObject: {fileID: 1005780167} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} + m_Script: {fileID: 1679637790, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} m_Name: m_EditorClassIdentifier: - OnStateChange: - m_PersistentCalls: - m_Calls: [] - m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - generalProps: 0 - limitsProps: 0 - advancedProps: 0 - minPointers: 0 - maxPointers: 0 - combinePointers: 0 - combinePointersInterval: 0.3 - useSendMessage: 0 - sendStateChangeMessages: 0 - sendMessageTarget: {fileID: 0} - useUnityEvents: 0 - sendStateChangeEvents: 0 - requireGestureToFail: {fileID: 0} - friendlyGestures: [] - OnPress: - m_PersistentCalls: - m_Calls: [] - m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - ignoreChildren: 0 ---- !u!54 &893756815 -Rigidbody: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 893756805} - serializedVersion: 2 - m_Mass: 1 - m_Drag: 0 - m_AngularDrag: 0.05 - m_UseGravity: 0 - m_IsKinematic: 1 - m_Interpolate: 0 - m_Constraints: 0 - m_CollisionDetection: 0 ---- !u!1 &930800600 + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: 60 + m_PreferredWidth: -1 + m_PreferredHeight: 60 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 +--- !u!1 &1090564253 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 930800601} + - component: {fileID: 1090564254} m_Layer: 0 - m_Name: Scene + m_Name: Planet 3 Position m_TagString: Untagged - m_Icon: {fileID: 0} + m_Icon: {fileID: -964228994112308473, guid: 0000000000000000d000000000000000, type: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &930800601 +--- !u!4 &1090564254 Transform: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 930800600} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 2135305920} - - {fileID: 62216952} - m_Father: {fileID: 0} + m_GameObject: {fileID: 1090564253} + m_LocalRotation: {x: -0.00000005960465, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2, y: -7.3, z: 0.3} + m_LocalScale: {x: 5, y: 4.999998, z: 4.999998} + m_Children: [] + m_Father: {fileID: 1158035086} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1138005899 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1138005900} - - 222: {fileID: 1138005902} - - 114: {fileID: 1138005901} + - component: {fileID: 1138005900} + - component: {fileID: 1138005902} + - component: {fileID: 1138005901} m_Layer: 5 m_Name: Image m_TagString: Untagged @@ -1289,10 +1203,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1679844150} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} @@ -1329,215 +1243,102 @@ MonoBehaviour: CanvasRenderer: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1138005899} ---- !u!1 &1158035085 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 4 - m_Component: - - 4: {fileID: 1158035086} - m_Layer: 0 - m_Name: Planets - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1158035086 -Transform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1158035085} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: -0, z: 1.59} - m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 851559561} - - {fileID: 1166789652} - - {fileID: 893756806} - - {fileID: 481822343} - m_Father: {fileID: 498618157} - m_RootOrder: 1 ---- !u!1 &1166789651 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 4 - m_Component: - - 4: {fileID: 1166789652} - - 33: {fileID: 1166789655} - - 23: {fileID: 1166789654} - - 114: {fileID: 1166789653} - - 135: {fileID: 1166789656} - - 114: {fileID: 1166789658} - - 114: {fileID: 1166789657} - - 114: {fileID: 1166789660} - - 114: {fileID: 1166789659} - - 54: {fileID: 1166789661} - m_Layer: 0 - m_Name: Planet - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1166789652 -Transform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1166789651} - m_LocalRotation: {x: -0.00000008940697, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -8.32, y: 4.82, z: 0.2} - m_LocalScale: {x: 5, y: 5, z: 5} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_Children: [] - m_Father: {fileID: 1158035086} - m_RootOrder: 1 ---- !u!114 &1166789653 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1166789651} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 11cabe64e6b9945c88b060d042861428, type: 3} - m_Name: - m_EditorClassIdentifier: - Speed: 100 - RotationSpeed: 20 - FallSpeed: 0.01 ---- !u!23 &1166789654 -MeshRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1166789651} - m_Enabled: 1 - m_CastShadows: 0 - m_ReceiveShadows: 0 - m_Materials: - - {fileID: 2100000, guid: 0ed169bc21381479799fe7ba05d2939b, type: 2} - m_SubsetIndices: - m_StaticBatchRoot: {fileID: 0} - m_UseLightProbes: 0 - m_ReflectionProbeUsage: 1 - m_ProbeAnchor: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingOrder: 0 ---- !u!33 &1166789655 -MeshFilter: + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1138005899} +--- !u!1 &1158035085 +GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1166789651} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!135 &1166789656 -SphereCollider: + serializedVersion: 5 + m_Component: + - component: {fileID: 1158035086} + m_Layer: 0 + m_Name: Planets + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1158035086 +Transform: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1166789651} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Radius: 0.5 - m_Center: {x: 0, y: -0.00000047683716, z: -0.00000023841858} ---- !u!114 &1166789657 -MonoBehaviour: + m_GameObject: {fileID: 1158035085} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -0, z: 1.59} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1730821178} + - {fileID: 699119955} + - {fileID: 1090564254} + - {fileID: 718339114} + m_Father: {fileID: 498618157} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1247142068 +GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1166789651} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 978a486d8ecf8437cbb87e8534908895, type: 3} - m_Name: - m_EditorClassIdentifier: - enableSmoothing: 0 - smoothingFactor: 0.0001 - positionThreshold: 0.0001 - rotationThreshold: 0.01 - scaleThreshold: 0.0001 - allowChangingFromOutside: 0 ---- !u!114 &1166789658 + serializedVersion: 5 + m_Component: + - component: {fileID: 1247142069} + - component: {fileID: 1247142073} + - component: {fileID: 1247142072} + - component: {fileID: 1247142071} + - component: {fileID: 1247142070} + m_Layer: 5 + m_Name: Spawner 4 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1247142069 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1247142068} + 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: 782750265} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -251, y: 14} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1247142070 MonoBehaviour: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1166789651} + m_GameObject: {fileID: 1247142068} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} + m_Script: {fileID: 11500000, guid: 712d87efeee01774088f382a8449caab, type: 3} m_Name: m_EditorClassIdentifier: - OnStateChange: - m_PersistentCalls: - m_Calls: [] - m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - generalProps: 0 - limitsProps: 0 - advancedProps: 0 - minPointers: 0 - maxPointers: 0 - combinePointers: 0 - combinePointersInterval: 0.3 - useSendMessage: 0 - sendStateChangeMessages: 0 - sendMessageTarget: {fileID: 0} - useUnityEvents: 0 - sendStateChangeEvents: 0 - requireGestureToFail: {fileID: 0} - friendlyGestures: [] - OnTransformStart: - m_PersistentCalls: - m_Calls: [] - m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - OnTransform: - m_PersistentCalls: - m_Calls: [] - m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - OnTransformComplete: - m_PersistentCalls: - m_Calls: [] - m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - type: 1 - screenTransformThreshold: 0.1 - minScreenPointsDistance: 0.5 - projectionProps: 0 - projection: 1 - projectionPlaneNormal: {x: 0, y: 0, z: 1} ---- !u!114 &1166789659 + Prefab: {fileID: 4567459449971028, guid: 4d11e87ec08ce584a818342513bf6616, type: 2} + Position: {fileID: 718339114} +--- !u!114 &1247142071 MonoBehaviour: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1166789651} + m_GameObject: {fileID: 1247142068} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 141e75b9b7edb42df80a22a14f03ae4b, type: 3} + m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 OnStateChange: m_PersistentCalls: m_Calls: [] @@ -1557,73 +1358,55 @@ MonoBehaviour: sendStateChangeEvents: 0 requireGestureToFail: {fileID: 0} friendlyGestures: [] - OnRelease: + OnPress: m_PersistentCalls: m_Calls: [] m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null ignoreChildren: 0 ---- !u!114 &1166789660 +--- !u!114 &1247142072 MonoBehaviour: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1166789651} + m_GameObject: {fileID: 1247142068} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} m_Name: m_EditorClassIdentifier: - OnStateChange: - m_PersistentCalls: - m_Calls: [] - m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - generalProps: 0 - limitsProps: 0 - advancedProps: 0 - minPointers: 0 - maxPointers: 0 - combinePointers: 0 - combinePointersInterval: 0.3 - useSendMessage: 0 - sendStateChangeMessages: 0 - sendMessageTarget: {fileID: 0} - useUnityEvents: 0 - sendStateChangeEvents: 0 - requireGestureToFail: {fileID: 0} - friendlyGestures: [] - OnPress: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - ignoreChildren: 0 ---- !u!54 &1166789661 -Rigidbody: + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 21300000, guid: 533b9df4691d947d9921a0053b5ce231, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &1247142073 +CanvasRenderer: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1166789651} - serializedVersion: 2 - m_Mass: 1 - m_Drag: 0 - m_AngularDrag: 0.05 - m_UseGravity: 0 - m_IsKinematic: 1 - m_Interpolate: 0 - m_Constraints: 0 - m_CollisionDetection: 0 + m_GameObject: {fileID: 1247142068} --- !u!1 &1283428182 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 1283428183} - - 135: {fileID: 1283428184} - - 114: {fileID: 1283428185} + - component: {fileID: 1283428183} + - component: {fileID: 1283428184} + - component: {fileID: 1283428185} m_Layer: 0 m_Name: Vortex m_TagString: Untagged @@ -1640,12 +1423,12 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 2} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1762297559} - {fileID: 762219657} m_Father: {fileID: 498618157} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!135 &1283428184 SphereCollider: m_ObjectHideFlags: 0 @@ -1674,12 +1457,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1408280581} - - 222: {fileID: 1408280583} - - 114: {fileID: 1408280582} - - 114: {fileID: 1408280584} + - component: {fileID: 1408280581} + - component: {fileID: 1408280583} + - component: {fileID: 1408280582} + - component: {fileID: 1408280584} m_Layer: 5 m_Name: Text m_TagString: Untagged @@ -1696,10 +1479,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1679844150} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} @@ -1763,12 +1546,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1552723601} - - 222: {fileID: 1552723603} - - 114: {fileID: 1552723602} - - 114: {fileID: 1552723604} + - component: {fileID: 1552723601} + - component: {fileID: 1552723603} + - component: {fileID: 1552723602} + - component: {fileID: 1552723604} m_Layer: 5 m_Name: Description m_TagString: Untagged @@ -1785,14 +1568,14 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 740851132} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 178, y: 78} - m_SizeDelta: {x: 320, y: 128} + m_AnchoredPosition: {x: 178, y: 90} + m_SizeDelta: {x: 320, y: 151} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1552723602 MonoBehaviour: @@ -1829,7 +1612,7 @@ MonoBehaviour: m_Text: 'Portal - This example shows how to cancel a gesture. + This example shows how to cancel a gesture or "give" its pointers to another gesture. When you drag a planet close to the portal TransformGesture is cancelled and the @@ -1860,10 +1643,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1679844150} - - 114: {fileID: 1679844151} + - component: {fileID: 1679844150} + - component: {fileID: 1679844151} m_Layer: 5 m_Name: Drag m_TagString: Untagged @@ -1880,12 +1663,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1138005900} - {fileID: 1408280581} m_Father: {fileID: 250857271} - m_RootOrder: 0 + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -1909,17 +1692,165 @@ MonoBehaviour: m_PreferredHeight: 60 m_FlexibleWidth: -1 m_FlexibleHeight: -1 +--- !u!1 &1730821177 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1730821178} + m_Layer: 0 + m_Name: Planet 1 Position + m_TagString: Untagged + m_Icon: {fileID: -964228994112308473, guid: 0000000000000000d000000000000000, type: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1730821178 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1730821177} + m_LocalRotation: {x: -0.00000005960465, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 8.23, y: 5.06, z: 0.3} + m_LocalScale: {x: 5, y: 5, z: 5} + m_Children: [] + m_Father: {fileID: 1158035086} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1732869219 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1732869220} + - component: {fileID: 1732869224} + - component: {fileID: 1732869223} + - component: {fileID: 1732869222} + - component: {fileID: 1732869221} + m_Layer: 5 + m_Name: Spawner 3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1732869220 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1732869219} + 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: 782750265} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 2, y: -186} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1732869221 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1732869219} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 712d87efeee01774088f382a8449caab, type: 3} + m_Name: + m_EditorClassIdentifier: + Prefab: {fileID: 4675551579099594, guid: e6c45ad0ad3ece84b91f569ca505eba9, type: 2} + Position: {fileID: 1090564254} +--- !u!114 &1732869222 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1732869219} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} + m_Name: + m_EditorClassIdentifier: + debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 + advancedProps: 0 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: 0.3 + useSendMessage: 0 + sendStateChangeMessages: 0 + sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 + requireGestureToFail: {fileID: 0} + friendlyGestures: [] + OnPress: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + ignoreChildren: 0 +--- !u!114 &1732869223 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1732869219} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 21300000, guid: 533b9df4691d947d9921a0053b5ce231, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &1732869224 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1732869219} --- !u!1 &1762297554 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 1762297559} - - 33: {fileID: 1762297558} - - 23: {fileID: 1762297556} - - 114: {fileID: 1762297555} + - component: {fileID: 1762297559} + - component: {fileID: 1762297558} + - component: {fileID: 1762297556} + - component: {fileID: 1762297555} m_Layer: 0 m_Name: Quad m_TagString: Untagged @@ -1948,22 +1879,28 @@ MeshRenderer: m_Enabled: 1 m_CastShadows: 1 m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 m_Materials: - {fileID: 2100000, guid: 2105a6ce9f7624161ba30eefc0d839f3, type: 2} - m_SubsetIndices: + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 m_StaticBatchRoot: {fileID: 0} - m_UseLightProbes: 0 - m_ReflectionProbeUsage: 1 m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} m_ScaleInLightmap: 1 m_PreserveUVs: 0 m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 m_MinimumChartSize: 4 m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} m_SortingLayerID: 0 + m_SortingLayer: 0 m_SortingOrder: 0 --- !u!33 &1762297558 MeshFilter: @@ -1981,19 +1918,19 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 10, y: 10, z: 10} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1283428183} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1764701046 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 1764701050} - - 114: {fileID: 1764701049} + - component: {fileID: 1764701050} + - component: {fileID: 1764701049} m_Layer: 0 m_Name: EventSystem m_TagString: Untagged @@ -2024,10 +1961,10 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 4 + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &1772227325 Prefab: m_ObjectHideFlags: 0 @@ -2055,9 +1992,9 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1981142013} + - component: {fileID: 1981142013} m_Layer: 5 m_Name: Panel m_TagString: Untagged @@ -2074,11 +2011,11 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 250857271} m_Father: {fileID: 740851132} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0.25263783, y: 1} m_AnchoredPosition: {x: 5, y: 50} @@ -2089,10 +2026,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 2135305920} - - 108: {fileID: 2135305921} + - component: {fileID: 2135305920} + - component: {fileID: 2135305921} m_Layer: 0 m_Name: Directional light m_TagString: Untagged @@ -2109,10 +2046,10 @@ Transform: m_LocalRotation: {x: 0.24194291, y: -0.49854365, z: 0.22107579, w: 0.80252314} m_LocalPosition: {x: 6.1004148, y: 15.540384, z: -20.566225} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 930800601} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!108 &2135305921 Light: m_ObjectHideFlags: 0 @@ -2120,7 +2057,7 @@ Light: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 2135305919} m_Enabled: 1 - serializedVersion: 6 + serializedVersion: 8 m_Type: 1 m_Color: {r: 1, g: 1, b: 1, a: 1} m_Intensity: 1.3 @@ -2130,6 +2067,7 @@ Light: m_Shadows: m_Type: 2 m_Resolution: 3 + m_CustomResolution: -1 m_Strength: 0.56 m_Bias: 0.1 m_NormalBias: 0.4 @@ -2142,7 +2080,9 @@ Light: serializedVersion: 2 m_Bits: 4294967295 m_Lightmapping: 1 + m_AreaSize: {x: 1, y: 1} m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 m_ShadowRadius: 0 m_ShadowAngle: 0 - m_AreaSize: {x: 1, y: 1} diff --git a/Source/Assets/TouchScript/Examples/Portal/Prefabs.meta b/Source/Assets/TouchScript/Examples/Portal/Prefabs.meta new file mode 100644 index 000000000..f46a58b2c --- /dev/null +++ b/Source/Assets/TouchScript/Examples/Portal/Prefabs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 04d6b05909265f14b959a306ec367037 +folderAsset: yes +timeCreated: 1500762512 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/Portal/Prefabs/Planet 1.prefab b/Source/Assets/TouchScript/Examples/Portal/Prefabs/Planet 1.prefab new file mode 100644 index 000000000..a2f61d994 --- /dev/null +++ b/Source/Assets/TouchScript/Examples/Portal/Prefabs/Planet 1.prefab @@ -0,0 +1,273 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1001 &100100000 +Prefab: + m_ObjectHideFlags: 1 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: [] + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 0} + m_RootGameObject: {fileID: 1723810235303300} + m_IsPrefabParent: 1 +--- !u!1 &1723810235303300 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4587602474649486} + - component: {fileID: 33699283477361520} + - component: {fileID: 23136522374025466} + - component: {fileID: 114451894822869470} + - component: {fileID: 135508365643771480} + - component: {fileID: 114826848715069466} + - component: {fileID: 114536039364076494} + - component: {fileID: 114380460329550602} + - component: {fileID: 114610899262215960} + - component: {fileID: 54030889479251752} + m_Layer: 0 + m_Name: Planet 1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4587602474649486 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1723810235303300} + m_LocalRotation: {x: -0.00000008940697, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 5, y: 5, z: 5} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &23136522374025466 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1723810235303300} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 148079725ce574b75ae65e81f6be1567, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &33699283477361520 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1723810235303300} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &54030889479251752 +Rigidbody: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1723810235303300} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 0 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &114380460329550602 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1723810235303300} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} + m_Name: + m_EditorClassIdentifier: + debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 + advancedProps: 0 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: 0.3 + useSendMessage: 0 + sendStateChangeMessages: 0 + sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 + requireGestureToFail: {fileID: 0} + friendlyGestures: [] + OnPress: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + ignoreChildren: 0 +--- !u!114 &114451894822869470 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1723810235303300} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 11cabe64e6b9945c88b060d042861428, type: 3} + m_Name: + m_EditorClassIdentifier: + Speed: 100 + RotationSpeed: 30 + FallSpeed: 0.01 +--- !u!114 &114536039364076494 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1723810235303300} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 978a486d8ecf8437cbb87e8534908895, type: 3} + m_Name: + m_EditorClassIdentifier: + enableSmoothing: 0 + smoothingFactor: 0.0001 + positionThreshold: 0.0001 + rotationThreshold: 0.01 + scaleThreshold: 0.0001 + allowChangingFromOutside: 0 +--- !u!114 &114610899262215960 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1723810235303300} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 141e75b9b7edb42df80a22a14f03ae4b, type: 3} + m_Name: + m_EditorClassIdentifier: + debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 + advancedProps: 0 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: 0.3 + useSendMessage: 0 + sendStateChangeMessages: 0 + sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 + requireGestureToFail: {fileID: 0} + friendlyGestures: [] + OnRelease: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + ignoreChildren: 0 +--- !u!114 &114826848715069466 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1723810235303300} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} + m_Name: + m_EditorClassIdentifier: + debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 + advancedProps: 0 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: 0.3 + useSendMessage: 0 + sendStateChangeMessages: 0 + sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 + requireGestureToFail: {fileID: 0} + friendlyGestures: [] + OnTransformStart: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransform: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransformComplete: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + type: 1 + screenTransformThreshold: 0.1 + minScreenPointsDistance: 0.5 + projectionProps: 0 + projection: 1 + projectionPlaneNormal: {x: 0, y: 0, z: 1} +--- !u!135 &135508365643771480 +SphereCollider: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1723810235303300} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: -0.00000071525574, z: -0.00000023841858} diff --git a/Source/Assets/TouchScript/Examples/Portal/Prefabs/Planet 1.prefab.meta b/Source/Assets/TouchScript/Examples/Portal/Prefabs/Planet 1.prefab.meta new file mode 100644 index 000000000..85636ffe9 --- /dev/null +++ b/Source/Assets/TouchScript/Examples/Portal/Prefabs/Planet 1.prefab.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 7c0291284cacbcf4d93907ef9bfae4b9 +timeCreated: 1500762519 +licenseType: Pro +NativeFormatImporter: + mainObjectFileID: 100100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/Portal/Prefabs/Planet 2.prefab b/Source/Assets/TouchScript/Examples/Portal/Prefabs/Planet 2.prefab new file mode 100644 index 000000000..baa1e6e82 --- /dev/null +++ b/Source/Assets/TouchScript/Examples/Portal/Prefabs/Planet 2.prefab @@ -0,0 +1,273 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1001 &100100000 +Prefab: + m_ObjectHideFlags: 1 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: [] + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 0} + m_RootGameObject: {fileID: 1732047919889238} + m_IsPrefabParent: 1 +--- !u!1 &1732047919889238 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4252442136654676} + - component: {fileID: 33531297961261376} + - component: {fileID: 23305764506643510} + - component: {fileID: 114932396362750984} + - component: {fileID: 135434814455161676} + - component: {fileID: 114329650201689084} + - component: {fileID: 114489562153011798} + - component: {fileID: 114347950312683466} + - component: {fileID: 114602335792670362} + - component: {fileID: 54986752027795250} + m_Layer: 0 + m_Name: Planet 2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4252442136654676 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1732047919889238} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 5, y: 5, z: 5} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &23305764506643510 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1732047919889238} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 150b901d18f3f45d08b29f50aaec86b9, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &33531297961261376 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1732047919889238} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &54986752027795250 +Rigidbody: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1732047919889238} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 0 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &114329650201689084 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1732047919889238} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} + m_Name: + m_EditorClassIdentifier: + debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 + advancedProps: 0 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: 0.3 + useSendMessage: 0 + sendStateChangeMessages: 0 + sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 + requireGestureToFail: {fileID: 0} + friendlyGestures: [] + OnTransformStart: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransform: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransformComplete: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + type: 1 + screenTransformThreshold: 0.1 + minScreenPointsDistance: 0.5 + projectionProps: 0 + projection: 1 + projectionPlaneNormal: {x: 0, y: 0, z: 1} +--- !u!114 &114347950312683466 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1732047919889238} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} + m_Name: + m_EditorClassIdentifier: + debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 + advancedProps: 0 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: 0.3 + useSendMessage: 0 + sendStateChangeMessages: 0 + sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 + requireGestureToFail: {fileID: 0} + friendlyGestures: [] + OnPress: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + ignoreChildren: 0 +--- !u!114 &114489562153011798 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1732047919889238} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 978a486d8ecf8437cbb87e8534908895, type: 3} + m_Name: + m_EditorClassIdentifier: + enableSmoothing: 0 + smoothingFactor: 0.0001 + positionThreshold: 0.0001 + rotationThreshold: 0.01 + scaleThreshold: 0.0001 + allowChangingFromOutside: 0 +--- !u!114 &114602335792670362 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1732047919889238} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 141e75b9b7edb42df80a22a14f03ae4b, type: 3} + m_Name: + m_EditorClassIdentifier: + debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 + advancedProps: 0 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: 0.3 + useSendMessage: 0 + sendStateChangeMessages: 0 + sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 + requireGestureToFail: {fileID: 0} + friendlyGestures: [] + OnRelease: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + ignoreChildren: 0 +--- !u!114 &114932396362750984 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1732047919889238} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 11cabe64e6b9945c88b060d042861428, type: 3} + m_Name: + m_EditorClassIdentifier: + Speed: 100 + RotationSpeed: 10 + FallSpeed: 0.01 +--- !u!135 &135434814455161676 +SphereCollider: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1732047919889238} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: -0.00000047683716, z: -0.00000023841858} diff --git a/Source/Assets/TouchScript/Examples/Portal/Prefabs/Planet 2.prefab.meta b/Source/Assets/TouchScript/Examples/Portal/Prefabs/Planet 2.prefab.meta new file mode 100644 index 000000000..7acc63971 --- /dev/null +++ b/Source/Assets/TouchScript/Examples/Portal/Prefabs/Planet 2.prefab.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: bff70878d8bdbdd409be0cca1fc3cfce +timeCreated: 1500762529 +licenseType: Pro +NativeFormatImporter: + mainObjectFileID: 100100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/Portal/Prefabs/Planet 3.prefab b/Source/Assets/TouchScript/Examples/Portal/Prefabs/Planet 3.prefab new file mode 100644 index 000000000..cb583414c --- /dev/null +++ b/Source/Assets/TouchScript/Examples/Portal/Prefabs/Planet 3.prefab @@ -0,0 +1,273 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1001 &100100000 +Prefab: + m_ObjectHideFlags: 1 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: [] + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 0} + m_RootGameObject: {fileID: 1069462480597282} + m_IsPrefabParent: 1 +--- !u!1 &1069462480597282 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4675551579099594} + - component: {fileID: 33212346599330584} + - component: {fileID: 23284574870311418} + - component: {fileID: 114146275313109388} + - component: {fileID: 135509675147651788} + - component: {fileID: 114408875339017466} + - component: {fileID: 114920083122602460} + - component: {fileID: 114757214019137374} + - component: {fileID: 114574854580529156} + - component: {fileID: 54113724369616440} + m_Layer: 0 + m_Name: Planet 3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4675551579099594 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1069462480597282} + m_LocalRotation: {x: -0.00000008940697, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 5, y: 5, z: 5} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &23284574870311418 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1069462480597282} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 10bd026932ba047dcaca956b30263df6, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &33212346599330584 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1069462480597282} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &54113724369616440 +Rigidbody: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1069462480597282} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 0 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &114146275313109388 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1069462480597282} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 11cabe64e6b9945c88b060d042861428, type: 3} + m_Name: + m_EditorClassIdentifier: + Speed: 100 + RotationSpeed: 40 + FallSpeed: 0.01 +--- !u!114 &114408875339017466 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1069462480597282} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} + m_Name: + m_EditorClassIdentifier: + debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 + advancedProps: 0 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: 0.3 + useSendMessage: 0 + sendStateChangeMessages: 0 + sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 + requireGestureToFail: {fileID: 0} + friendlyGestures: [] + OnTransformStart: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransform: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransformComplete: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + type: 1 + screenTransformThreshold: 0.1 + minScreenPointsDistance: 0.5 + projectionProps: 0 + projection: 1 + projectionPlaneNormal: {x: 0, y: 0, z: 1} +--- !u!114 &114574854580529156 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1069462480597282} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 141e75b9b7edb42df80a22a14f03ae4b, type: 3} + m_Name: + m_EditorClassIdentifier: + debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 + advancedProps: 0 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: 0.3 + useSendMessage: 0 + sendStateChangeMessages: 0 + sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 + requireGestureToFail: {fileID: 0} + friendlyGestures: [] + OnRelease: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + ignoreChildren: 0 +--- !u!114 &114757214019137374 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1069462480597282} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} + m_Name: + m_EditorClassIdentifier: + debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 + advancedProps: 0 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: 0.3 + useSendMessage: 0 + sendStateChangeMessages: 0 + sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 + requireGestureToFail: {fileID: 0} + friendlyGestures: [] + OnPress: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + ignoreChildren: 0 +--- !u!114 &114920083122602460 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1069462480597282} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 978a486d8ecf8437cbb87e8534908895, type: 3} + m_Name: + m_EditorClassIdentifier: + enableSmoothing: 0 + smoothingFactor: 0.0001 + positionThreshold: 0.0001 + rotationThreshold: 0.01 + scaleThreshold: 0.0001 + allowChangingFromOutside: 0 +--- !u!135 &135509675147651788 +SphereCollider: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1069462480597282} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0.0000009536743, z: -0.00000023841858} diff --git a/Source/Assets/TouchScript/Examples/Portal/Prefabs/Planet 3.prefab.meta b/Source/Assets/TouchScript/Examples/Portal/Prefabs/Planet 3.prefab.meta new file mode 100644 index 000000000..0a794aa06 --- /dev/null +++ b/Source/Assets/TouchScript/Examples/Portal/Prefabs/Planet 3.prefab.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e6c45ad0ad3ece84b91f569ca505eba9 +timeCreated: 1500762542 +licenseType: Pro +NativeFormatImporter: + mainObjectFileID: 100100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/Portal/Prefabs/Planet 4.prefab b/Source/Assets/TouchScript/Examples/Portal/Prefabs/Planet 4.prefab new file mode 100644 index 000000000..a309dbbd3 --- /dev/null +++ b/Source/Assets/TouchScript/Examples/Portal/Prefabs/Planet 4.prefab @@ -0,0 +1,273 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1001 &100100000 +Prefab: + m_ObjectHideFlags: 1 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: [] + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 0} + m_RootGameObject: {fileID: 1680841336266350} + m_IsPrefabParent: 1 +--- !u!1 &1680841336266350 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4567459449971028} + - component: {fileID: 33214459495948154} + - component: {fileID: 23155191792782146} + - component: {fileID: 114421577017359426} + - component: {fileID: 135886790604417350} + - component: {fileID: 114367742515556682} + - component: {fileID: 114222141242542914} + - component: {fileID: 114974252932633120} + - component: {fileID: 114634450885023396} + - component: {fileID: 54059909185387790} + m_Layer: 0 + m_Name: Planet 4 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4567459449971028 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1680841336266350} + m_LocalRotation: {x: -0.00000008940697, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 5, y: 5, z: 5} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &23155191792782146 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1680841336266350} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 0ed169bc21381479799fe7ba05d2939b, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &33214459495948154 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1680841336266350} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &54059909185387790 +Rigidbody: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1680841336266350} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 0 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &114222141242542914 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1680841336266350} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 978a486d8ecf8437cbb87e8534908895, type: 3} + m_Name: + m_EditorClassIdentifier: + enableSmoothing: 0 + smoothingFactor: 0.0001 + positionThreshold: 0.0001 + rotationThreshold: 0.01 + scaleThreshold: 0.0001 + allowChangingFromOutside: 0 +--- !u!114 &114367742515556682 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1680841336266350} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} + m_Name: + m_EditorClassIdentifier: + debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 + advancedProps: 0 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: 0.3 + useSendMessage: 0 + sendStateChangeMessages: 0 + sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 + requireGestureToFail: {fileID: 0} + friendlyGestures: [] + OnTransformStart: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransform: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + OnTransformComplete: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + type: 1 + screenTransformThreshold: 0.1 + minScreenPointsDistance: 0.5 + projectionProps: 0 + projection: 1 + projectionPlaneNormal: {x: 0, y: 0, z: 1} +--- !u!114 &114421577017359426 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1680841336266350} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 11cabe64e6b9945c88b060d042861428, type: 3} + m_Name: + m_EditorClassIdentifier: + Speed: 100 + RotationSpeed: 20 + FallSpeed: 0.01 +--- !u!114 &114634450885023396 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1680841336266350} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 141e75b9b7edb42df80a22a14f03ae4b, type: 3} + m_Name: + m_EditorClassIdentifier: + debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 + advancedProps: 0 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: 0.3 + useSendMessage: 0 + sendStateChangeMessages: 0 + sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 + requireGestureToFail: {fileID: 0} + friendlyGestures: [] + OnRelease: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + ignoreChildren: 0 +--- !u!114 &114974252932633120 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1680841336266350} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} + m_Name: + m_EditorClassIdentifier: + debugMode: 0 + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + generalProps: 0 + limitsProps: 0 + advancedProps: 0 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: 0.3 + useSendMessage: 0 + sendStateChangeMessages: 0 + sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 + requireGestureToFail: {fileID: 0} + friendlyGestures: [] + OnPress: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + ignoreChildren: 0 +--- !u!135 &135886790604417350 +SphereCollider: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1680841336266350} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: -0.00000047683716, z: -0.00000023841858} diff --git a/Source/Assets/TouchScript/Examples/Portal/Prefabs/Planet 4.prefab.meta b/Source/Assets/TouchScript/Examples/Portal/Prefabs/Planet 4.prefab.meta new file mode 100644 index 000000000..767bf248d --- /dev/null +++ b/Source/Assets/TouchScript/Examples/Portal/Prefabs/Planet 4.prefab.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4d11e87ec08ce584a818342513bf6616 +timeCreated: 1500762549 +licenseType: Pro +NativeFormatImporter: + mainObjectFileID: 100100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/Portal/Scripts/Spawner.cs b/Source/Assets/TouchScript/Examples/Portal/Scripts/Spawner.cs new file mode 100644 index 000000000..db72cea3e --- /dev/null +++ b/Source/Assets/TouchScript/Examples/Portal/Scripts/Spawner.cs @@ -0,0 +1,40 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using System; +using TouchScript.Gestures; +using UnityEngine; + +namespace TouchScript.Examples.Portal +{ + public class Spawner : MonoBehaviour + { + + public Transform Prefab; + public Transform Position; + + private PressGesture press; + + private void OnEnable() + { + press = GetComponent(); + press.Pressed += pressHandler; + } + + private void OnDisable() + { + press.Pressed -= pressHandler; + } + + private void pressHandler(object sender, EventArgs eventArgs) + { + var target = Instantiate(Prefab, Position.parent); + target.position = Position.position; + + LayerManager.Instance.SetExclusive(target); + press.Cancel(true, true); + LayerManager.Instance.ClearExclusive(); + } + } +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Examples/Portal/Scripts/Spawner.cs.meta b/Source/Assets/TouchScript/Examples/Portal/Scripts/Spawner.cs.meta new file mode 100644 index 000000000..5ee5b0f6c --- /dev/null +++ b/Source/Assets/TouchScript/Examples/Portal/Scripts/Spawner.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 712d87efeee01774088f382a8449caab +timeCreated: 1500762320 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Hit/HitData.cs b/Source/Assets/TouchScript/Scripts/Hit/HitData.cs index 86392329b..fb457806d 100644 --- a/Source/Assets/TouchScript/Scripts/Hit/HitData.cs +++ b/Source/Assets/TouchScript/Scripts/Hit/HitData.cs @@ -21,6 +21,8 @@ public struct HitData [Flags] public enum HitType { + Unknown, + ScreenSpace, /// @@ -260,7 +262,7 @@ public HitData(RaycastHit2D value, TouchLayer layer, bool screenSpace = false) : /// /// UI raycast value. public HitData(RaycastHitUI value, TouchLayer layer, bool screenSpace = false) : - this(value.GameObject.transform, layer, screenSpace) + this(value.Target, layer, screenSpace) { raycastHitUI = value; type = HitType.UI; diff --git a/Source/Assets/TouchScript/Scripts/Hit/RaycastHitUI.cs b/Source/Assets/TouchScript/Scripts/Hit/RaycastHitUI.cs index 90ddbe90f..baecde7fc 100644 --- a/Source/Assets/TouchScript/Scripts/Hit/RaycastHitUI.cs +++ b/Source/Assets/TouchScript/Scripts/Hit/RaycastHitUI.cs @@ -11,7 +11,7 @@ namespace TouchScript.Hit public struct RaycastHitUI { - public GameObject GameObject; + public Transform Target; public BaseRaycaster Raycaster; public int GraphicIndex; public int Depth; diff --git a/Source/Assets/TouchScript/Scripts/ILayerManager.cs b/Source/Assets/TouchScript/Scripts/ILayerManager.cs index 233da8c55..4ab871535 100644 --- a/Source/Assets/TouchScript/Scripts/ILayerManager.cs +++ b/Source/Assets/TouchScript/Scripts/ILayerManager.cs @@ -7,6 +7,7 @@ using TouchScript.Hit; using TouchScript.Layers; using TouchScript.Pointers; +using UnityEngine; namespace TouchScript { @@ -20,6 +21,8 @@ public interface ILayerManager int LayerCount { get; } + bool HasExclusive { get; } + /// /// Adds a layer in a specific position. /// @@ -49,5 +52,13 @@ public interface ILayerManager bool GetHitTarget(IPointer pointer, out HitData hit); + void SetExclusive(Transform target, bool includeChildren = false); + + void SetExclusive(IEnumerable targets); + + bool IsExclusive(Transform target); + + void ClearExclusive(); + } } diff --git a/Source/Assets/TouchScript/Scripts/ITouchManager.cs b/Source/Assets/TouchScript/Scripts/ITouchManager.cs index 1696f1190..d02d706ff 100644 --- a/Source/Assets/TouchScript/Scripts/ITouchManager.cs +++ b/Source/Assets/TouchScript/Scripts/ITouchManager.cs @@ -139,6 +139,8 @@ public interface ITouchManager /// An unsorted list of all pointers which were pressed but not released yet. IList PressedPointers { get; } + bool IsInsidePointerFrame { get; } + /// /// Adds an input source. /// diff --git a/Source/Assets/TouchScript/Scripts/LayerManagerInstance.cs b/Source/Assets/TouchScript/Scripts/LayerManagerInstance.cs index 19015d66d..67a0ff3db 100644 --- a/Source/Assets/TouchScript/Scripts/LayerManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/LayerManagerInstance.cs @@ -50,6 +50,11 @@ public int LayerCount get { return layerCount; } } + public bool HasExclusive + { + get { return exclusiveCount > 0; } + } + #endregion #region Private variables @@ -57,9 +62,21 @@ public int LayerCount private static LayerManagerInstance instance; private static bool shuttingDown = false; + private ITouchManager manager; private List layers = new List(10); private int layerCount = 0; + private HashSet exclusive = new HashSet(); + private int exclusiveCount = 0; + private int clearExclusiveDelay = -1; + + #endregion + + #region Temporary variables + + // Used in SetExclusive(). + private List tmpList = new List(20); + #endregion #region Public methods @@ -150,6 +167,46 @@ public bool GetHitTarget(IPointer pointer, out HitData hit) return false; } + /// + public void SetExclusive(Transform target, bool includeChildren = false) + { + if (target == null) return; + exclusive.Clear(); + clearExclusiveDelay = -1; + + exclusive.Add(target.GetHashCode()); + exclusiveCount = 1; + if (includeChildren) + { + target.GetComponentsInChildren(tmpList); + foreach (var t in tmpList) exclusive.Add(t.GetHashCode()); + exclusiveCount += tmpList.Count; + } + } + + public void SetExclusive(IEnumerable targets) + { + if (targets == null) return; + exclusive.Clear(); + clearExclusiveDelay = -1; + + foreach (var t in targets) + { + exclusive.Add(t.GetHashCode()); + exclusiveCount++; + } + } + + public bool IsExclusive(Transform target) + { + return exclusive.Contains(target.GetHashCode()); + } + + public void ClearExclusive() + { + clearExclusiveDelay = manager.IsInsidePointerFrame ? 2 : 1; + } + #endregion #region Unity @@ -166,10 +223,22 @@ private void Awake() return; } + manager = TouchManager.Instance; + gameObject.hideFlags = HideFlags.HideInHierarchy; DontDestroyOnLoad(gameObject); } + private void OnEnable() + { + manager.FrameFinished += frameFinishedHandler; + } + + private void OnDisable() + { + manager.FrameFinished -= frameFinishedHandler; + } + private void OnApplicationQuit() { shuttingDown = true; @@ -181,5 +250,19 @@ private void OnApplicationQuit() #endregion + #region Event handlers + + private void frameFinishedHandler(object sender, EventArgs eventArgs) + { + clearExclusiveDelay--; + if (clearExclusiveDelay == 0) + { + exclusive.Clear(); + exclusiveCount = 0; + } + } + + #endregion + } } diff --git a/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs index dec5d47b5..cecf79a8a 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs @@ -298,7 +298,8 @@ private HitResult performWorldSearch(IPointer pointer, out HitData hit) var ray = _camera.ScreenPointToRay(position); int count; - + bool exclusiveSet = manager.HasExclusive; + if (hit3DObjects) { #if UNITY_5_3_OR_NEWER @@ -311,11 +312,20 @@ private HitResult performWorldSearch(IPointer pointer, out HitData hit) // Try to do some optimizations if 2D and WS UI are not required if (!hit2DObjects && !hitWorldSpaceUI) { + RaycastHit raycast; + if (count == 0) return HitResult.Miss; if (count > 1) { raycastHitList.Clear(); - for (var i = 0; i < count; i++) raycastHitList.Add(raycastHits[i]); + for (var i = 0; i < count; i++) + { + raycast = raycastHits[i]; + if (exclusiveSet && !manager.IsExclusive(raycast.transform)) continue; + raycastHitList.Add(raycast); + } + if (raycastHitList.Count == 0) return HitResult.Miss; + raycastHitList.Sort(_raycastHitComparerFunc); if (useHitFilters) { @@ -329,17 +339,30 @@ private HitResult performWorldSearch(IPointer pointer, out HitData hit) hit = new HitData(raycastHitList[0], this); return HitResult.Hit; } - if (useHitFilters) return doHit(pointer, raycastHits[0], out hit); - hit = new HitData(raycastHits[0], this); + + raycast = raycastHits[0]; + if (exclusiveSet && !manager.IsExclusive(raycast.transform)) return HitResult.Miss; + if (useHitFilters) return doHit(pointer, raycast, out hit); + hit = new HitData(raycast, this); return HitResult.Hit; } - for (var i = 0; i < count; i++) hitList.Add(new HitData(raycastHits[i], this)); + for (var i = 0; i < count; i++) + { + var raycast = raycastHits[i]; + if (exclusiveSet && !manager.IsExclusive(raycast.transform)) continue; + hitList.Add(new HitData(raycastHits[i], this)); + } } if (hit2DObjects) { count = Physics2D.GetRayIntersectionNonAlloc(ray, raycastHits2D, float.MaxValue, layerMask); - for (var i = 0; i < count; i++) hitList.Add(new HitData(raycastHits2D[i], this)); + for (var i = 0; i < count; i++) + { + var raycast = raycastHits2D[i]; + if (exclusiveSet && !manager.IsExclusive(raycast.transform)) continue; + hitList.Add(new HitData(raycast, this)); + } } if (hitWorldSpaceUI) @@ -390,7 +413,6 @@ private HitResult performWorldSearch(IPointer pointer, out HitData hit) private HitResult performSSUISearch(IPointer pointer, out HitData hit) { hit = default(HitData); - raycastHitUIList.Clear(); if (raycasters == null) raycasters = TouchScriptInputModule.Instance.GetRaycasters(); @@ -419,9 +441,11 @@ private HitResult performSSUISearch(IPointer pointer, out HitData hit) } return HitResult.Miss; } + hit = new HitData(raycastHitUIList[0], this, true); return HitResult.Hit; } + if (useHitFilters) return doHit(pointer, raycastHitUIList[0], out hit); hit = new HitData(raycastHitUIList[0], this, true); return HitResult.Hit; @@ -431,11 +455,15 @@ private HitResult performSSUISearch(IPointer pointer, out HitData hit) { var position = pointer.Position; var foundGraphics = GraphicRegistry.GetGraphicsForCanvas(canvas); - var count2 = foundGraphics.Count; + var count = foundGraphics.Count; + var exclusiveSet = manager.HasExclusive; - for (var j = 0; j < count2; j++) + for (var i = 0; i < count; i++) { - var graphic = foundGraphics[j]; + var graphic = foundGraphics[i]; + var t = graphic.transform; + + if (exclusiveSet && !manager.IsExclusive(t)) continue; if ((layerMask.value != -1) && ((layerMask.value & (1 << graphic.gameObject.layer)) == 0)) continue; @@ -448,7 +476,6 @@ private HitResult performSSUISearch(IPointer pointer, out HitData hit) if (graphic.Raycast(position, eventCamera)) { - var t = graphic.transform; if (raycaster.ignoreReversedGraphics) if (eventCamera == null) { @@ -481,7 +508,7 @@ private HitResult performSSUISearch(IPointer pointer, out HitData hit) raycastHitUIList.Add( new RaycastHitUI() { - GameObject = graphic.gameObject, + Target = graphic.transform, Raycaster = raycaster, Graphic = graphic, GraphicIndex = raycastHitUIList.Count, diff --git a/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs index 310a41eb0..bac37aa4e 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs @@ -74,6 +74,12 @@ public virtual Vector3 WorldProjectionNormal /// protected ProjectionParams layerProjectionParams; + protected ILayerManager manager; + + #endregion + + #region Temporary variables + private List tmpHitTestList = new List(10); #endregion @@ -120,6 +126,7 @@ protected virtual void Awake() setName(); if (!Application.isPlaying) return; + manager = LayerManager.Instance; layerProjectionParams = createProjectionParams(); StartCoroutine(lateAwake()); } @@ -129,7 +136,7 @@ private IEnumerator lateAwake() yield return null; // Add ourselves after TouchManager finished adding layers in order - LayerManager.Instance.AddLayer(this, -1, false); + manager.AddLayer(this, -1, false); } // To be able to turn layers off @@ -143,7 +150,7 @@ protected virtual void OnDestroy() if (!Application.isPlaying || TouchManager.Instance == null) return; StopAllCoroutines(); - LayerManager.Instance.RemoveLayer(this); + manager.RemoveLayer(this); } #endregion diff --git a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs index 09c769611..32ab4000b 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs @@ -394,7 +394,7 @@ protected void RemovePointerData(int id) private void convertRaycast(RaycastHitUI old, ref RaycastResult current) { current.module = old.Raycaster; - current.gameObject = old.GameObject; + current.gameObject = old.Target == null ? null : old.Target.gameObject; current.depth = old.Depth; current.index = old.GraphicIndex; current.sortingLayer = old.SortingLayer; diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs index 81d1c12e4..e20f01d9e 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs @@ -200,6 +200,8 @@ public IList PressedPointers get { return new List(pressedPointers); } } + public bool IsInsidePointerFrame { get; private set; } + #endregion #region Private variables @@ -913,6 +915,8 @@ private void sendFrameStartedToPointers() private void updatePointers() { samplerUpdatePointers.Begin(); + + IsInsidePointerFrame = true; if (frameStartedInvoker != null) frameStartedInvoker.InvokeHandleExceptions(this, EventArgs.Empty); // need to copy buffers since they might get updated during execution @@ -1001,6 +1005,8 @@ private void updatePointers() } if (frameFinishedInvoker != null) frameFinishedInvoker.InvokeHandleExceptions(this, EventArgs.Empty); + IsInsidePointerFrame = false; + samplerUpdatePointers.End(); } From 87c35248266bf1f75fd009a5012278fc3d9780c1 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 23 Jul 2017 06:28:55 +0300 Subject: [PATCH 28/58] Updated docs and formatting. --- .../Behaviors/Cursors/CursorManager.cs | 22 ++- .../Scripts/Behaviors/Cursors/MouseCursor.cs | 38 +++-- .../Scripts/Behaviors/Cursors/ObjectCursor.cs | 29 +++- .../Scripts/Behaviors/Cursors/PenCursor.cs | 48 ++++-- .../Behaviors/Cursors/PointerCursor.cs | 76 ++++++--- .../Scripts/Behaviors/Cursors/TouchCursor.cs | 26 ++- .../Behaviors/Cursors/UI/GradientTexture.cs | 37 +++- .../Behaviors/Cursors/UI/TextureSwitch.cs | 12 +- .../Scripts/DebuggableMonoBehaviour.cs | 2 +- .../Debugging/Filters/IPointerDataFilter.cs | 9 +- .../Debugging/Filters/IPointerLogFilter.cs | 11 +- .../Debugging/Filters/PointerLogFilter.cs | 21 ++- .../Debugging/Loggers/IPointerLogger.cs | 42 ++++- .../Debugging/Loggers/PointerLogger.cs | 33 +++- .../Scripts/Debugging/TouchScriptDebugger.cs | 19 ++- .../Scripts/Devices/Display/DisplayDevice.cs | 10 +- .../Devices/Display/GenericDisplayDevice.cs | 9 +- .../Scripts/Devices/Display/IDisplayDevice.cs | 15 +- .../Scripts/GestureManagerInstance.cs | 6 +- .../Assets/TouchScript/Scripts/Hit/HitData.cs | 22 ++- .../TouchScript/Scripts/Hit/RaycastHitUI.cs | 34 ++-- .../Assets/TouchScript/Scripts/IDebuggable.cs | 2 +- .../TouchScript/Scripts/ILayerManager.cs | 47 ++++- .../TouchScript/Scripts/ITouchManager.cs | 9 + .../Scripts/InputSources/IInputSource.cs | 4 +- .../InputHandlers/MouseHandler.cs | 3 + .../InputHandlers/TouchHandler.cs | 2 +- .../InputHandlers/WindowsPointerHandlers.cs | 24 ++- .../Scripts/InputSources/InputSource.cs | 12 +- .../TouchScript/Scripts/LayerManager.cs | 8 +- .../Scripts/LayerManagerInstance.cs | 15 +- .../Scripts/Layers/StandardLayer.cs | 68 +++++--- .../TouchScript/Scripts/Layers/TouchLayer.cs | 25 ++- .../Layers/UI/TouchScriptInputModule.cs | 120 +++++++------ .../Scripts/Pointers/FakePointer.cs | 13 ++ .../TouchScript/Scripts/Pointers/IPointer.cs | 8 +- .../Scripts/Pointers/MousePointer.cs | 6 +- .../Scripts/Pointers/ObjectPointer.cs | 16 ++ .../Scripts/Pointers/PenPointer.cs | 16 ++ .../TouchScript/Scripts/Pointers/Pointer.cs | 32 ++-- .../Scripts/Pointers/PointerFactory.cs | 4 +- .../Scripts/Pointers/TouchPointer.cs | 16 ++ .../TouchScript/Scripts/TouchManager.cs | 121 +++++++------ .../Scripts/TouchManagerInstance.cs | 11 +- .../TouchScript/Scripts/Utils/BinaryUtils.cs | 24 ++- .../Scripts/Utils/EventHandlerExtensions.cs | 2 +- .../TouchScript/Scripts/Utils/ObjectPool.cs | 9 +- .../Scripts/Utils/Platform/WindowsUtils.cs | 45 ++--- .../TouchScript/Scripts/Utils/PointerUtils.cs | 160 +++++++++++------- .../Scripts/Utils/TransformUtils.cs | 37 +++- 50 files changed, 965 insertions(+), 415 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs index 7a5895067..896445cea 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs @@ -14,29 +14,40 @@ namespace TouchScript.Behaviors.Cursors /// Pointer visualizer which shows pointer circles with debug text using Unity UI. /// The script should be placed on an element with RectTransform or a Canvas. A reference prefab is provided in TouchScript package. /// - [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Behaviors_Visualizer_TouchVisualizer.htm")] public class CursorManager : MonoBehaviour { #region Public properties + /// + /// Prefab to use as mouse cursors template. + /// public PointerCursor MouseCursor { get { return mouseCursor; } set { mouseCursor = value; } } + /// + /// Prefab to use as touch cursors template. + /// public PointerCursor TouchCursor { get { return touchCursor; } set { touchCursor = value; } } + /// + /// Prefab to use as pen cursors template. + /// public PointerCursor PenCursor { get { return penCursor; } set { penCursor = value; } } + /// + /// Prefab to use as object cursors template. + /// public PointerCursor ObjectCursor { get { return objectCursor; } @@ -71,6 +82,9 @@ public float CursorSize } } + /// + /// Cursor size in pixels. + /// public uint CursorPixelSize { get { return cursorPixelSize; } @@ -198,7 +212,7 @@ private void clearProxy(PointerCursor cursor) private void updateCursorSize() { - if (useDPI) cursorPixelSize = (uint)(cursorSize * TouchManager.Instance.DotsPerCentimeter); + if (useDPI) cursorPixelSize = (uint) (cursorSize * TouchManager.Instance.DotsPerCentimeter); } #endregion @@ -277,7 +291,7 @@ private void pointersPressedHandler(object sender, PointerEventArgs e) var pointer = e.Pointers[i]; PointerCursor cursor; if (!cursors.TryGetValue(pointer.Id, out cursor)) continue; - cursor.SetState(pointer, PointerCursor.ProxyState.Pressed); + cursor.SetState(pointer, PointerCursor.CursorState.Pressed); } } @@ -301,7 +315,7 @@ private void pointersReleasedHandler(object sender, PointerEventArgs e) var pointer = e.Pointers[i]; PointerCursor cursor; if (!cursors.TryGetValue(pointer.Id, out cursor)) continue; - cursor.SetState(pointer, PointerCursor.ProxyState.Released); + cursor.SetState(pointer, PointerCursor.CursorState.Released); } } diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/MouseCursor.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/MouseCursor.cs index 71c484bfb..764942022 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/MouseCursor.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/MouseCursor.cs @@ -1,4 +1,4 @@ -/* +/* * @author Valentin Simonov / http://va.lent.in/ */ @@ -6,38 +6,47 @@ using TouchScript.Behaviors.Cursors.UI; using TouchScript.Pointers; using TouchScript.Utils; -using UnityEngine; namespace TouchScript.Behaviors.Cursors { + /// + /// Cursor for mouse pointers. + /// public class MouseCursor : TextPointerCursor { #region Public properties + /// + /// Default cursor sub object. + /// public TextureSwitch DefaultCursor; + + /// + /// Pressed cursor sub object. + /// public TextureSwitch PressedCursor; + /// + /// Should the value of be shown on the cursor. + /// public bool ShowButtons = false; #endregion - #region Public methods - - #endregion - #region Protected methods + /// protected override void updateOnce(IPointer pointer) { switch (state) { - case ProxyState.Released: - case ProxyState.Over: + case CursorState.Released: + case CursorState.Over: if (DefaultCursor != null) DefaultCursor.Show(); if (PressedCursor != null) PressedCursor.Hide(); break; - case ProxyState.Pressed: - case ProxyState.OverPressed: + case CursorState.Pressed: + case CursorState.OverPressed: if (DefaultCursor != null) DefaultCursor.Hide(); if (PressedCursor != null) PressedCursor.Show(); break; @@ -46,6 +55,7 @@ protected override void updateOnce(IPointer pointer) base.updateOnce(pointer); } + /// protected override void generateText(MousePointer pointer, StringBuilder str) { base.generateText(pointer, str); @@ -58,16 +68,18 @@ protected override void generateText(MousePointer pointer, StringBuilder str) } } - protected override bool shouldShowText() + /// + protected override bool textIsVisible() { - return base.shouldShowText() || ShowButtons; + return base.textIsVisible() || ShowButtons; } + /// protected override uint gethash(MousePointer pointer) { var hash = base.gethash(pointer); - if (ShowButtons == true) hash += (uint) (pointer.Buttons & Pointer.PointerButtonState.AnyButtonPressed); + if (ShowButtons) hash += (uint) (pointer.Buttons & Pointer.PointerButtonState.AnyButtonPressed); return hash; } diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/ObjectCursor.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/ObjectCursor.cs index 65038732f..9a7c0d7d0 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/ObjectCursor.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/ObjectCursor.cs @@ -1,4 +1,4 @@ -/* +/* * @author Valentin Simonov / http://va.lent.in/ */ @@ -7,24 +7,33 @@ namespace TouchScript.Behaviors.Cursors { + /// + /// Cursor for object pointers. + /// public class ObjectCursor : TextPointerCursor { #region Public properties + /// + /// Should the value of be shown on the cursor. + /// public bool ShowObjectId = false; + /// + /// Should the values of and be shown on the cursor. + /// public bool ShowSize = false; + /// + /// Should the value of be shown on the cursor. + /// public bool ShowAngle = false; #endregion - #region Public methods - - #endregion - #region Protected methods + /// protected override void generateText(ObjectPointer pointer, StringBuilder str) { base.generateText(pointer, str); @@ -51,17 +60,19 @@ protected override void generateText(ObjectPointer pointer, StringBuilder str) } } - protected override bool shouldShowText() + /// + protected override bool textIsVisible() { - return base.shouldShowText() || ShowObjectId || ShowSize || ShowAngle; + return base.textIsVisible() || ShowObjectId || ShowSize || ShowAngle; } + /// protected override uint gethash(ObjectPointer pointer) { var hash = base.gethash(pointer); - if (ShowSize == true) hash += (uint) (pointer.Width * 1024 + pointer.Height * 1024 * 1024) << 8; - if (ShowAngle == true) hash += (uint) (pointer.Angle * 1024) << 24; + if (ShowSize) hash += (uint) (pointer.Width * 1024 + pointer.Height * 1024 * 1024) << 8; + if (ShowAngle) hash += (uint) (pointer.Angle * 1024) << 24; return hash; } diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PenCursor.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PenCursor.cs index 3cf612b66..93fe111d8 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PenCursor.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PenCursor.cs @@ -1,4 +1,4 @@ -/* +/* * @author Valentin Simonov / http://va.lent.in/ */ @@ -6,42 +6,57 @@ using TouchScript.Behaviors.Cursors.UI; using TouchScript.Pointers; using TouchScript.Utils; -using UnityEngine; namespace TouchScript.Behaviors.Cursors { + /// + /// Cursor for pen pointers. + /// public class PenCursor : TextPointerCursor { #region Public properties + /// + /// Default cursor sub object. + /// public TextureSwitch DefaultCursor; + + /// + /// Pressed cursor sub object. + /// public TextureSwitch PressedCursor; + /// + /// Should the value of be shown on the cursor. + /// public bool ShowButtons = false; + /// + /// Should the value of be shown on the cursor. + /// public bool ShowPressure = false; + /// + /// Should the value of be shown on the cursor. + /// public bool ShowRotation = false; #endregion - #region Public methods - - #endregion - #region Protected methods + /// protected override void updateOnce(IPointer pointer) { switch (state) { - case ProxyState.Released: - case ProxyState.Over: + case CursorState.Released: + case CursorState.Over: if (DefaultCursor != null) DefaultCursor.Show(); if (PressedCursor != null) PressedCursor.Hide(); break; - case ProxyState.Pressed: - case ProxyState.OverPressed: + case CursorState.Pressed: + case CursorState.OverPressed: if (DefaultCursor != null) DefaultCursor.Hide(); if (PressedCursor != null) PressedCursor.Show(); break; @@ -50,6 +65,7 @@ protected override void updateOnce(IPointer pointer) base.updateOnce(pointer); } + /// protected override void generateText(PenPointer pointer, StringBuilder str) { base.generateText(pointer, str); @@ -74,18 +90,20 @@ protected override void generateText(PenPointer pointer, StringBuilder str) } } - protected override bool shouldShowText() + /// + protected override bool textIsVisible() { - return base.shouldShowText() || ShowButtons || ShowPressure || ShowRotation; + return base.textIsVisible() || ShowButtons || ShowPressure || ShowRotation; } + /// protected override uint gethash(PenPointer pointer) { var hash = base.gethash(pointer); - if (ShowButtons == true) hash += (uint) (pointer.Buttons & Pointer.PointerButtonState.AnyButtonPressed); - if (ShowPressure == true) hash += (uint) (pointer.Pressure * 1024) << 8; - if (ShowRotation == true) hash += (uint) (pointer.Rotation * 1024) << 16; + if (ShowButtons) hash += (uint) (pointer.Buttons & Pointer.PointerButtonState.AnyButtonPressed); + if (ShowPressure) hash += (uint) (pointer.Pressure * 1024) << 8; + if (ShowRotation) hash += (uint) (pointer.Rotation * 1024) << 16; return hash; } diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PointerCursor.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PointerCursor.cs index c99ebf65b..b58b5bcc4 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PointerCursor.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PointerCursor.cs @@ -1,4 +1,4 @@ -/* +/* * @author Valentin Simonov / http://va.lent.in/ */ @@ -11,23 +11,22 @@ namespace TouchScript.Behaviors.Cursors { /// - /// Visual cursor implementation used by TouchScript. + /// Abstract class for pointer cursors with text. /// - [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Behaviors_Visualizer_TouchProxy.htm")] + /// Pointer type. + /// public abstract class TextPointerCursor : PointerCursor where T : IPointer { #region Public properties /// - /// Gets or sets a value indicating whether pointer id text should be displayed on screen. + /// Should the value of be shown on screen on the cursor. /// - /// true if pointer id text should be displayed on screen; otherwise, false. public bool ShowPointerId = true; /// - /// Gets or sets a value indicating whether pointer flags text should be displayed on screen. + /// Should the value of be shown on screen on the cursor. /// - /// true if pointer flags text should be displayed on screen; otherwise, false. public bool ShowFlags = false; /// @@ -43,10 +42,6 @@ public abstract class TextPointerCursor : PointerCursor where T : IPointer #endregion - #region Public methods - - #endregion - #region Protected methods /// @@ -55,7 +50,7 @@ protected override void updateOnce(IPointer pointer) base.updateOnce(pointer); if (Text == null) return; - if (!shouldShowText()) + if (!textIsVisible()) { Text.enabled = false; return; @@ -68,6 +63,11 @@ protected override void updateOnce(IPointer pointer) Text.text = stringBuilder.ToString(); } + /// + /// Generates text for pointer. + /// + /// The pointer. + /// The string builder to use. protected virtual void generateText(T pointer, StringBuilder str) { if (ShowPointerId) @@ -83,11 +83,20 @@ protected virtual void generateText(T pointer, StringBuilder str) } } - protected virtual bool shouldShowText() + /// + /// Indicates if text should be visible. + /// + /// True if pointer text should be displayed; false otherwise. + protected virtual bool textIsVisible() { return ShowPointerId || ShowFlags; } + /// + /// Typed version of . Returns a hash of a cursor state. + /// + /// The pointer. + /// Integer hash. protected virtual uint gethash(T pointer) { var hash = (uint) state; @@ -95,6 +104,7 @@ protected virtual uint gethash(T pointer) return hash; } + /// protected sealed override uint getPointerHash(IPointer pointer) { return gethash((T) pointer); @@ -104,13 +114,16 @@ protected sealed override uint getPointerHash(IPointer pointer) } /// - /// Base class for cursors. + /// Visual cursor implementation used by TouchScript. /// public class PointerCursor : MonoBehaviour { #region Consts - public enum ProxyState + /// + /// Possible states of a cursor. + /// + public enum CursorState { Released, Pressed, @@ -123,9 +136,8 @@ public enum ProxyState #region Public properties /// - /// Gets or sets cursor size. + /// Cursor size in pixels. /// - /// Cursor size in pixels. public float Size { get { return size; } @@ -148,7 +160,14 @@ public float Size #region Private variables - protected ProxyState state; + /// + /// Current cursor state. + /// + protected CursorState state; + + /// + /// CUrrent cursor state data. + /// protected object stateData; /// @@ -161,8 +180,14 @@ public float Size /// protected float size = 0; + /// + /// Initial cursor size in pixels. + /// protected float defaultSize; + /// + /// Last data hash. + /// protected uint hash = uint.MaxValue; #endregion @@ -181,7 +206,7 @@ public void Init(RectTransform parent, IPointer pointer) show(); rect.SetParent(parent); rect.SetAsLastSibling(); - state = ProxyState.Released; + state = CursorState.Released; UpdatePointer(pointer); } @@ -199,7 +224,13 @@ public void UpdatePointer(IPointer pointer) update(pointer); } - public void SetState(IPointer pointer, ProxyState newState, object data = null) + /// + /// Sets the state of the cursor. + /// + /// The pointer. + /// The new state. + /// State data. + public void SetState(IPointer pointer, CursorState newState, object data = null) { state = newState; stateData = data; @@ -267,6 +298,11 @@ protected virtual void updateOnce(IPointer pointer) {} /// The pointer. protected virtual void update(IPointer pointer) {} + /// + /// Returns pointer hash. + /// + /// The pointer. + /// Integer hash value. protected virtual uint getPointerHash(IPointer pointer) { return (uint) state; diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/TouchCursor.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/TouchCursor.cs index fb5bf4223..725b1cf91 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/TouchCursor.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/TouchCursor.cs @@ -1,4 +1,4 @@ -/* +/* * @author Valentin Simonov / http://va.lent.in/ */ @@ -7,22 +7,28 @@ namespace TouchScript.Behaviors.Cursors { + /// + /// Cursor for touch pointers. + /// public class TouchCursor : TextPointerCursor { #region Public properties + /// + /// Should the value of be shown on the cursor. + /// public bool ShowPressure = false; + /// + /// Should the value of be shown on the cursor. + /// public bool ShowRotation = false; #endregion - #region Public methods - - #endregion - #region Protected methods + /// protected override void generateText(TouchPointer pointer, StringBuilder str) { base.generateText(pointer, str); @@ -41,17 +47,19 @@ protected override void generateText(TouchPointer pointer, StringBuilder str) } } - protected override bool shouldShowText() + /// + protected override bool textIsVisible() { - return base.shouldShowText() || ShowPressure || ShowRotation; + return base.textIsVisible() || ShowPressure || ShowRotation; } + /// protected override uint gethash(TouchPointer pointer) { var hash = base.gethash(pointer); - if (ShowPressure == true) hash += (uint) (pointer.Pressure * 1024) << 8; - if (ShowRotation == true) hash += (uint) (pointer.Rotation * 1024) << 16; + if (ShowPressure) hash += (uint) (pointer.Pressure * 1024) << 8; + if (ShowRotation) hash += (uint) (pointer.Rotation * 1024) << 16; return hash; } diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI/GradientTexture.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI/GradientTexture.cs index 635177054..51c62a463 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI/GradientTexture.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI/GradientTexture.cs @@ -9,9 +9,14 @@ namespace TouchScript.Behaviors.Cursors.UI { + /// + /// Generates a texture with a circle gradient. + /// public class GradientTexture : MonoBehaviour { - + /// + /// Resolution in pixels. + /// public enum Res { Pix16 = 16, @@ -22,23 +27,39 @@ public enum Res Pix512 = 512 } + /// + /// The gradient. + /// public Gradient Gradient = new Gradient(); + + /// + /// Gradient's name. Used to cache textures. + /// public string Name = "Gradient"; + + /// + /// Texture resolution. + /// public Res Resolution = Res.Pix128; private Texture2D texture; + private static Dictionary textureCache = new Dictionary(); - private static Dictionary textureCache = new Dictionary(); - + /// + /// Generates the gradient texture. + /// + /// Generated texture. public Texture2D Generate() { var res = (int) Resolution; - var tex = new Texture2D(res, 1, TextureFormat.ARGB32, false, true); - tex.name = Name; - tex.filterMode = FilterMode.Bilinear; - tex.wrapMode = TextureWrapMode.Clamp; + var tex = new Texture2D(res, 1, TextureFormat.ARGB32, false, true) + { + name = Name, + filterMode = FilterMode.Bilinear, + wrapMode = TextureWrapMode.Clamp + }; - Color[] colors = new Color[res]; + var colors = new Color[res]; float div = res; for (var i = 0; i < res; i++) { diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI/TextureSwitch.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI/TextureSwitch.cs index 5dd752037..50d6e8d4e 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI/TextureSwitch.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI/TextureSwitch.cs @@ -1,22 +1,30 @@ -/* +/* * @author Valentin Simonov / http://va.lent.in/ */ using UnityEngine; -using UnityEngine.UI; namespace TouchScript.Behaviors.Cursors.UI { + /// + /// A helper class to turn on and off without causing allocations. + /// public class TextureSwitch : MonoBehaviour { private CanvasRenderer r; + /// + /// Shows this instance. + /// public void Show() { r.SetAlpha(1); } + /// + /// Hides this instance. + /// public void Hide() { r.SetAlpha(0); diff --git a/Source/Assets/TouchScript/Scripts/DebuggableMonoBehaviour.cs b/Source/Assets/TouchScript/Scripts/DebuggableMonoBehaviour.cs index 89fd419ad..ba763d0c0 100644 --- a/Source/Assets/TouchScript/Scripts/DebuggableMonoBehaviour.cs +++ b/Source/Assets/TouchScript/Scripts/DebuggableMonoBehaviour.cs @@ -1,4 +1,4 @@ -/* +/* * @author Valentin Simonov / http://va.lent.in/ */ diff --git a/Source/Assets/TouchScript/Scripts/Debugging/Filters/IPointerDataFilter.cs b/Source/Assets/TouchScript/Scripts/Debugging/Filters/IPointerDataFilter.cs index 4127ec98f..f6493d49f 100644 --- a/Source/Assets/TouchScript/Scripts/Debugging/Filters/IPointerDataFilter.cs +++ b/Source/Assets/TouchScript/Scripts/Debugging/Filters/IPointerDataFilter.cs @@ -1,13 +1,16 @@ -/* +/* * @author Valentin Simonov / http://va.lent.in/ */ -#if TOUCHSCRIPT_DEBUG +using TouchScript.Debugging.Loggers; -using UnityEngine; +#if TOUCHSCRIPT_DEBUG namespace TouchScript.Debugging.Filters { + /// + /// A filter of pointer data for . + /// public interface IPointerDataFilter { diff --git a/Source/Assets/TouchScript/Scripts/Debugging/Filters/IPointerLogFilter.cs b/Source/Assets/TouchScript/Scripts/Debugging/Filters/IPointerLogFilter.cs index 7c729e03c..36565637d 100644 --- a/Source/Assets/TouchScript/Scripts/Debugging/Filters/IPointerLogFilter.cs +++ b/Source/Assets/TouchScript/Scripts/Debugging/Filters/IPointerLogFilter.cs @@ -1,16 +1,23 @@ -/* +/* * @author Valentin Simonov / http://va.lent.in/ */ #if TOUCHSCRIPT_DEBUG using TouchScript.Debugging.Loggers; -using UnityEngine; namespace TouchScript.Debugging.Filters { + /// + /// A filter of event data for . + /// public interface IPointerLogFilter { + /// + /// Checks if an event should be filtered. + /// + /// The log eveny. + /// True if the event should be filtered; false otherwise. bool Applies(ref PointerLog log); } } diff --git a/Source/Assets/TouchScript/Scripts/Debugging/Filters/PointerLogFilter.cs b/Source/Assets/TouchScript/Scripts/Debugging/Filters/PointerLogFilter.cs index df285cc2a..39d63ed45 100644 --- a/Source/Assets/TouchScript/Scripts/Debugging/Filters/PointerLogFilter.cs +++ b/Source/Assets/TouchScript/Scripts/Debugging/Filters/PointerLogFilter.cs @@ -1,4 +1,4 @@ -/* +/* * @author Valentin Simonov / http://va.lent.in/ */ @@ -8,24 +8,31 @@ namespace TouchScript.Debugging.Filters { + /// + /// An event log filter which filters data by events. + /// + /// public class PointerLogFilter : IPointerLogFilter { - + /// + /// A binary mask of events based on values. + /// public uint EventMask { get; set; } + /// + /// Initializes a new instance of the class. + /// public PointerLogFilter() { EventMask = uint.MaxValue; } + /// public bool Applies(ref PointerLog log) { - var evt = (int)log.Event; - if ((EventMask & (uint)(1 << evt)) == 0) return false; - - return true; + var evt = (int) log.Event; + return (EventMask & (uint) (1 << evt)) != 0; } - } } diff --git a/Source/Assets/TouchScript/Scripts/Debugging/Loggers/IPointerLogger.cs b/Source/Assets/TouchScript/Scripts/Debugging/Loggers/IPointerLogger.cs index 53d0dda63..ce0b14218 100644 --- a/Source/Assets/TouchScript/Scripts/Debugging/Loggers/IPointerLogger.cs +++ b/Source/Assets/TouchScript/Scripts/Debugging/Loggers/IPointerLogger.cs @@ -1,4 +1,4 @@ -/* +/* * @author Valentin Simonov / http://va.lent.in/ */ @@ -13,15 +13,44 @@ namespace TouchScript.Debugging.Loggers { + /// + /// A logger to record pointer events. + /// public interface IPointerLogger { + /// + /// The number of different pointers recorded by this logger. + /// int PointerCount { get; } + /// + /// Logs the specified event. + /// + /// The pointer. + /// The event. void Log(Pointer pointer, PointerEvent evt); + + + /// + /// Returns a list of pointers. + /// + /// The filter to use. + /// A list of objects. List GetFilteredPointerData(IPointerDataFilter filter = null); + + + /// + /// Returns a lost of pointer events for a pointer. + /// + /// The pointer id. + /// The filter to use. + /// A list of entries. List GetFilteredLogsForPointer(int id, IPointerLogFilter filter = null); } + /// + /// Pointer event. + /// [Serializable] public struct PointerLog { @@ -32,6 +61,9 @@ public struct PointerLog public PointerState State; } + /// + /// Pointer state during an event. + /// [Serializable] public struct PointerState { @@ -43,6 +75,9 @@ public struct PointerState public string TargetPath; } + /// + /// Static pointer data. + /// [Serializable] public struct PointerData { @@ -51,10 +86,13 @@ public struct PointerData public IInputSource InputSource; } + /// + /// Pointer event type. + /// public enum PointerEvent { None, - IDAllocated, + IdAllocated, Added, Updated, Pressed, diff --git a/Source/Assets/TouchScript/Scripts/Debugging/Loggers/PointerLogger.cs b/Source/Assets/TouchScript/Scripts/Debugging/Loggers/PointerLogger.cs index dc1282b91..fbba97e10 100644 --- a/Source/Assets/TouchScript/Scripts/Debugging/Loggers/PointerLogger.cs +++ b/Source/Assets/TouchScript/Scripts/Debugging/Loggers/PointerLogger.cs @@ -1,4 +1,4 @@ -/* +/* * @author Valentin Simonov / http://va.lent.in/ */ @@ -12,19 +12,29 @@ namespace TouchScript.Debugging.Loggers { + /// + /// A default implementation of used in editor. + /// + /// public class PointerLogger : IPointerLogger { + #region Consts private const int MIN_POINTER_LIST_SIZE = 1000; + #endregion + + #region Public properties + + /// public int PointerCount { - get - { - return pointerCount; - } + get { return pointerCount; } } + #endregion + + #region Private variables private int pointerCount = 0; private int eventCount = 0; @@ -32,6 +42,11 @@ public int PointerCount private List data = new List(1); private List> events = new List>(1); + #endregion + + #region Public methods + + /// public void Log(Pointer pointer, PointerEvent evt) { var id = checkId(pointer); @@ -56,12 +71,14 @@ public void Log(Pointer pointer, PointerEvent evt) eventCount++; } + /// public List GetFilteredPointerData(IPointerDataFilter filter = null) { //if (filter == null) return new List(data); } + /// public List GetFilteredLogsForPointer(int id, IPointerLogFilter filter = null) { if (id < 0 || id >= pointerCount) @@ -81,6 +98,10 @@ public List GetFilteredLogsForPointer(int id, IPointerLogFilter filt return filtered; } + #endregion + + #region Private functions + private IList getPointerList(int id) { return events[id]; @@ -104,6 +125,8 @@ private int checkId(Pointer pointer) return id; } + + #endregion } } diff --git a/Source/Assets/TouchScript/Scripts/Debugging/TouchScriptDebugger.cs b/Source/Assets/TouchScript/Scripts/Debugging/TouchScriptDebugger.cs index cf2039761..e63b119c0 100644 --- a/Source/Assets/TouchScript/Scripts/Debugging/TouchScriptDebugger.cs +++ b/Source/Assets/TouchScript/Scripts/Debugging/TouchScriptDebugger.cs @@ -1,4 +1,4 @@ -/* +/* * @author Valentin Simonov / http://va.lent.in/ */ @@ -9,9 +9,14 @@ namespace TouchScript.Debugging { + /// + /// A set of debugging tools for TouchScript. + /// public class TouchScriptDebugger { - + /// + /// The singleton instance of the debugger. + /// public static TouchScriptDebugger Instance { get @@ -25,20 +30,24 @@ public static TouchScriptDebugger Instance } } - private static TouchScriptDebugger instance; - + /// + /// Current logger to record pointer events. + /// public IPointerLogger PointerLogger { get { return pointerLogger; } } + private static TouchScriptDebugger instance; private IPointerLogger pointerLogger; + /// + /// Initializes a new instance of the class. + /// public TouchScriptDebugger() { pointerLogger = new PointerLogger(); } - } } diff --git a/Source/Assets/TouchScript/Scripts/Devices/Display/DisplayDevice.cs b/Source/Assets/TouchScript/Scripts/Devices/Display/DisplayDevice.cs index 9639ee0da..30a80f7aa 100644 --- a/Source/Assets/TouchScript/Scripts/Devices/Display/DisplayDevice.cs +++ b/Source/Assets/TouchScript/Scripts/Devices/Display/DisplayDevice.cs @@ -2,7 +2,7 @@ * @author Valentin Simonov / http://va.lent.in/ */ - #if UNITY_EDITOR +#if UNITY_EDITOR using UnityEditor; #endif using UnityEngine; @@ -14,13 +14,12 @@ namespace TouchScript.Devices.Display /// public class DisplayDevice : ScriptableObject, IDisplayDevice { - #if UNITY_EDITOR - [MenuItem("Window/TouchScript/CreateDisplayDevice")] + //[MenuItem("Window/TouchScript/CreateDisplayDevice")] private static DisplayDevice CreateDisplayDevice() { var dd = CreateInstance(); - AssetDatabase.CreateAsset(dd,"Assets/DisplayDevice.asset"); + AssetDatabase.CreateAsset(dd, "Assets/DisplayDevice.asset"); return dd; } #endif @@ -42,11 +41,13 @@ public virtual float DPI get { return dpi; } } + /// public virtual float NativeDPI { get { return nativeDPI; } } + /// public virtual Vector2 NativeResolution { get { return nativeResolution; } @@ -70,6 +71,7 @@ public virtual Vector2 NativeResolution [SerializeField] protected Vector2 nativeResolution = new Vector2(1920, 1080); + /// public virtual void UpdateDPI() {} /// diff --git a/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs b/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs index 6be0ccfe7..430d63f8c 100644 --- a/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs +++ b/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs @@ -19,7 +19,7 @@ private static bool IsLaptop { if (isLaptop == null) { - var gpuName = SystemInfo.graphicsDeviceName.ToLower(); + var gpuName = SystemInfo.graphicsDeviceName.ToLower(); var regex = new Regex(@"^(.*mobile.*|intel hd graphics.*|.*m\s*(series)?\s*(opengl engine)?)$", RegexOptions.IgnoreCase); if (regex.IsMatch(gpuName)) isLaptop = true; else isLaptop = false; @@ -29,9 +29,8 @@ private static bool IsLaptop } private static bool? isLaptop = null; - private int oldWidth, oldHeight; - private bool oldFullscreen; + /// public override void UpdateDPI() { if (Screen.fullScreen) @@ -204,7 +203,8 @@ private void updateNativeDPI() if (width >= 3840) { nativeDPI = 96; - } else if (width >= 1920) + } + else if (width >= 1920) { nativeDPI = 50; } @@ -234,6 +234,5 @@ private bool getHighestResolution(out Vector2 resolution) resolution = new Vector2(r.width, r.height); return true; } - } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Devices/Display/IDisplayDevice.cs b/Source/Assets/TouchScript/Scripts/Devices/Display/IDisplayDevice.cs index 12df87100..8525f931f 100644 --- a/Source/Assets/TouchScript/Scripts/Devices/Display/IDisplayDevice.cs +++ b/Source/Assets/TouchScript/Scripts/Devices/Display/IDisplayDevice.cs @@ -16,21 +16,28 @@ namespace TouchScript.Devices.Display public interface IDisplayDevice { /// - /// Gets or sets the name of display device. + /// Name of the display device. /// - /// The name of display device. string Name { get; } /// - /// Gets or sets DPI of display device. + /// DPI of the game based on and . /// - /// DPI used by display device. float DPI { get; } + /// + /// Native DPI of the display device. + /// float NativeDPI { get; } + /// + /// Native resolution of the display device. + /// Vector2 NativeResolution { get; } + /// + /// Forces to recalculate . + /// void UpdateDPI(); } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs b/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs index d7062f356..0f1028591 100644 --- a/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs @@ -18,6 +18,9 @@ internal sealed class GestureManagerInstance : MonoBehaviour, IGestureManager { #region Public properties + /// + /// Gets the instance of GestureManager singleton. + /// public static IGestureManager Instance { get @@ -41,6 +44,7 @@ public static IGestureManager Instance } } + /// public IGestureDelegate GlobalGestureDelegate { get; set; } #endregion @@ -52,7 +56,7 @@ public static IGestureManager Instance // Upcoming changes private List gesturesToReset = new List(20); - private Dictionary> pointerToGestures = new Dictionary>(); + private Dictionary> pointerToGestures = new Dictionary>(); #endregion diff --git a/Source/Assets/TouchScript/Scripts/Hit/HitData.cs b/Source/Assets/TouchScript/Scripts/Hit/HitData.cs index fb457806d..23ad00c00 100644 --- a/Source/Assets/TouchScript/Scripts/Hit/HitData.cs +++ b/Source/Assets/TouchScript/Scripts/Hit/HitData.cs @@ -21,8 +21,14 @@ public struct HitData [Flags] public enum HitType { + /// + /// An unknown hit. + /// Unknown, + /// + /// Screen space UI hit. + /// ScreenSpace, /// @@ -36,7 +42,7 @@ public enum HitType World2D, /// - /// UI hit. + /// World space UI hit. /// UI } @@ -99,6 +105,9 @@ public RaycastHitUI RaycastHitUI get { return raycastHitUI; } } + /// + /// Indicates if this is a Screen Space hit. + /// public bool ScreenSpace { get { return screenSpace; } @@ -146,6 +155,9 @@ public Vector3 Normal } } + /// + /// Distance to the hit point. + /// public float Distance { get @@ -163,6 +175,9 @@ public float Distance } } + /// + /// Sorting layer of the hit target. + /// public int SortingLayer { get @@ -173,7 +188,7 @@ public int SortingLayer return 0; case HitType.World2D: if (sortingLayer == -1) updateSortingValues(); - return sortingLayer; + return sortingLayer; case HitType.UI: return raycastHitUI.SortingLayer; } @@ -181,6 +196,9 @@ public int SortingLayer } } + /// + /// Sorting order of the hit target. + /// public int SortingOrder { get diff --git a/Source/Assets/TouchScript/Scripts/Hit/RaycastHitUI.cs b/Source/Assets/TouchScript/Scripts/Hit/RaycastHitUI.cs index baecde7fc..6bc18a794 100644 --- a/Source/Assets/TouchScript/Scripts/Hit/RaycastHitUI.cs +++ b/Source/Assets/TouchScript/Scripts/Hit/RaycastHitUI.cs @@ -8,20 +8,20 @@ namespace TouchScript.Hit { - public struct RaycastHitUI - { - - public Transform Target; - public BaseRaycaster Raycaster; - public int GraphicIndex; - public int Depth; - public int SortingLayer; - public int SortingOrder; - public Graphic Graphic; - public Vector3 WorldPosition; - public Vector3 WorldNormal; - public float Distance; - - } -} - + /// + /// A structure to hold data while raycasting into UI elements. + /// + public struct RaycastHitUI + { + public Transform Target; + public BaseRaycaster Raycaster; + public int GraphicIndex; + public int Depth; + public int SortingLayer; + public int SortingOrder; + public Graphic Graphic; + public Vector3 WorldPosition; + public Vector3 WorldNormal; + public float Distance; + } +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/IDebuggable.cs b/Source/Assets/TouchScript/Scripts/IDebuggable.cs index 01ace2044..d8d126fa4 100644 --- a/Source/Assets/TouchScript/Scripts/IDebuggable.cs +++ b/Source/Assets/TouchScript/Scripts/IDebuggable.cs @@ -1,4 +1,4 @@ -/* +/* * @author Valentin Simonov / http://va.lent.in/ */ diff --git a/Source/Assets/TouchScript/Scripts/ILayerManager.cs b/Source/Assets/TouchScript/Scripts/ILayerManager.cs index 4ab871535..cf9b50b5c 100644 --- a/Source/Assets/TouchScript/Scripts/ILayerManager.cs +++ b/Source/Assets/TouchScript/Scripts/ILayerManager.cs @@ -11,6 +11,9 @@ namespace TouchScript { + /// + /// Core manager which controls TouchLayers. + /// public interface ILayerManager { /// @@ -19,8 +22,20 @@ public interface ILayerManager /// A sorted list of currently active layers. IList Layers { get; } + /// + /// Gets the number of active layers. + /// + /// The number of active layers. int LayerCount { get; } + /// + /// Indicates whether there are currently any exclusive transforms. + /// + /// + /// true if any exclusive transforms are registered; otherwise, false. + /// + /// + /// bool HasExclusive { get; } /// @@ -48,17 +63,45 @@ public interface ILayerManager /// Layer index 2. void ChangeLayerIndex(int at, int to); + /// + /// Executes an action over all layers in order. + /// + /// The action to execute. If it returns true, execution stops. void ForEach(Func action); + /// + /// Detects if the pointer hits any object in the scene. + /// + /// The pointer. + /// Hit structure to fill on success. + /// True if any object is hit. bool GetHitTarget(IPointer pointer, out HitData hit); + /// + /// Sets the exclusive transform. Only exclusive transforms will be able to receive pointers. + /// + /// The exclusive transform. + /// if set to true target's children will also be added. void SetExclusive(Transform target, bool includeChildren = false); + /// + /// Sets the exclusive transforms. Only exclusive transforms will be able to receive pointers. + /// + /// The exclusive transforms to set. void SetExclusive(IEnumerable targets); + /// + /// Determines whether the specified target is exclusive. + /// + /// The target. + /// + /// true if the specified target is exclusive; otherwise, false. + /// bool IsExclusive(Transform target); + /// + /// Clears the exclusive transforms list. + /// void ClearExclusive(); - } -} +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/ITouchManager.cs b/Source/Assets/TouchScript/Scripts/ITouchManager.cs index d02d706ff..4a8773885 100644 --- a/Source/Assets/TouchScript/Scripts/ITouchManager.cs +++ b/Source/Assets/TouchScript/Scripts/ITouchManager.cs @@ -139,6 +139,12 @@ public interface ITouchManager /// An unsorted list of all pointers which were pressed but not released yet. IList PressedPointers { get; } + /// + /// Indicates that execution is currently inside a TouchScript Pointer Frame, i.e. before and after events. + /// + /// + /// true if execution is inside a TouchScript Pointer Frame; otherwise, false. + /// bool IsInsidePointerFrame { get; } /// @@ -168,6 +174,9 @@ public interface ITouchManager /// Pointer id to cancel. void CancelPointer(int id); + /// + /// Tells TouchScript to update internal state after a resolution change. + /// void UpdateResolution(); } diff --git a/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs b/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs index eee16bfe7..a2dc86a75 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs @@ -15,7 +15,6 @@ namespace TouchScript.InputSources /// public interface IInputSource : INTERNAL_IInputSource { - /// /// Gets or sets current coordinates remapper. /// @@ -27,6 +26,9 @@ public interface IInputSource : INTERNAL_IInputSource /// bool UpdateInput(); + /// + /// Forces the input to update its state when resolution changes. + /// void UpdateResolution(); /// diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs index 90dfbf11f..674341e08 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs @@ -110,6 +110,9 @@ public MouseHandler(PointerDelegate addPointer, PointerDelegate updatePointer, P #region Public methods + /// + /// Cancels the mouse pointer. + /// public void CancelMousePointer() { if (mousePointer != null) diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs index 8cb6cd85e..340b5cc45 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs @@ -152,7 +152,7 @@ public bool UpdateInput() } /// - public void UpdateResolution() { } + public void UpdateResolution() {} /// public bool CancelPointer(Pointer pointer, bool shouldReturn) diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs index d7d621c5f..c00e945be 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs @@ -1,4 +1,4 @@ -/* +/* * @author Valentin Simonov / http://va.lent.in/ * @author Valentin Frolov * @author Andrew David Griffiths @@ -17,12 +17,15 @@ namespace TouchScript.InputSources.InputHandlers { /// - /// Windows 8 pointer handling implementation which can be embedded to other (input) classes. + /// Windows 8 pointer handling implementation which can be embedded to other (input) classes. Uses WindowsTouch.dll to query native touches with WM_TOUCH or WM_POINTER APIs. /// public class Windows8PointerHandler : WindowsPointerHandler { #region Public properties + /// + /// Should the primary pointer also dispatch a mouse pointer. + /// public bool MouseInPointer { get { return mouseInPointer; } @@ -136,8 +139,6 @@ public override void INTERNAL_DiscardPointer(Pointer pointer) public class Windows7PointerHandler : WindowsPointerHandler { - private int touchInputSize; - /// public Windows7PointerHandler(PointerDelegate addPointer, PointerDelegate updatePointer, PointerDelegate pressPointer, PointerDelegate releasePointer, PointerDelegate removePointer, PointerDelegate cancelPointer) : base(addPointer, updatePointer, pressPointer, releasePointer, removePointer, cancelPointer) { @@ -156,6 +157,9 @@ public override bool UpdateInput() #endregion } + /// + /// Base class for Windows 8 and Windows 7 input handlers. + /// public abstract class WindowsPointerHandler : IInputSource, IDisposable { #region Consts @@ -165,8 +169,20 @@ public abstract class WindowsPointerHandler : IInputSource, IDisposable /// public const string PRESS_AND_HOLD_ATOM = "MicrosoftTabletPenServiceProperty"; + /// + /// The method delegate used to pass data from the native DLL. + /// + /// Pointer id. + /// Current event. + /// Pointer type. + /// Pointer position. + /// Pointer data. protected delegate void NativePointerDelegate(int id, PointerEvent evt, PointerType type, Vector2 position, PointerData data); + /// + /// The method delegate used to pass log messages from the native DLL. + /// + /// The log message. protected delegate void NativeLog([MarshalAs(UnmanagedType.BStr)] string log); #endregion diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs index 78962db9e..98c04b0a9 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs @@ -41,7 +41,9 @@ public ICoordinatesRemapper CoordinatesRemapper #region Private variables - [SerializeField] [HideInInspector] private bool advancedProps; // is used to save whether advanced properties are opened or closed + [SerializeField] + [HideInInspector] + private bool advancedProps; // is used to save whether advanced properties are opened or closed private ICoordinatesRemapper coordinatesRemapper; private TouchManagerInstance manager; @@ -70,9 +72,7 @@ public virtual bool CancelPointer(Pointer pointer, bool shouldReturn) #region Internal methods /// - public virtual void INTERNAL_DiscardPointer(Pointer pointer) - { - } + public virtual void INTERNAL_DiscardPointer(Pointer pointer) {} #endregion @@ -168,9 +168,7 @@ protected virtual void cancelPointer(Pointer pointer) /// Called from setter to update touch handlers with the new value. /// /// The new remapper. - protected virtual void updateCoordinatesRemapper(ICoordinatesRemapper remapper) - { - } + protected virtual void updateCoordinatesRemapper(ICoordinatesRemapper remapper) {} /// /// Remaps the coordinates using the if it is set. diff --git a/Source/Assets/TouchScript/Scripts/LayerManager.cs b/Source/Assets/TouchScript/Scripts/LayerManager.cs index 83c7f2528..e1bc5cf0e 100644 --- a/Source/Assets/TouchScript/Scripts/LayerManager.cs +++ b/Source/Assets/TouchScript/Scripts/LayerManager.cs @@ -6,11 +6,17 @@ namespace TouchScript { + /// + /// Facade for current instance of . + /// public sealed class LayerManager : MonoBehaviour { + /// + /// Gets the LayerManager instance. + /// public static ILayerManager Instance { get { return LayerManagerInstance.Instance; } } } -} +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/LayerManagerInstance.cs b/Source/Assets/TouchScript/Scripts/LayerManagerInstance.cs index 67a0ff3db..00a50fe4b 100644 --- a/Source/Assets/TouchScript/Scripts/LayerManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/LayerManagerInstance.cs @@ -11,10 +11,16 @@ namespace TouchScript { + /// + /// Internal implementation of . + /// internal sealed class LayerManagerInstance : MonoBehaviour, ILayerManager { #region Public properties + /// + /// Gets the instance of GestureManager singleton. + /// public static ILayerManager Instance { get @@ -50,6 +56,7 @@ public int LayerCount get { return layerCount; } } + /// public bool HasExclusive { get { return exclusiveCount > 0; } @@ -184,6 +191,7 @@ public void SetExclusive(Transform target, bool includeChildren = false) } } + /// public void SetExclusive(IEnumerable targets) { if (targets == null) return; @@ -197,13 +205,17 @@ public void SetExclusive(IEnumerable targets) } } + /// public bool IsExclusive(Transform target) { return exclusive.Contains(target.GetHashCode()); } + /// public void ClearExclusive() { + // It is incorrect to just set exclusiveCount to zero since the exclusive list is actually needed the next frame. Only after the next frame's FrameEnded event the list can be cleared. + // If we are inside the Pointer Frame, we need to wait for the second FrameEnded (this frame's event included). Otherwise, we need to wait for the next FrameEnded event. clearExclusiveDelay = manager.IsInsidePointerFrame ? 2 : 1; } @@ -263,6 +275,5 @@ private void frameFinishedHandler(object sender, EventArgs eventArgs) } #endregion - } -} +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs index cecf79a8a..5df151de7 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs @@ -15,12 +15,18 @@ namespace TouchScript.Layers { - + /// + /// A layer which combines all types of hit recognition into one: UI (Screen Space and World), 3D and 2D. + /// + /// [AddComponentMenu("TouchScript/Layers/Standard Layer")] public class StandardLayer : TouchLayer { #region Public properties + /// + /// Indicates that the layer should look for 3D objects in the scene. Set this to false to optimize hit processing. + /// public bool Hit3DObjects { get { return hit3DObjects; } @@ -31,6 +37,9 @@ public bool Hit3DObjects } } + /// + /// Indicates that the layer should look for 2D objects in the scene. Set this to false to optimize hit processing. + /// public bool Hit2DObjects { get { return hit2DObjects; } @@ -41,6 +50,9 @@ public bool Hit2DObjects } } + /// + /// Indicates that the layer should look for World UI objects in the scene. Set this to false to optimize hit processing. + /// public bool HitWorldSpaceUI { get { return hitWorldSpaceUI; } @@ -52,6 +64,9 @@ public bool HitWorldSpaceUI } } + /// + /// Indicates that the layer should look for Screen Space UI objects in the scene. Set this to false to optimize hit processing. + /// public bool HitScreenSpaceUI { get { return hitScreenSpaceUI; } @@ -62,6 +77,9 @@ public bool HitScreenSpaceUI } } + /// + /// Indicates that the layer should query for components on target objects. Set this to false to optimize hit processing. + /// public bool UseHitFilters { get { return useHitFilters; } @@ -110,8 +128,8 @@ public override Vector3 WorldProjectionNormal [SerializeField] private bool advancedProps; // is used to save if advanced properties are opened or closed - [SerializeField] - private bool hitProps; + [SerializeField] + private bool hitProps; [SerializeField] [ToggleLeft] @@ -119,11 +137,11 @@ public override Vector3 WorldProjectionNormal [SerializeField] [ToggleLeft] - private bool hit2DObjects = true; + private bool hit2DObjects = true; [SerializeField] [ToggleLeft] - private bool hitWorldSpaceUI = true; + private bool hitWorldSpaceUI = true; [SerializeField] [ToggleLeft] @@ -148,6 +166,7 @@ public override Vector3 WorldProjectionNormal #region Public methods + /// public override HitResult Hit(IPointer pointer, out HitData hit) { if (base.Hit(pointer, out hit) != HitResult.Hit) return HitResult.Miss; @@ -222,15 +241,15 @@ private void OnEnable() { if (!Application.isPlaying) return; TouchManager.Instance.FrameStarted += frameStartedHandler; - StartCoroutine(lateEnable()); + StartCoroutine(lateEnable()); } - private IEnumerator lateEnable() - { - // Need to wait while EventSystem initializes - yield return new WaitForEndOfFrame(); - setupInputModule(); - } + private IEnumerator lateEnable() + { + // Need to wait while EventSystem initializes + yield return new WaitForEndOfFrame(); + setupInputModule(); + } private void OnDisable() { @@ -493,7 +512,7 @@ private HitResult performSSUISearch(IPointer pointer, out HitData hit) float distance = 0; - if ((eventCamera == null) || (canvas.renderMode == RenderMode.ScreenSpaceOverlay)) { } + if ((eventCamera == null) || (canvas.renderMode == RenderMode.ScreenSpaceOverlay)) {} else { var transForward = t.forward; @@ -506,17 +525,17 @@ private HitResult performSSUISearch(IPointer pointer, out HitData hit) } raycastHitUIList.Add( - new RaycastHitUI() - { - Target = graphic.transform, - Raycaster = raycaster, - Graphic = graphic, - GraphicIndex = raycastHitUIList.Count, - Depth = graphic.depth, - SortingLayer = canvas.sortingLayerID, - SortingOrder = canvas.sortingOrder, - Distance = distance - }); + new RaycastHitUI() + { + Target = graphic.transform, + Raycaster = raycaster, + Graphic = graphic, + GraphicIndex = raycastHitUIList.Count, + Depth = graphic.depth, + SortingLayer = canvas.sortingLayerID, + SortingOrder = canvas.sortingOrder, + Distance = distance + }); } } } @@ -607,6 +626,5 @@ private void frameStartedHandler(object sender, EventArgs eventArgs) } #endregion - } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs index bac37aa4e..73a19ab44 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs @@ -27,7 +27,6 @@ namespace TouchScript.Layers [ExecuteInEditMode] public abstract class TouchLayer : MonoBehaviour { - #region Events /// @@ -171,12 +170,12 @@ internal bool INTERNAL_PressPointer(Pointer pointer) { pressPointer(pointer); if (pointerPressInvoker != null) pointerPressInvoker.InvokeHandleExceptions(this, new TouchLayerEventArgs(pointer)); - return true; + return true; } internal void INTERNAL_ReleasePointer(Pointer pointer) { - endPointer(pointer); + releasePointer(pointer); } internal void INTERNAL_RemovePointer(Pointer pointer) @@ -219,10 +218,15 @@ protected virtual void setName() if (string.IsNullOrEmpty(Name)) Name = "Layer"; } - protected virtual void addPointer(Pointer pointer) { } + /// + /// Called when a pointer is added. + /// + /// Pointer. + /// This method may also be used to update some internal state or resend this event somewhere. + protected virtual void addPointer(Pointer pointer) {} /// - /// Called when a layer is touched to query the layer if this pointer hits something. + /// Called when a layer is pressed over an object detected by this layer. /// /// Pointer. /// This method may also be used to update some internal state or resend this event somewhere. @@ -236,13 +240,18 @@ protected virtual void pressPointer(Pointer pointer) {} protected virtual void updatePointer(Pointer pointer) {} /// - /// Called when a pointer ends. + /// Called when a pointer is released. /// /// Pointer. /// This method may also be used to update some internal state or resend this event somewhere. - protected virtual void endPointer(Pointer pointer) {} + protected virtual void releasePointer(Pointer pointer) {} - protected virtual void removePointer(Pointer pointer) { } + /// + /// Called when a pointer is removed. + /// + /// Pointer. + /// This method may also be used to update some internal state or resend this event somewhere. + protected virtual void removePointer(Pointer pointer) {} /// /// Called when a pointer is cancelled. diff --git a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs index 32ab4000b..e6a8b4802 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs @@ -10,34 +10,38 @@ using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; -using Pointer = TouchScript.Pointers.Pointer; namespace TouchScript.Layers.UI { + /// + /// An implementation of a Unity UI Input Module which lets TouchScript interact with the UI and EventSystem. + /// internal sealed class TouchScriptInputModule : BaseInputModule { - #region Public properties + /// + /// TouchScriptInputModule singleton instance. + /// public static TouchScriptInputModule Instance { get { - if (shuttingDown) return null; + if (shuttingDown) return null; if (instance == null) { - var es = EventSystem.current; + var es = EventSystem.current; if (es == null) - { - es = FindObjectOfType(); - if (es == null) - { - var go = new GameObject("EventSystem"); - es = go.AddComponent(); - } - } + { + es = FindObjectOfType(); + if (es == null) + { + var go = new GameObject("EventSystem"); + es = go.AddComponent(); + } + } instance = es.GetComponent(); - if (instance == null) instance = es.gameObject.AddComponent(); + if (instance == null) instance = es.gameObject.AddComponent(); } return instance; } @@ -54,7 +58,7 @@ public static TouchScriptInputModule Instance #region Private variables - private static bool shuttingDown = false; + private static bool shuttingDown = false; private static TouchScriptInputModule instance; private static FieldInfo raycastersProp; private static PropertyInfo canvasProp; @@ -100,20 +104,29 @@ protected override void OnDisable() base.OnDisable(); } - private void OnApplicationQuit() - { - shuttingDown = true; - } + private void OnApplicationQuit() + { + shuttingDown = true; + } #endregion #region Public methods + /// + /// Returns all UI raycasters in the scene. + /// + /// Array of raycasters. public List GetRaycasters() { return raycastersProp.GetValue(null) as List; } + /// + /// Returns a Canvas for a raycaster. + /// + /// The raycaster. + /// The Canvas this raycaster is on. public Canvas GetCanvasForRaycaster(BaseRaycaster raycaster) { var id = raycaster.GetInstanceID(); @@ -128,13 +141,13 @@ public Canvas GetCanvasForRaycaster(BaseRaycaster raycaster) public override void Process() { - if (ui != null) ui.Process(); + if (ui != null) ui.Process(); } public override bool IsPointerOverGameObject(int pointerId) { - if (ui != null) return ui.IsPointerOverGameObject(pointerId); - return false; + if (ui != null) return ui.IsPointerOverGameObject(pointerId); + return false; } public override bool ShouldActivateModule() @@ -157,12 +170,19 @@ public override void UpdateModule() {} #region Internal methods + /// + /// Marks that this object is used by some other object. + /// internal void INTERNAL_Retain() { refCount++; if (refCount == 1) enable(); } + /// + /// Releases a lock on this object. + /// + /// The number of objects still using this object. internal int INTERNAL_Release() { if (--refCount <= 0) disable(); @@ -185,7 +205,7 @@ private void enable() private void disable() { - if (TouchManager.Instance != null && ui != null) + if (TouchManager.Instance != null && ui != null) { TouchManager.Instance.PointersUpdated -= ui.ProcessUpdated; TouchManager.Instance.PointersPressed -= ui.ProcessPressed; @@ -204,10 +224,12 @@ private void disable() #region Copypasted code from UI - // last update: df1947cd (5.4f3) + /// + /// Basically, copied code from UI Input Module which handles all UI pointer processing logic. + /// Last update: df1947cd (5.4f3) + /// private class UIStandardInputModule { - protected TouchScriptInputModule input; public UIStandardInputModule(TouchScriptInputModule input) @@ -223,13 +245,13 @@ public UIStandardInputModule(TouchScriptInputModule input) private Dictionary m_PointerData = new Dictionary(); - public bool IsPointerOverGameObject(int pointerId) - { - var lastPointer = GetLastPointerEventData(pointerId); - if (lastPointer != null) - return lastPointer.pointerEnter != null; - return false; - } + public bool IsPointerOverGameObject(int pointerId) + { + var lastPointer = GetLastPointerEventData(pointerId); + if (lastPointer != null) + return lastPointer.pointerEnter != null; + return false; + } protected bool GetPointerData(int id, out PointerEventData data, bool create) { @@ -255,12 +277,12 @@ protected void DeselectIfSelectionChanged(GameObject currentOverGo, BaseEventDat input.eventSystem.SetSelectedGameObject(null, pointerEvent); } - protected PointerEventData GetLastPointerEventData(int id) - { - PointerEventData data; - GetPointerData(id, out data, false); - return data; - } + protected PointerEventData GetLastPointerEventData(int id) + { + PointerEventData data; + GetPointerData(id, out data, false); + return data; + } private static bool ShouldStartDrag(Vector2 pressPos, Vector2 currentPos, float threshold, bool useDragThreshold) { @@ -391,15 +413,15 @@ protected void RemovePointerData(int id) m_PointerData.Remove(id); } - private void convertRaycast(RaycastHitUI old, ref RaycastResult current) - { - current.module = old.Raycaster; - current.gameObject = old.Target == null ? null : old.Target.gameObject; - current.depth = old.Depth; - current.index = old.GraphicIndex; - current.sortingLayer = old.SortingLayer; - current.sortingOrder = old.SortingOrder; - } + private void convertRaycast(RaycastHitUI old, ref RaycastResult current) + { + current.module = old.Raycaster; + current.gameObject = old.Target == null ? null : old.Target.gameObject; + current.depth = old.Depth; + current.index = old.GraphicIndex; + current.sortingLayer = old.SortingLayer; + current.sortingOrder = old.SortingOrder; + } #endregion @@ -428,7 +450,7 @@ public virtual void ProcessUpdated(object sender, PointerEventArgs pointerEventA convertRaycast(over.RaycastHitUI, ref raycast); raycast.screenPosition = data.position; data.pointerCurrentRaycast = raycast; - + input.HandlePointerExitAndEnter(data, currentOverGo); bool moving = data.IsPointerMoving(); @@ -474,7 +496,7 @@ public virtual void ProcessPressed(object sender, PointerEventArgs pointerEventA for (var i = 0; i < count; i++) { var pointer = pointers[i]; - + var over = pointer.GetOverData(); if (over.Type != HitData.HitType.UI && over.Type != HitData.HitType.ScreenSpace) continue; @@ -648,10 +670,8 @@ public virtual void ProcessRemoved(object sender, PointerEventArgs pointerEventA } #endregion - } #endregion - } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Pointers/FakePointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/FakePointer.cs index e2a9e840b..f78aa06ca 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/FakePointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/FakePointer.cs @@ -8,6 +8,10 @@ namespace TouchScript.Pointers { + /// + /// Fake pointer. + /// + /// public class FakePointer : IPointer { #region Public properties @@ -27,19 +31,28 @@ public class FakePointer : IPointer /// public uint Flags { get; private set; } + /// public Pointer.PointerButtonState Buttons { get; private set; } + /// public Vector2 PreviousPosition { get; private set; } #endregion #region Constructors + /// + /// Initializes a new instance of the class. + /// + /// The position. public FakePointer(Vector2 position) : this() { Position = position; } + /// + /// Initializes a new instance of the class. + /// public FakePointer() { Id = Pointer.INVALID_POINTER; diff --git a/Source/Assets/TouchScript/Scripts/Pointers/IPointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/IPointer.cs index 5abddc706..f7eba21da 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/IPointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/IPointer.cs @@ -20,6 +20,9 @@ public interface IPointer /// Pointer.PointerType Type { get; } + /// + /// Current buttons state of the pointer. + /// Pointer.PointerButtonState Buttons { get; } /// @@ -29,10 +32,13 @@ public interface IPointer IInputSource InputSource { get; } /// - /// Current position in screen coordinates. + /// Current position in screen coordinates. /// Vector2 Position { get; set; } + /// + /// Previous position in screen coordinates. + /// Vector2 PreviousPosition { get; } /// diff --git a/Source/Assets/TouchScript/Scripts/Pointers/MousePointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/MousePointer.cs index 4515abf9e..99f624ba9 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/MousePointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/MousePointer.cs @@ -1,4 +1,4 @@ -/* +/* * @author Valentin Simonov / http://va.lent.in/ */ @@ -14,6 +14,9 @@ public class MousePointer : Pointer { #region Public properties + /// + /// Mouse scroll delta this frame. + /// public Vector2 ScrollDelta { get; set; } #endregion @@ -32,6 +35,7 @@ public MousePointer(IInputSource input) : base(input) #region Public methods + /// public override void CopyFrom(Pointer target) { base.CopyFrom(target); diff --git a/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs index df1ad80e4..ed897852f 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs @@ -13,9 +13,25 @@ public class ObjectPointer : Pointer { #region Public consts + /// + /// Default object id value when device doesn't provide it. + /// public const int DEFAULT_OBJECT_ID = 0; + + + /// + /// Default width value when device doesn't provide it. + /// public const float DEFAULT_WIDTH = 1f; + + /// + /// Default height value when device doesn't provide it. + /// public const float DEFAULT_HEIGHT = 1f; + + /// + /// Default angle value when device doesn't provide it. + /// public const float DEFAULT_ANGLE = 0f; #endregion diff --git a/Source/Assets/TouchScript/Scripts/Pointers/PenPointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/PenPointer.cs index 66e903327..83ee8ef70 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/PenPointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/PenPointer.cs @@ -13,15 +13,30 @@ public class PenPointer : Pointer { #region Public consts + /// + /// Default pressure value when device doesn't provide it. + /// public const float DEFAULT_PRESSURE = 0.5f; + + /// + /// Default rotation value when device doesn't provide it. + /// public const float DEFAULT_ROTATION = 0f; #endregion #region Public properties + /// + /// Gets or sets the touch's rotation. + /// + /// Rotation in radians. public float Rotation { get; set; } + /// + /// Gets or sets the touch's pressure. + /// + /// Pressure in range [0, 1]. public float Pressure { get; set; } #endregion @@ -40,6 +55,7 @@ public PenPointer(IInputSource input) : base(input) #region Internal functions + /// internal override void INTERNAL_Reset() { base.INTERNAL_Reset(); diff --git a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs index 3ec3f8a8e..2e3d97550 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs @@ -27,12 +27,18 @@ public class Pointer : IPointer, IEquatable public const int INVALID_POINTER = -1; /// - /// Indicates that this pointer is generated by script and is not mapped to any device input. + /// This pointer is generated by script and is not mapped to any device input. /// public const uint FLAG_ARTIFICIAL = 1 << 0; + /// + /// This pointer was returned to the system after it was cancelled. + /// public const uint FLAG_RETURNED = 1 << 1; + /// + /// This pointer is internal and shouldn't be shown on screen. + /// public const uint FLAG_INTERNAL = 1 << 2; /// @@ -184,33 +190,23 @@ public enum PointerButtonState /// public PointerType Type { get; protected set; } + /// public PointerButtonState Buttons { get; set; } - /// - /// Original input source which created this pointer. - /// - /// + /// public IInputSource InputSource { get; private set; } - /// - /// Current position in screen coordinates. - /// Note: setting this property doesn't immediately change its value, the value actually changes during the next TouchManager update phase. - /// + /// public Vector2 Position { get { return position; } set { newPosition = value; } } - /// - /// Previous (during last frame) in screen coordinates. - /// + /// public Vector2 PreviousPosition { get; private set; } - /// - /// Gets or sets pointer flags: . - /// Note: setting this property doesn't immediately change its value, the value actually changes during the next TouchManager update phase. - /// + /// public uint Flags { get; set; } /// @@ -304,8 +300,8 @@ public override string ToString() builder.Append(Type); builder.Append(", id: "); builder.Append(Id); - builder.Append(", buttons: "); - PointerUtils.PressedButtonsToString(Buttons, builder); + builder.Append(", buttons: "); + PointerUtils.PressedButtonsToString(Buttons, builder); builder.Append(", flags: "); BinaryUtils.ToBinaryString(Flags, builder, 8); builder.Append(", position: "); diff --git a/Source/Assets/TouchScript/Scripts/Pointers/PointerFactory.cs b/Source/Assets/TouchScript/Scripts/Pointers/PointerFactory.cs index e7a500145..900ebd5db 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/PointerFactory.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/PointerFactory.cs @@ -11,7 +11,6 @@ namespace TouchScript.Pointers /// public static class PointerFactory { - /// /// Creates a pointer of type attached to input source. /// @@ -33,6 +32,5 @@ public static Pointer Create(Pointer.PointerType type, IInputSource input) } return null; } - } -} +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Pointers/TouchPointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/TouchPointer.cs index 7a1570ff6..70c72e096 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/TouchPointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/TouchPointer.cs @@ -13,15 +13,30 @@ public class TouchPointer : Pointer { #region Public consts + /// + /// Default pressure value when device doesn't provide it. + /// public const float DEFAULT_PRESSURE = 0.5f; + + /// + /// Default rotation value when device doesn't provide it. + /// public const float DEFAULT_ROTATION = 0f; #endregion #region Public properties + /// + /// Gets or sets the touch's rotation. + /// + /// Rotation in radians. public float Rotation { get; set; } + /// + /// Gets or sets the touch's pressure. + /// + /// Pressure in range [0, 1]. public float Pressure { get; set; } #endregion @@ -40,6 +55,7 @@ public TouchPointer(IInputSource input) : base(input) #region Internal functions + /// internal override void INTERNAL_Reset() { base.INTERNAL_Reset(); diff --git a/Source/Assets/TouchScript/Scripts/TouchManager.cs b/Source/Assets/TouchScript/Scripts/TouchManager.cs index c90b8c57a..b5b864e7b 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManager.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManager.cs @@ -1,4 +1,4 @@ -/* +/* * @author Valentin Simonov / http://va.lent.in/ */ @@ -15,7 +15,7 @@ namespace TouchScript { /// - /// A façade object to configure and hold parameters for an instance of . Contains constants used throughout the library. + /// A façade object to configure and hold parameters for an instance of . Contains constants used throughout the library. /// /// /// @@ -33,9 +33,17 @@ public sealed class TouchManager : DebuggableMonoBehaviour public const int DEBUG_GL_TOUCH = DEBUG_GL_START; #endif + /// + /// Event implementation in Unity EventSystem for pointer events. + /// + /// [Serializable] public class PointerEvent : UnityEvent> {} + /// + /// Event implementation in Unity EventSystem for frame events. + /// + /// [Serializable] public class FrameEvent : UnityEvent {} @@ -151,60 +159,64 @@ public enum MessageName /// TouchScript version. /// public static readonly Version VERSION = new Version(9, 0); - public static readonly string VERSION_SUFFIX = "alpha"; + + /// + /// TouchScript version suffix. + /// + public static readonly string VERSION_SUFFIX = "alpha"; #endregion - #region Events - - /// - /// Occurs when a new frame is started before all other events. - /// - public FrameEvent OnFrameStart = new FrameEvent(); - - /// - /// Occurs when a frame is finished. After all other events. - /// - [SerializeField] - public FrameEvent OnFrameFinish = new FrameEvent(); - - /// - /// Occurs when new hovering pointers are added. - /// - [SerializeField] - public PointerEvent OnPointersAdd = new PointerEvent(); - - /// - /// Occurs when pointers are updated. - /// - [SerializeField] - public PointerEvent OnPointersUpdate = new PointerEvent(); - - /// - /// Occurs when pointers touch the surface. - /// - [SerializeField] - public PointerEvent OnPointersPress = new PointerEvent(); - - /// - /// Occurs when pointers are released. - /// - [SerializeField] - public PointerEvent OnPointersRelease = new PointerEvent(); - - /// - /// Occurs when pointers are removed from the system. - /// - [SerializeField] - public PointerEvent OnPointersRemove = new PointerEvent(); - - /// - /// Occurs when pointers are cancelled. - /// - [SerializeField] - public PointerEvent OnPointersCancel = new PointerEvent(); - - #endregion + #region Events + + /// + /// Occurs when a new frame is started before all other events. + /// + public FrameEvent OnFrameStart = new FrameEvent(); + + /// + /// Occurs when a frame is finished. After all other events. + /// + [SerializeField] + public FrameEvent OnFrameFinish = new FrameEvent(); + + /// + /// Occurs when new hovering pointers are added. + /// + [SerializeField] + public PointerEvent OnPointersAdd = new PointerEvent(); + + /// + /// Occurs when pointers are updated. + /// + [SerializeField] + public PointerEvent OnPointersUpdate = new PointerEvent(); + + /// + /// Occurs when pointers touch the surface. + /// + [SerializeField] + public PointerEvent OnPointersPress = new PointerEvent(); + + /// + /// Occurs when pointers are released. + /// + [SerializeField] + public PointerEvent OnPointersRelease = new PointerEvent(); + + /// + /// Occurs when pointers are removed from the system. + /// + [SerializeField] + public PointerEvent OnPointersRemove = new PointerEvent(); + + /// + /// Occurs when pointers are cancelled. + /// + [SerializeField] + public PointerEvent OnPointersCancel = new PointerEvent(); + + #endregion #region Public properties @@ -326,6 +338,7 @@ public bool UseUnityEvents #if TOUCHSCRIPT_DEBUG + /// public override bool DebugMode { get { return base.DebugMode; } @@ -412,7 +425,7 @@ private void Awake() private void OnEnable() { updateSendMessageSubscription(); - updateUnityEventsSubscription(); + updateUnityEventsSubscription(); } private void OnDisable() diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs index e20f01d9e..9aa66fe0b 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs @@ -95,7 +95,9 @@ public event EventHandler PointersCancelled #region Public properties - /// + /// + /// Gets the instance of TouchManager singleton. + /// public static TouchManagerInstance Instance { get @@ -200,6 +202,7 @@ public IList PressedPointers get { return new List(pressedPointers); } } + /// public bool IsInsidePointerFrame { get; private set; } #endregion @@ -246,6 +249,7 @@ public IList PressedPointers #region Temporary variables + // Used in layer dispatch fucntions private Pointer tmpPointer; #endregion @@ -253,7 +257,7 @@ public IList PressedPointers #region Debug #if TOUCHSCRIPT_DEBUG - private TouchScript.Debugging.Loggers.IPointerLogger pLogger; + private IPointerLogger pLogger; #endif private CustomSampler samplerUpdateInputs; @@ -298,6 +302,7 @@ public void CancelPointer(int id) CancelPointer(id, false); } + /// public void UpdateResolution() { if (DisplayDevice != null) @@ -329,7 +334,7 @@ internal void INTERNAL_AddPointer(Pointer pointer) pointersAdded.Add(pointer); #if TOUCHSCRIPT_DEBUG - pLogger.Log(pointer, PointerEvent.IDAllocated); + pLogger.Log(pointer, PointerEvent.IdAllocated); if (DebugMode) Debug.Log("TouchScript > Pointer Added: " + pointer); #endif diff --git a/Source/Assets/TouchScript/Scripts/Utils/BinaryUtils.cs b/Source/Assets/TouchScript/Scripts/Utils/BinaryUtils.cs index e33149d2b..b47049acb 100644 --- a/Source/Assets/TouchScript/Scripts/Utils/BinaryUtils.cs +++ b/Source/Assets/TouchScript/Scripts/Utils/BinaryUtils.cs @@ -1,4 +1,4 @@ -/* +/* * @author Valentin Simonov / http://va.lent.in/ */ @@ -7,8 +7,17 @@ namespace TouchScript.Utils { + /// + /// Utility methods to deal with binary data. + /// public static class BinaryUtils { + /// + /// Formats an integer value to a binary string. + /// + /// The integer value. + /// The string builder to use. + /// The number of digits to include in the string. public static void ToBinaryString(uint value, StringBuilder builder, int digits = 32) { int i = digits - 1; @@ -20,6 +29,12 @@ public static void ToBinaryString(uint value, StringBuilder builder, int digits } } + /// + /// Formats an integer value to a binary string. + /// + /// The integer value. + /// The number of digits to include in the string. + /// A binary string. public static string ToBinaryString(uint value, int digits = 32) { var sb = new StringBuilder(digits); @@ -27,13 +42,18 @@ public static string ToBinaryString(uint value, int digits = 32) return sb.ToString(); } + /// + /// Converts a collection of bool values to a bit mask. + /// + /// The collection of bool values. + /// Binary mask. public static uint ToBinaryMask(IEnumerable collection) { uint mask = 0; var count = 0; foreach (bool value in collection) { - if (value) mask |= (uint)(1 << count); + if (value) mask |= (uint) (1 << count); if (++count >= 32) break; } return mask; diff --git a/Source/Assets/TouchScript/Scripts/Utils/EventHandlerExtensions.cs b/Source/Assets/TouchScript/Scripts/Utils/EventHandlerExtensions.cs index d01778537..e5e931c1d 100644 --- a/Source/Assets/TouchScript/Scripts/Utils/EventHandlerExtensions.cs +++ b/Source/Assets/TouchScript/Scripts/Utils/EventHandlerExtensions.cs @@ -1,4 +1,4 @@ -/* +/* * @author DenizPiri / denizpiri@hotmail.com * @author Valentin Simonov / http://va.lent.in/ */ diff --git a/Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs b/Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs index 1217ba6eb..31a71ecc2 100644 --- a/Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs +++ b/Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs @@ -1,4 +1,4 @@ -/* +/* * @author Valentin Simonov / http://va.lent.in/ * Source code copied from UnityEngine.UI.ObjectPool: * https://bitbucket.org/Unity-Technologies/ui/src/ccb946ecc23815d1a7099aee0ed77b0cde7ff278/UnityEngine.UI/UI/Core/Utility/ObjectPool.cs?at=5.1 @@ -7,12 +7,17 @@ using System; using System.Collections.Generic; using UnityEngine.Events; + #if OBJECTPOOL_DEBUG using UnityEngine; #endif namespace TouchScript.Utils { + /// + /// Object pool implementation used in TouchScript. + /// + /// public class ObjectPool where T : class { public delegate T0 UnityFunc(); @@ -98,7 +103,7 @@ public void Release(T element) public void Release(object element) { - var obj = (T)element; + var obj = (T) element; if (obj == null) return; Release(obj); } diff --git a/Source/Assets/TouchScript/Scripts/Utils/Platform/WindowsUtils.cs b/Source/Assets/TouchScript/Scripts/Utils/Platform/WindowsUtils.cs index 5c4d954e3..776f448e6 100644 --- a/Source/Assets/TouchScript/Scripts/Utils/Platform/WindowsUtils.cs +++ b/Source/Assets/TouchScript/Scripts/Utils/Platform/WindowsUtils.cs @@ -10,10 +10,11 @@ namespace TouchScript.Utils.Platform { - + /// + /// Utility methods on Windows. + /// public static class WindowsUtils { - // disables press and hold (right-click) gesture public const int TABLET_DISABLE_PRESSANDHOLD = 0x00000001; // disables UI feedback on pen up (waves) @@ -25,6 +26,28 @@ public static class WindowsUtils public const int MONITOR_DEFAULTTONEAREST = 2; + /// + /// Retrieves the native monitor resolution. + /// + /// Output width. + /// Output height. + public static void GetNativeMonitorResolution(out int width, out int height) + { + var monitor = MonitorFromWindow(GetActiveWindow(), MONITOR_DEFAULTTONEAREST); + MONITORINFO monitorInfo = new MONITORINFO(); + monitorInfo.cbSize = Marshal.SizeOf(monitorInfo); + if (!GetMonitorInfo(monitor, ref monitorInfo)) + { + width = Screen.width; + height = Screen.height; + } + else + { + width = monitorInfo.rcMonitor.Width; + height = monitorInfo.rcMonitor.Height; + } + } + [StructLayout(LayoutKind.Sequential)] public struct RECT { @@ -60,23 +83,6 @@ public struct MONITORINFO public uint dwFlags; } - public static void GetNativeMonitorResolution(out int width, out int height) - { - var monitor = MonitorFromWindow(GetActiveWindow(), MONITOR_DEFAULTTONEAREST); - MONITORINFO monitorInfo = new MONITORINFO(); - monitorInfo.cbSize = Marshal.SizeOf(monitorInfo); - if (!GetMonitorInfo(monitor, ref monitorInfo)) - { - width = Screen.width; - height = Screen.height; - } - else - { - width = monitorInfo.rcMonitor.Width; - height = monitorInfo.rcMonitor.Height; - } - } - [DllImport("user32.dll")] public static extern IntPtr GetActiveWindow(); @@ -100,7 +106,6 @@ public static void GetNativeMonitorResolution(out int width, out int height) [DllImport("user32.dll")] public static extern IntPtr EnableMouseInPointer(bool value); - } } diff --git a/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs b/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs index 910b537e8..785072a30 100644 --- a/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs +++ b/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs @@ -10,11 +10,10 @@ namespace TouchScript.Utils { /// - /// Pointer utils. + /// Utility methods to work with Pointers. /// public static class PointerUtils { - private static StringBuilder sb; /// @@ -56,14 +55,24 @@ public static bool IsPointerOnTarget(IPointer pointer, Transform target, out Hit return hit.Target.IsChildOf(target); } + /// + /// Formats currently pressed buttons as a string. + /// + /// The buttons state. + /// Formatted string of currently pressed buttons. public static string PressedButtonsToString(Pointer.PointerButtonState buttons) - { + { initStringBuilder(); PressedButtonsToString(buttons, sb); return sb.ToString(); - } + } + /// + /// Formats currently pressed buttons as a string. + /// + /// The buttons state. + /// The string builder to use. public static void PressedButtonsToString(Pointer.PointerButtonState buttons, StringBuilder builder) { if ((buttons & Pointer.PointerButtonState.FirstButtonPressed) != 0) builder.Append("1"); @@ -78,86 +87,109 @@ public static void PressedButtonsToString(Pointer.PointerButtonState buttons, St else builder.Append("_"); } - public static string ButtonsToString(Pointer.PointerButtonState buttons) - { - initStringBuilder(); + /// + /// Formats the state of buttons as a string. + /// + /// The buttons state. + /// Formatted string of the buttons state. + public static string ButtonsToString(Pointer.PointerButtonState buttons) + { + initStringBuilder(); - ButtonsToString(buttons, sb); - return sb.ToString(); - } + ButtonsToString(buttons, sb); + return sb.ToString(); + } - public static void ButtonsToString(Pointer.PointerButtonState buttons, StringBuilder builder) - { + /// + /// Formats the state of buttons as a string. + /// + /// The buttons state. + /// The string builder to use. + public static void ButtonsToString(Pointer.PointerButtonState buttons, StringBuilder builder) + { if ((buttons & Pointer.PointerButtonState.FirstButtonDown) != 0) builder.Append("v"); else if ((buttons & Pointer.PointerButtonState.FirstButtonUp) != 0) builder.Append("^"); - else if ((buttons & Pointer.PointerButtonState.FirstButtonPressed) != 0) builder.Append("1"); - else builder.Append("_"); - - if ((buttons & Pointer.PointerButtonState.SecondButtonDown) != 0) builder.Append("v"); - else if ((buttons & Pointer.PointerButtonState.SecondButtonUp) != 0) builder.Append("^"); - else if ((buttons & Pointer.PointerButtonState.SecondButtonPressed) != 0) builder.Append("2"); - else builder.Append("_"); - - if ((buttons & Pointer.PointerButtonState.ThirdButtonDown) != 0) builder.Append("v"); - else if ((buttons & Pointer.PointerButtonState.ThirdButtonUp) != 0) builder.Append("^"); - else if ((buttons & Pointer.PointerButtonState.ThirdButtonPressed) != 0) builder.Append("3"); - else builder.Append("_"); - - if ((buttons & Pointer.PointerButtonState.FourthButtonDown) != 0) builder.Append("v"); - else if ((buttons & Pointer.PointerButtonState.FourthButtonUp) != 0) builder.Append("^"); - else if ((buttons & Pointer.PointerButtonState.FourthButtonPressed) != 0) builder.Append("4"); - else builder.Append("_"); - - if ((buttons & Pointer.PointerButtonState.FifthButtonDown) != 0) builder.Append("v"); - else if ((buttons & Pointer.PointerButtonState.FifthButtonUp) != 0) builder.Append("^"); - else if ((buttons & Pointer.PointerButtonState.FifthButtonPressed) != 0) builder.Append("5"); - else builder.Append("_"); - } + else if ((buttons & Pointer.PointerButtonState.FirstButtonPressed) != 0) builder.Append("1"); + else builder.Append("_"); + if ((buttons & Pointer.PointerButtonState.SecondButtonDown) != 0) builder.Append("v"); + else if ((buttons & Pointer.PointerButtonState.SecondButtonUp) != 0) builder.Append("^"); + else if ((buttons & Pointer.PointerButtonState.SecondButtonPressed) != 0) builder.Append("2"); + else builder.Append("_"); + + if ((buttons & Pointer.PointerButtonState.ThirdButtonDown) != 0) builder.Append("v"); + else if ((buttons & Pointer.PointerButtonState.ThirdButtonUp) != 0) builder.Append("^"); + else if ((buttons & Pointer.PointerButtonState.ThirdButtonPressed) != 0) builder.Append("3"); + else builder.Append("_"); + + if ((buttons & Pointer.PointerButtonState.FourthButtonDown) != 0) builder.Append("v"); + else if ((buttons & Pointer.PointerButtonState.FourthButtonUp) != 0) builder.Append("^"); + else if ((buttons & Pointer.PointerButtonState.FourthButtonPressed) != 0) builder.Append("4"); + else builder.Append("_"); + + if ((buttons & Pointer.PointerButtonState.FifthButtonDown) != 0) builder.Append("v"); + else if ((buttons & Pointer.PointerButtonState.FifthButtonUp) != 0) builder.Append("^"); + else if ((buttons & Pointer.PointerButtonState.FifthButtonPressed) != 0) builder.Append("5"); + else builder.Append("_"); + } + + /// + /// Adds pressed state to downed buttons. + /// + /// The buttons state. + /// Changed buttons state. public static Pointer.PointerButtonState DownPressedButtons(Pointer.PointerButtonState buttons) { - var btns = buttons & Pointer.PointerButtonState.AnyButtonPressed; - if ((btns & Pointer.PointerButtonState.FirstButtonPressed) != 0) - btns |= Pointer.PointerButtonState.FirstButtonDown; - if ((btns & Pointer.PointerButtonState.SecondButtonPressed) != 0) - btns |= Pointer.PointerButtonState.SecondButtonDown; - if ((btns & Pointer.PointerButtonState.ThirdButtonPressed) != 0) - btns |= Pointer.PointerButtonState.ThirdButtonDown; - if ((btns & Pointer.PointerButtonState.FourthButtonPressed) != 0) - btns |= Pointer.PointerButtonState.FourthButtonDown; - if ((btns & Pointer.PointerButtonState.FifthButtonPressed) != 0) - btns |= Pointer.PointerButtonState.FifthButtonDown; - return btns; + if ((buttons & Pointer.PointerButtonState.FirstButtonPressed) != 0) + buttons |= Pointer.PointerButtonState.FirstButtonDown; + if ((buttons & Pointer.PointerButtonState.SecondButtonPressed) != 0) + buttons |= Pointer.PointerButtonState.SecondButtonDown; + if ((buttons & Pointer.PointerButtonState.ThirdButtonPressed) != 0) + buttons |= Pointer.PointerButtonState.ThirdButtonDown; + if ((buttons & Pointer.PointerButtonState.FourthButtonPressed) != 0) + buttons |= Pointer.PointerButtonState.FourthButtonDown; + if ((buttons & Pointer.PointerButtonState.FifthButtonPressed) != 0) + buttons |= Pointer.PointerButtonState.FifthButtonDown; + return buttons; } + /// + /// Adds downed state to pressed buttons. + /// + /// The buttons state. + /// Changed buttons state. public static Pointer.PointerButtonState PressDownButtons(Pointer.PointerButtonState buttons) { - var btns = buttons; - if ((btns & Pointer.PointerButtonState.FirstButtonDown) != 0) - btns |= Pointer.PointerButtonState.FirstButtonPressed; - if ((btns & Pointer.PointerButtonState.SecondButtonDown) != 0) - btns |= Pointer.PointerButtonState.SecondButtonPressed; - if ((btns & Pointer.PointerButtonState.ThirdButtonDown) != 0) - btns |= Pointer.PointerButtonState.ThirdButtonPressed; - if ((btns & Pointer.PointerButtonState.FourthButtonDown) != 0) - btns |= Pointer.PointerButtonState.FourthButtonPressed; - if ((btns & Pointer.PointerButtonState.FifthButtonDown) != 0) - btns |= Pointer.PointerButtonState.FifthButtonPressed; - return btns; + if ((buttons & Pointer.PointerButtonState.FirstButtonDown) != 0) + buttons |= Pointer.PointerButtonState.FirstButtonPressed; + if ((buttons & Pointer.PointerButtonState.SecondButtonDown) != 0) + buttons |= Pointer.PointerButtonState.SecondButtonPressed; + if ((buttons & Pointer.PointerButtonState.ThirdButtonDown) != 0) + buttons |= Pointer.PointerButtonState.ThirdButtonPressed; + if ((buttons & Pointer.PointerButtonState.FourthButtonDown) != 0) + buttons |= Pointer.PointerButtonState.FourthButtonPressed; + if ((buttons & Pointer.PointerButtonState.FifthButtonDown) != 0) + buttons |= Pointer.PointerButtonState.FifthButtonPressed; + return buttons; } + /// + /// Converts pressed buttons to up state. + /// + /// The buttons state. + /// Changed buttons state. public static Pointer.PointerButtonState UpPressedButtons(Pointer.PointerButtonState buttons) { var btns = Pointer.PointerButtonState.Nothing; - if ((btns & Pointer.PointerButtonState.FirstButtonPressed) != 0) + if ((buttons & Pointer.PointerButtonState.FirstButtonPressed) != 0) btns |= Pointer.PointerButtonState.FirstButtonUp; - if ((btns & Pointer.PointerButtonState.SecondButtonPressed) != 0) + if ((buttons & Pointer.PointerButtonState.SecondButtonPressed) != 0) btns |= Pointer.PointerButtonState.SecondButtonUp; - if ((btns & Pointer.PointerButtonState.ThirdButtonPressed) != 0) + if ((buttons & Pointer.PointerButtonState.ThirdButtonPressed) != 0) btns |= Pointer.PointerButtonState.ThirdButtonUp; - if ((btns & Pointer.PointerButtonState.FourthButtonPressed) != 0) + if ((buttons & Pointer.PointerButtonState.FourthButtonPressed) != 0) btns |= Pointer.PointerButtonState.FourthButtonUp; - if ((btns & Pointer.PointerButtonState.FifthButtonPressed) != 0) + if ((buttons & Pointer.PointerButtonState.FifthButtonPressed) != 0) btns |= Pointer.PointerButtonState.FifthButtonUp; return btns; } diff --git a/Source/Assets/TouchScript/Scripts/Utils/TransformUtils.cs b/Source/Assets/TouchScript/Scripts/Utils/TransformUtils.cs index 4e1bcbbc7..60f04c59b 100644 --- a/Source/Assets/TouchScript/Scripts/Utils/TransformUtils.cs +++ b/Source/Assets/TouchScript/Scripts/Utils/TransformUtils.cs @@ -7,23 +7,43 @@ namespace TouchScript.Utils { + /// + /// Utility methods to work with Transforms. + /// public static class TransformUtils { - private static StringBuilder sb; + /// + /// Converts a global position of a transform to local position in its parent's coordinate system. + /// + /// The transform. + /// The global position. + /// Local position in transform parent's coordinate system. public static Vector3 GlobalToLocalPosition(Transform transform, Vector3 global) { if (transform.parent == null) return global; return transform.parent.InverseTransformPoint(global); } + /// + /// Converts a global direction of a transform to local direction in its parent's coordinate system. + /// + /// The transform. + /// The global direction. + /// Local direction in transform parent's coordinate system. public static Vector3 GlobalToLocalDirection(Transform transform, Vector3 global) { if (transform.parent == null) return global; return transform.parent.InverseTransformDirection(global); } + /// + /// Converts a global vector of a transform to local vector in its parent's coordinate system. The difference from is that this vector has length. + /// + /// The transform. + /// The global vector. + /// Local vector in transform parent's coordinate system. public static Vector3 GlobalToLocalVector(Transform transform, Vector3 global) { var parent = transform.parent; @@ -39,6 +59,11 @@ public static Vector3 GlobalToLocalVector(Transform transform, Vector3 global) return vector; } + /// + /// Returns the string path of the transform in the hierarchy, i.g. "GameObject/ChildGameObject". + /// + /// The transform. + /// The path in the hierarchy. public static string GetHeirarchyPath(Transform transform) { initStringBuilder(); @@ -54,10 +79,10 @@ public static string GetHeirarchyPath(Transform transform) return sb.ToString(); } - private static void initStringBuilder() - { - if (sb == null) sb = new StringBuilder(); - sb.Length = 0; - } + private static void initStringBuilder() + { + if (sb == null) sb = new StringBuilder(); + sb.Length = 0; + } } } \ No newline at end of file From 45030220afbab05b0e87312a20574f1fef6ea152 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 23 Jul 2017 07:38:25 +0300 Subject: [PATCH 29/58] Fixed issues with debug cursors in builds. --- .../Scripts/Debugging/GL/GLDebug.cs | 63 ++++++++++++++++--- .../Scripts/TouchManagerInstance.cs | 17 ----- 2 files changed, 55 insertions(+), 25 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Debugging/GL/GLDebug.cs b/Source/Assets/TouchScript/Scripts/Debugging/GL/GLDebug.cs index 19ad71363..4a0fdedce 100644 --- a/Source/Assets/TouchScript/Scripts/Debugging/GL/GLDebug.cs +++ b/Source/Assets/TouchScript/Scripts/Debugging/GL/GLDebug.cs @@ -1,4 +1,4 @@ -/* +/* * @author Valentin Simonov / http://va.lent.in/ * Based on http://pastebin.com/69QP1s45 */ @@ -6,14 +6,19 @@ #if TOUCHSCRIPT_DEBUG +using System.Collections; using System.Collections.Generic; using UnityEngine; +using UnityEngine.Rendering; +#if UNITY_EDITOR +using UnityEditor; +using UnityEditor.Build; +#endif namespace TouchScript.Debugging.GL { public class GLDebug : MonoBehaviour { - public static readonly Color MULTIPLY = new Color(0, 0, 0, 0); public static readonly Vector2 DEFAULT_SCREEN_SPACE_SCALE = new Vector2(10, 10); @@ -58,6 +63,8 @@ private static GLDebug instance private Dictionary figuresMultiplyScreenSpace; private Dictionary figuresTmp; + private WaitForEndOfFrame wait; + #region Public methods public static void RemoveFigure(int id) @@ -79,7 +86,7 @@ public static int DrawLine(Vector3 start, Vector3 end, Color? color = null, floa public static int DrawLine(int? id, Vector3 start, Vector3 end, Color? color = null, float duration = 0, bool depthTest = false) { - return drawFigure(id, new List() { new Line(start, end) }, color ?? Color.white, duration, depthTest); + return drawFigure(id, new List() {new Line(start, end)}, color ?? Color.white, duration, depthTest); } public static int DrawLineScreenSpace(Vector2 start, Vector2 end, Color? color = null, float duration = 0) @@ -89,7 +96,7 @@ public static int DrawLineScreenSpace(Vector2 start, Vector2 end, Color? color = public static int DrawLineScreenSpace(int? id, Vector2 start, Vector2 end, Color? color = null, float duration = 0) { - return drawFigureScreenSpace(id, new List() { new Line(start, end) }, color ?? Color.white, duration); + return drawFigureScreenSpace(id, new List() {new Line(start, end)}, color ?? Color.white, duration); } #endregion @@ -285,6 +292,7 @@ private void Awake() figuresMultiplyNoDepthTest = new Dictionary(); figuresMultiplyScreenSpace = new Dictionary(); figuresTmp = new Dictionary(); + wait = new WaitForEndOfFrame(); setMaterials(); } @@ -295,9 +303,11 @@ private void Update() DisplayLines = !DisplayLines; } - private void OnPostRender() + private IEnumerator OnPostRender() { - if (!DisplayLines) return; + if (!DisplayLines) yield break; + + yield return wait; materialDepthTest.SetPass(0); UnityEngine.GL.Begin(UnityEngine.GL.LINES); @@ -554,12 +564,10 @@ private static List createCubeLines(Matrix4x4 matrix) new Line(down_2, down_3), new Line(down_3, down_4), new Line(down_4, down_1), - new Line(down_1, up_1), new Line(down_2, up_2), new Line(down_3, up_3), new Line(down_4, up_4), - new Line(up_1, up_2), new Line(up_2, up_3), new Line(up_3, up_4), @@ -618,8 +626,47 @@ public void Draw() } #endregion + } + +#if UNITY_EDITOR + internal class BuildProcessor : IPreprocessBuild, IPostprocessBuild + { + public int callbackOrder + { + get { return 0; } + } + public void OnPreprocessBuild(BuildTarget target, string path) + { + // Add hidden shaders to the build. + var objs = Resources.FindObjectsOfTypeAll(); + var graphicsSettings = new SerializedObject(objs[0]); + var alwaysIncludedShaders = graphicsSettings.FindProperty("m_AlwaysIncludedShaders"); + insertShaderInProperty(alwaysIncludedShaders, "Hidden/DebugDepthTest"); + insertShaderInProperty(alwaysIncludedShaders, "Hidden/DebugNoDepthTest"); + insertShaderInProperty(alwaysIncludedShaders, "Hidden/DebugMultiplyDepthTest"); + insertShaderInProperty(alwaysIncludedShaders, "Hidden/DebugMultiplyNoDepthTest"); + graphicsSettings.ApplyModifiedProperties(); + } + + public void OnPostprocessBuild(BuildTarget target, string path) + { + // Reverd GraphicsSettings. + var objs = Resources.FindObjectsOfTypeAll(); + var graphicsSettings = new SerializedObject(objs[0]); + var alwaysIncludedShaders = graphicsSettings.FindProperty("m_AlwaysIncludedShaders"); + alwaysIncludedShaders.arraySize = alwaysIncludedShaders.arraySize - 4; + graphicsSettings.ApplyModifiedProperties(); + } + + private void insertShaderInProperty(SerializedProperty prop, string shaderName) + { + var index = prop.arraySize; + prop.InsertArrayElementAtIndex(index); + prop.GetArrayElementAtIndex(index).objectReferenceValue = Shader.Find(shaderName); + } } +#endif } #endif \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs index 9aa66fe0b..ac67f812c 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs @@ -335,7 +335,6 @@ internal void INTERNAL_AddPointer(Pointer pointer) #if TOUCHSCRIPT_DEBUG pLogger.Log(pointer, PointerEvent.IdAllocated); - if (DebugMode) Debug.Log("TouchScript > Pointer Added: " + pointer); #endif nextPointerId++; @@ -362,10 +361,6 @@ internal void INTERNAL_UpdatePointer(int id) } pointersUpdated.Add(id); - -#if TOUCHSCRIPT_DEBUG - if (DebugMode) Debug.Log("TouchScript > Pointer Updated: " + pointer); -#endif } } @@ -398,9 +393,6 @@ internal void INTERNAL_PressPointer(int id) pointersPressed.Add(id); #endif -#if TOUCHSCRIPT_DEBUG - if (DebugMode) Debug.Log("TouchScript > Pointer Pressed: " + pointer); -#endif } } @@ -434,9 +426,6 @@ internal void INTERNAL_ReleasePointer(int id) pointersReleased.Add(id); #endif -#if TOUCHSCRIPT_DEBUG - if (DebugMode) Debug.Log("TouchScript > Pointer Released: " + pointer); -#endif } } @@ -470,9 +459,6 @@ internal void INTERNAL_RemovePointer(int id) pointersRemoved.Add(pointer.Id); #endif -#if TOUCHSCRIPT_DEBUG - if (DebugMode) Debug.Log("TouchScript > Pointer Removed: " + pointer); -#endif } } @@ -506,9 +492,6 @@ internal void INTERNAL_CancelPointer(int id) pointersCancelled.Add(pointer.Id); #endif -#if TOUCHSCRIPT_DEBUG - if (DebugMode) Debug.Log("TouchScript > Pointer Cancelled: " + pointer); -#endif } } From 60aabf875d71231aa6ea647a4558501c6467782e Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 23 Jul 2017 07:39:39 +0300 Subject: [PATCH 30/58] Fixed a rare null pointer exception in LongPressGesture. --- .../Scripts/Gestures/LongPressGesture.cs | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs index ef9e6fced..877767e30 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs @@ -42,7 +42,7 @@ public event EventHandler LongPressed // Needed to overcome iOS AOT limitations private EventHandler longPressedInvoker; - public GestureEvent OnLongPress = new GestureEvent(); + public GestureEvent OnLongPress = new GestureEvent(); #endregion @@ -149,7 +149,7 @@ protected override void onRecognized() base.onRecognized(); if (longPressedInvoker != null) longPressedInvoker.InvokeHandleExceptions(this, EventArgs.Empty); if (UseSendMessage && SendMessageTarget != null) SendMessageTarget.SendMessage(LONG_PRESS_MESSAGE, this, SendMessageOptions.DontRequireReceiver); - if (UseUnityEvents) OnLongPress.Invoke(this); + if (UseUnityEvents) OnLongPress.Invoke(this); } /// @@ -173,14 +173,11 @@ private IEnumerator wait() if (State == GestureState.Possible) { - if (GetScreenPositionHitData().Target.IsChildOf(cachedTransform)) - { - setState(GestureState.Recognized); - } - else - { + var data = GetScreenPositionHitData(); + if (data.Target == null || !data.Target.IsChildOf(cachedTransform)) setState(GestureState.Failed); - } + else + setState(GestureState.Recognized); } } From 9e60aad7f82519c37ee53cf46c61e33a16cdee81 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 23 Jul 2017 07:44:30 +0300 Subject: [PATCH 31/58] Fixed building without TOUCHSCRIPT_DEBUG. --- .../Scripts/Debugging/Filters/IPointerDataFilter.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Debugging/Filters/IPointerDataFilter.cs b/Source/Assets/TouchScript/Scripts/Debugging/Filters/IPointerDataFilter.cs index f6493d49f..5fe884e13 100644 --- a/Source/Assets/TouchScript/Scripts/Debugging/Filters/IPointerDataFilter.cs +++ b/Source/Assets/TouchScript/Scripts/Debugging/Filters/IPointerDataFilter.cs @@ -2,10 +2,10 @@ * @author Valentin Simonov / http://va.lent.in/ */ -using TouchScript.Debugging.Loggers; - #if TOUCHSCRIPT_DEBUG +using TouchScript.Debugging.Loggers; + namespace TouchScript.Debugging.Filters { /// From ef15e046e7071848bea510d34743032a5acf32d0 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 23 Jul 2017 14:29:23 +0300 Subject: [PATCH 32/58] Logger to write touch events on disk and ability to load this data in the editor. --- .../Editor/Debugging/PointerDebuggerWindow.cs | 206 ++++++++++++------ .../TouchScript/Prefabs/TouchManager.prefab | 14 +- .../Debugging/Loggers/FileReaderLogger.cs | 135 ++++++++++++ .../Loggers/FileReaderLogger.cs.meta | 12 + .../Debugging/Loggers/FileWriterLogger.cs | 81 +++++++ .../Loggers/FileWriterLogger.cs.meta | 12 + .../Debugging/Loggers/IPointerLogger.cs | 7 +- .../Debugging/Loggers/PointerLogger.cs | 39 ++-- .../Scripts/Debugging/TouchScriptDebugger.cs | 63 +++++- 9 files changed, 471 insertions(+), 98 deletions(-) create mode 100644 Source/Assets/TouchScript/Scripts/Debugging/Loggers/FileReaderLogger.cs create mode 100644 Source/Assets/TouchScript/Scripts/Debugging/Loggers/FileReaderLogger.cs.meta create mode 100644 Source/Assets/TouchScript/Scripts/Debugging/Loggers/FileWriterLogger.cs create mode 100644 Source/Assets/TouchScript/Scripts/Debugging/Loggers/FileWriterLogger.cs.meta diff --git a/Source/Assets/TouchScript/Editor/Debugging/PointerDebuggerWindow.cs b/Source/Assets/TouchScript/Editor/Debugging/PointerDebuggerWindow.cs index 3504cbf05..a35b1a8c3 100644 --- a/Source/Assets/TouchScript/Editor/Debugging/PointerDebuggerWindow.cs +++ b/Source/Assets/TouchScript/Editor/Debugging/PointerDebuggerWindow.cs @@ -6,6 +6,7 @@ using System; using System.Collections.Generic; +using System.IO; using TouchScript.Debugging; using TouchScript.Debugging.Filters; using TouchScript.Debugging.GL; @@ -21,7 +22,6 @@ public class PointerDebuggerWindow : EditorWindow { private class Styles : IDisposable { - public Texture2D BG; public int Padding = 5; @@ -41,6 +41,7 @@ private class Styles : IDisposable public GUIStyle PointerItemStyle; public GUIStyle EnterPlayModeText; public GUIStyle SmallText; + public GUIStyle SmallButton; public GUIStyle FilterToggle; public Styles() @@ -65,8 +66,21 @@ public Styles() alignment = TextAnchor.UpperLeft, }; + SmallButton = new GUIStyle("Button") + { + fontSize = SmallText.fontSize, + fontStyle = SmallText.fontStyle, + font = SmallText.font, + }; + FilterToggle = new GUIStyle("ShurikenToggle") - { }; + { + fontSize = SmallText.fontSize, + fontStyle = SmallText.fontStyle, + font = SmallText.font, + }; + FilterToggle.normal.textColor = SmallText.normal.textColor; + FilterToggle.onNormal.textColor = SmallText.normal.textColor; } public void Dispose() @@ -85,6 +99,12 @@ public static Texture2D CreateColorTexture(Color color) } } + public enum LogType + { + Editor, + File + } + // sec private const float UPDATE_INTERVAL = 1f; @@ -104,11 +124,9 @@ static void createWindow() window.Show(); } - [NonSerialized] - private bool initializedForPlayMode = false; - private Styles styles; + private LogType logType; private IPointerLogger pLogger; private PointerVisualizer pointerVisualizer; private PagedList pointerList; @@ -119,32 +137,49 @@ static void createWindow() [NonSerialized] private int pointerDataCount = 0; + [NonSerialized] private List pointerData = new List(); + [NonSerialized] private List pointerStrings = new List(); + [NonSerialized] private List pointerEvents = new List(); + [NonSerialized] private PointerLog selectedEvent; + + [NonSerialized] + private int selectedEventId = -1; + [NonSerialized] private Dictionary pointerEventStrings = new Dictionary(); + [NonSerialized] private PointerLogFilter logFilter; + private FilterState filterState; //private Vector2 filterScroll; private bool autoRefresh = true; + [NonSerialized] private float refreshTime; private void OnEnable() { + setupLogging(); + if (EditorApplication.isPlayingOrWillChangePlaymode) + setupPlaymodeLogging(); + if (filterState == null) { filterState = new FilterState(); filterState.Load(); } + + EditorApplication.update += updateHandler; } private void OnDisable() @@ -156,7 +191,7 @@ private void OnDisable() private void updateHandler() { - if (!Application.isPlaying) return; + if (pLogger == null) return; if (pLogger.PointerCount != pointerDataCount) { @@ -173,23 +208,48 @@ private void updateHandler() } } - #region Update + #region Init - private void initPlayMode() + private void setupPlaymodeLogging() { - if (initializedForPlayMode || !Application.isPlaying) return; + TouchScriptDebugger.Instance.PointerLogger = pLogger = new PointerLogger(); + } - pLogger = TouchScriptDebugger.Instance.PointerLogger; + private void setupLogging() + { pointerVisualizer = new PointerVisualizer(); - pointerList = new PagedList(styles.PointerItemHeight, drawPointerItem, pointerSelectionChangeHandler); - eventList = new PagedList(styles.PointerItemHeight, drawEventItem, eventSelectionChangeHandler); + pointerList = new PagedList(22, drawPointerItem, pointerSelectionChangeHandler); + eventList = new PagedList(22, drawEventItem, eventSelectionChangeHandler); logFilter = new PointerLogFilter(); + } - EditorApplication.update += updateHandler; + private void loadLogFile() + { + var path = EditorUtility.OpenFilePanel("Load log data", Application.dataPath, "bin"); + if (string.IsNullOrEmpty(path)) return; + pLogger = new FileReaderLogger(path); + updatePointers(); + } + + private void updateLogType(LogType type) + { + logType = type; - initializedForPlayMode = true; + if (type == LogType.Editor) + { + if (pLogger != null) pLogger.Dispose(); + if (EditorApplication.isPlayingOrWillChangePlaymode) setupPlaymodeLogging(); + } + else + { + TouchScriptDebugger.Instance.ClearPointerLogger(); + } } + #endregion + + #region Update + private void updatePointers() { pointerData = pLogger.GetFilteredPointerData(); @@ -234,10 +294,12 @@ private void selectEvent() if (eventList.SelectedId == -1) { pointerVisualizer.Hide(); + selectedEventId = -1; return; } - selectedEvent = pointerEvents[eventList.SelectedId]; + selectedEventId = eventList.SelectedId; + selectedEvent = pointerEvents[selectedEventId]; pointerVisualizer.Show(selectedEvent.State.Position); switchTab(Tab.Event); } @@ -284,9 +346,6 @@ private void OnGUI() { if (styles == null) styles = new Styles(); - var playmode = Application.isPlaying; - if (playmode) initPlayMode(); - int height = styles.TopWindowHeight; //int height = pointerList.FitHeight(10); @@ -298,16 +357,16 @@ private void OnGUI() switch (activeTab) { case Tab.Pointers: - if (playmode) - pointerList.Draw(rect); + if (pointerData.Count == 0) + drawNoData(rect); else - drawPlaymodeText(rect); + pointerList.Draw(rect); break; case Tab.Event: - if (playmode) - drawSelectedEvent(rect); + if (selectedEventId == -1) + drawNoData(rect); else - drawPlaymodeText(rect); + drawSelectedEvent(rect); break; case Tab.Filters: drawFilters(rect); @@ -323,10 +382,10 @@ private void OnGUI() GUI.DrawTexture(rect, styles.BG); GUIUtils.ContractRect(ref rect, styles.GlobalPadding); - if (playmode) - eventList.Draw(rect); + if (pointerEvents.Count == 0) + drawNoData(rect); else - drawPlaymodeText(rect); + eventList.Draw(rect); } private void drawFilters(Rect rect) @@ -335,7 +394,8 @@ private void drawFilters(Rect rect) GUI.Label(rect, "Show pointer events:"); - rect.y += 20; rect.height -= 20; + rect.y += 20; + rect.height -= 20; var scrollRect = new Rect(rect); scrollRect.height *= 2; scrollRect.width -= 40; @@ -345,14 +405,14 @@ private void drawFilters(Rect rect) //using (var scope = new GUI.ScrollViewScope(rect, filterScroll, scrollRect)) //{ scrollRect.height = 14; - var names = Enum.GetNames(typeof(PointerEvent)); + var names = Enum.GetNames(typeof (PointerEvent)); using (var changeScope = new EditorGUI.ChangeCheckScope()) { for (var i = 1; i < names.Length; i++) { - var evt = (PointerEvent)i; + var evt = (PointerEvent) i; filterState.SetEventValue(evt, - GUI.Toggle(scrollRect, filterState.IsEventEnabled(evt), " " + names[i], styles.FilterToggle)); + GUI.Toggle(scrollRect, filterState.IsEventEnabled(evt), " " + names[i], styles.FilterToggle)); scrollRect.y += scrollRect.height; } if (changeScope.changed) filterState.Save(); @@ -360,7 +420,9 @@ private void drawFilters(Rect rect) // filterScroll = scope.scrollPosition; //} - using (var scope = new EditorGUI.DisabledScope(!Application.isPlaying)) + scrollRect.y += 4; + scrollRect.height = 20; + using (var scope = new EditorGUI.DisabledScope(pointerList.SelectedId == -1)) { if (GUI.Button(scrollRect, "Apply filter")) { @@ -391,18 +453,39 @@ private void drawRefresh() var rect = GUILayoutUtility.GetRect(0, styles.RefreshHeight, GUILayout.ExpandWidth(true)); GUIUtils.ContractRect(ref rect, styles.Padding); + var sourceRect = new Rect(rect); + sourceRect.width = 50; + GUI.Label(sourceRect, " Source", styles.SmallText); + sourceRect.x += sourceRect.width; + using (var scope = new EditorGUI.ChangeCheckScope()) + { + logType = (LogType) EditorGUI.EnumPopup(sourceRect, "", logType); + if (scope.changed) updateLogType(logType); + } + + if (logType == LogType.File) + { + sourceRect.x += sourceRect.width + 2; + sourceRect.width = 40; + sourceRect.height = 15; + if (GUI.Button(sourceRect, "Load", styles.SmallButton)) + { + loadLogFile(); + } + } + var refreshRect = new Rect(rect); - refreshRect.x = refreshRect.width - 100 - 60; - refreshRect.width = 100; - autoRefresh = GUI.Toggle(refreshRect, autoRefresh, " Auto Refresh", styles.FilterToggle); + refreshRect.x = refreshRect.width - 50 - 60; + refreshRect.width = 50; + autoRefresh = GUI.Toggle(refreshRect, autoRefresh, " Auto", styles.FilterToggle); using (var scope = new EditorGUI.DisabledScope(autoRefresh)) { rect.x = rect.width - 60; rect.width = 60; - rect.height = 20; - rect.y -= 4; - if (GUI.Button(rect, "Refresh")) + rect.height = 15; + rect.y -= 1; + if (GUI.Button(rect, "Refresh", styles.SmallButton)) { updateEventList(); } @@ -411,7 +494,7 @@ private void drawRefresh() private void drawSelectedEvent(Rect rect) { - if (eventList.SelectedId == -1) + if (selectedEvent.Id == -1) { GUI.Label(rect, "No event selected.", styles.EnterPlayModeText); return; @@ -421,9 +504,9 @@ private void drawSelectedEvent(Rect rect) var path = selectedEvent.State.TargetPath; GUI.Label(rect, string.Format("{0}\nPosition: {1}\nPrevious: {2}\nFlags: {3}, Buttons: {4}", - getEventString(eventList.SelectedId), selectedEvent.State.Position, - selectedEvent.State.PreviousPosition, selectedEvent.State.Flags, - PointerUtils.ButtonsToString(selectedEvent.State.Buttons))); + getEventString(selectedEventId), selectedEvent.State.Position, + selectedEvent.State.PreviousPosition, selectedEvent.State.Flags, + PointerUtils.ButtonsToString(selectedEvent.State.Buttons))); rect.y += 64; rect.height = 20; GUI.Label(rect, "Target: "); @@ -432,7 +515,7 @@ private void drawSelectedEvent(Rect rect) var fieldRect = new Rect(rect); fieldRect.x += 50; fieldRect.width -= 50; - EditorGUI.ObjectField(fieldRect, transform, typeof(Transform), true); + EditorGUI.ObjectField(fieldRect, transform, typeof (Transform), true); } if (path != null) @@ -465,6 +548,11 @@ private bool drawTab(Rect rect, string content, bool selected) return false; } + private void drawNoData(Rect rect) + { + GUI.Label(rect, "No data available.", styles.EnterPlayModeText); + } + private void drawPlaymodeText(Rect rect) { GUI.Label(rect, "Data is only available in Play Mode.", styles.EnterPlayModeText); @@ -508,7 +596,6 @@ private void drawEventItem(int id, Rect rect, bool selected) GUI.Box(rect, getEventString(id), styles.PointerItemStyle); GUI.backgroundColor = bg; - } #endregion @@ -527,33 +614,32 @@ private void eventSelectionChangeHandler(int id) #endregion - private class PointerVisualizer : UnityEngine.Object + private class PointerVisualizer { - private int currentDebugId = -1; - public PointerVisualizer() - { - } + public PointerVisualizer() {} public void Show(Vector2 position) { + if (!Application.isPlaying) return; + if (currentDebugId != -1) Hide(); currentDebugId = GLDebug.DrawSquareScreenSpace(position, 0, Vector2.one * 20, GLDebug.MULTIPLY, float.MaxValue); } public void Hide() { + if (!Application.isPlaying) return; + GLDebug.RemoveFigure(currentDebugId); currentDebugId = -1; } - } [Serializable] private class FilterState : ISerializationCallbackReceiver { - private const string KEY = "TouchScript:Debugger:FilterState"; [SerializeField] @@ -561,29 +647,26 @@ private class FilterState : ISerializationCallbackReceiver public uint PointerEventMask { - get - { - return BinaryUtils.ToBinaryMask(pointerEvents); - } + get { return BinaryUtils.ToBinaryMask(pointerEvents); } } public FilterState() { - var eventsCount = Enum.GetValues(typeof(PointerEvent)).Length; + var eventsCount = Enum.GetValues(typeof (PointerEvent)).Length; pointerEvents = new List(eventsCount); syncPointerEvents(eventsCount); } public bool IsEventEnabled(PointerEvent evt) { - var id = (int)evt; + var id = (int) evt; if (id >= pointerEvents.Count) return false; return pointerEvents[id]; } public void SetEventValue(PointerEvent evt, bool value) { - pointerEvents[(int)evt] = value; + pointerEvents[(int) evt] = value; } public void Save() @@ -604,13 +687,11 @@ private void syncPointerEvents(int count) for (var i = pointerEvents.Count; i < count; i++) pointerEvents.Add(true); } - public void OnBeforeSerialize() - { - } + public void OnBeforeSerialize() {} public void OnAfterDeserialize() { - var eventsCount = Enum.GetValues(typeof(PointerEvent)).Length; + var eventsCount = Enum.GetValues(typeof (PointerEvent)).Length; if (pointerEvents.Count != eventsCount) { Debug.Log("FilterState serialization error!"); @@ -622,7 +703,6 @@ public void OnAfterDeserialize() } } } - } } diff --git a/Source/Assets/TouchScript/Prefabs/TouchManager.prefab b/Source/Assets/TouchScript/Prefabs/TouchManager.prefab index 14ff6ccf2..8e8469645 100644 --- a/Source/Assets/TouchScript/Prefabs/TouchManager.prefab +++ b/Source/Assets/TouchScript/Prefabs/TouchManager.prefab @@ -5,11 +5,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 400002} - - 114: {fileID: 11400000} - - 114: {fileID: 11478012} + - component: {fileID: 400002} + - component: {fileID: 11400000} + - component: {fileID: 11478012} m_Layer: 0 m_Name: TouchManager m_TagString: Untagged @@ -26,10 +26,10 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 0} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &11400000 MonoBehaviour: m_ObjectHideFlags: 1 @@ -41,6 +41,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 0dd4c394fe06f4ea49e03aaa5e7a8190, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 1 OnFrameStart: m_PersistentCalls: m_Calls: [] @@ -89,8 +90,7 @@ MonoBehaviour: sendMessageEvents: 60 sendMessageTarget: {fileID: 0} useUnityEvents: 0 - layers: - - {fileID: 0} + layers: [] --- !u!114 &11478012 MonoBehaviour: m_ObjectHideFlags: 1 diff --git a/Source/Assets/TouchScript/Scripts/Debugging/Loggers/FileReaderLogger.cs b/Source/Assets/TouchScript/Scripts/Debugging/Loggers/FileReaderLogger.cs new file mode 100644 index 000000000..4896fcee1 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Debugging/Loggers/FileReaderLogger.cs @@ -0,0 +1,135 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using System; +using System.Collections.Generic; +using System.IO; +using TouchScript.Debugging.Filters; +using TouchScript.Pointers; +using UnityEngine; + +#if TOUCHSCRIPT_DEBUG + +namespace TouchScript.Debugging.Loggers +{ + public class FileReaderLogger : IPointerLogger + { + public const int MIN_POINTER_LIST_SIZE = 1000; + + private int pointerCount = 0; + private BinaryReader reader; + + protected List data = new List(1); + protected List> events = new List>(1); + + /// + public int PointerCount + { + get { return pointerCount; } + } + + public FileReaderLogger(string path) + { + try + { + reader = new BinaryReader(new FileStream(path, FileMode.Open)); + } + catch (IOException e) + { + Debug.LogFormat("Error opening file at '{0}'. {1}", path, e.Message); + } + + try + { + while (true) + { + var type = (Pointer.PointerType) reader.ReadUInt32(); + var log = new PointerLog() + { + Id = reader.ReadInt32(), + Tick = reader.ReadInt64(), + PointerId = reader.ReadInt32(), + Event = (PointerEvent) reader.ReadUInt32(), + State = new PointerState() + { + Buttons = (Pointer.PointerButtonState) reader.ReadUInt32(), + Position = new Vector2(reader.ReadSingle(), reader.ReadSingle()), + PreviousPosition = new Vector2(reader.ReadSingle(), reader.ReadSingle()), + Flags = reader.ReadUInt32(), + Target = null, + TargetPath = reader.ReadString(), + } + }; + + checkId(log.PointerId, type); + var list = getPointerList(log.PointerId); + list.Add(log); + } + } + catch (Exception e) {} + finally + { + reader.Close(); + } + } + + /// + public void Log(Pointer pointer, PointerEvent evt) + { + throw new NotImplementedException("FileReaderLogger doesn't support writing data."); + } + + /// + public List GetFilteredPointerData(IPointerDataFilter filter = null) + { + //if (filter == null) + return new List(data); + } + + /// + public List GetFilteredLogsForPointer(int id, IPointerLogFilter filter = null) + { + if (id < 0 || id >= pointerCount) + return new List(); + + List list = events[id]; + if (filter == null) + return new List(list); + + var count = list.Count; + List filtered = new List(count); + for (var i = 0; i < count; i++) + { + var item = list[i]; + if (filter.Applies(ref item)) filtered.Add(item); + } + return filtered; + } + + public void Dispose() {} + + private IList getPointerList(int id) + { + return events[id]; + } + + private void checkId(int id, Pointer.PointerType type) + { + if (id > pointerCount) throw new InvalidOperationException("Pointer id desync!"); + else if (id == pointerCount) + { + var list = new List(MIN_POINTER_LIST_SIZE); + events.Add(list); + data.Add(new PointerData() + { + Id = id, + Type = type, + }); + pointerCount++; + } + } + } +} + +#endif \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Debugging/Loggers/FileReaderLogger.cs.meta b/Source/Assets/TouchScript/Scripts/Debugging/Loggers/FileReaderLogger.cs.meta new file mode 100644 index 000000000..c6e7e30e2 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Debugging/Loggers/FileReaderLogger.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: cf11ad2c5a60cf64b859ed16fa453e64 +timeCreated: 1500796765 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Debugging/Loggers/FileWriterLogger.cs b/Source/Assets/TouchScript/Scripts/Debugging/Loggers/FileWriterLogger.cs new file mode 100644 index 000000000..9416477e7 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Debugging/Loggers/FileWriterLogger.cs @@ -0,0 +1,81 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using System; +using System.Collections.Generic; +using System.IO; +using TouchScript.Debugging.Filters; +using TouchScript.Pointers; +using TouchScript.Utils; +using UnityEngine; + +#if TOUCHSCRIPT_DEBUG + +namespace TouchScript.Debugging.Loggers +{ + public class FileWriterLogger : IPointerLogger + { + private int eventCount = 0; + private BinaryWriter writer; + + /// + public int PointerCount + { + get { throw new NotImplementedException("FileWriterLogger doesn't support reading data."); } + } + + public FileWriterLogger() + { + var path = Path.Combine(Application.dataPath, "../TouchEvents.bin"); + try + { + writer = new BinaryWriter(new FileStream(path, FileMode.Create)); + } + catch (IOException e) + { + Debug.LogFormat("Error creating file at '{0}'. {1}", path, e.Message); + } + } + + /// + public void Log(Pointer pointer, PointerEvent evt) + { + var path = TransformUtils.GetHeirarchyPath(pointer.GetPressData().Target); + + writer.Write((uint) pointer.Type); + writer.Write(eventCount); + writer.Write(DateTime.Now.Ticks); + writer.Write(pointer.Id); + writer.Write((uint) evt); + writer.Write((uint) pointer.Buttons); + writer.Write(pointer.Position.x); + writer.Write(pointer.Position.y); + writer.Write(pointer.PreviousPosition.x); + writer.Write(pointer.PreviousPosition.y); + writer.Write(pointer.Flags); + writer.Write(path ?? ""); + + eventCount++; + } + + /// + public List GetFilteredPointerData(IPointerDataFilter filter = null) + { + throw new NotImplementedException("FileWriterLogger doesn't support reading data."); + } + + /// + public List GetFilteredLogsForPointer(int id, IPointerLogFilter filter = null) + { + throw new NotImplementedException("FileWriterLogger doesn't support reading data."); + } + + public void Dispose() + { + if (writer != null) writer.Close(); + } + } +} + +#endif \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Debugging/Loggers/FileWriterLogger.cs.meta b/Source/Assets/TouchScript/Scripts/Debugging/Loggers/FileWriterLogger.cs.meta new file mode 100644 index 000000000..b31f029e0 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Debugging/Loggers/FileWriterLogger.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: df991832cfefaf844b8c08c5dd294afc +timeCreated: 1500795302 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Debugging/Loggers/IPointerLogger.cs b/Source/Assets/TouchScript/Scripts/Debugging/Loggers/IPointerLogger.cs index ce0b14218..49d14ff07 100644 --- a/Source/Assets/TouchScript/Scripts/Debugging/Loggers/IPointerLogger.cs +++ b/Source/Assets/TouchScript/Scripts/Debugging/Loggers/IPointerLogger.cs @@ -30,7 +30,6 @@ public interface IPointerLogger /// The event. void Log(Pointer pointer, PointerEvent evt); - /// /// Returns a list of pointers. /// @@ -38,7 +37,6 @@ public interface IPointerLogger /// A list of objects. List GetFilteredPointerData(IPointerDataFilter filter = null); - /// /// Returns a lost of pointer events for a pointer. /// @@ -46,6 +44,11 @@ public interface IPointerLogger /// The filter to use. /// A list of entries. List GetFilteredLogsForPointer(int id, IPointerLogFilter filter = null); + + /// + /// Releases resources. + /// + void Dispose(); } /// diff --git a/Source/Assets/TouchScript/Scripts/Debugging/Loggers/PointerLogger.cs b/Source/Assets/TouchScript/Scripts/Debugging/Loggers/PointerLogger.cs index fbba97e10..875e83a1c 100644 --- a/Source/Assets/TouchScript/Scripts/Debugging/Loggers/PointerLogger.cs +++ b/Source/Assets/TouchScript/Scripts/Debugging/Loggers/PointerLogger.cs @@ -20,7 +20,7 @@ public class PointerLogger : IPointerLogger { #region Consts - private const int MIN_POINTER_LIST_SIZE = 1000; + public const int MIN_POINTER_LIST_SIZE = 1000; #endregion @@ -39,20 +39,20 @@ public int PointerCount private int pointerCount = 0; private int eventCount = 0; - private List data = new List(1); - private List> events = new List>(1); + protected List data = new List(1); + protected List> events = new List>(1); #endregion #region Public methods /// - public void Log(Pointer pointer, PointerEvent evt) + public virtual void Log(Pointer pointer, PointerEvent evt) { var id = checkId(pointer); var list = getPointerList(id); - list.Add(new PointerLog() + var log = new PointerLog() { Id = eventCount, Tick = DateTime.Now.Ticks, @@ -67,19 +67,20 @@ public void Log(Pointer pointer, PointerEvent evt) Target = pointer.GetPressData().Target, TargetPath = TransformUtils.GetHeirarchyPath(pointer.GetPressData().Target), } - }); + }; + list.Add(log); eventCount++; } /// - public List GetFilteredPointerData(IPointerDataFilter filter = null) + public virtual List GetFilteredPointerData(IPointerDataFilter filter = null) { //if (filter == null) return new List(data); } /// - public List GetFilteredLogsForPointer(int id, IPointerLogFilter filter = null) + public virtual List GetFilteredLogsForPointer(int id, IPointerLogFilter filter = null) { if (id < 0 || id >= pointerCount) return new List(); @@ -98,6 +99,9 @@ public List GetFilteredLogsForPointer(int id, IPointerLogFilter filt return filtered; } + /// + public virtual void Dispose() {} + #endregion #region Private functions @@ -111,17 +115,16 @@ private int checkId(Pointer pointer) { var id = pointer.Id; if (id > pointerCount) throw new InvalidOperationException("Pointer id desync!"); - else if (id == pointerCount) + if (id != pointerCount) return id; + + var list = new List(MIN_POINTER_LIST_SIZE); + events.Add(list); + data.Add(new PointerData() { - var list = new List(MIN_POINTER_LIST_SIZE); - events.Add(list); - data.Add(new PointerData() - { - Id = id, - Type = pointer.Type, - }); - pointerCount++; - } + Id = id, + Type = pointer.Type, + }); + pointerCount++; return id; } diff --git a/Source/Assets/TouchScript/Scripts/Debugging/TouchScriptDebugger.cs b/Source/Assets/TouchScript/Scripts/Debugging/TouchScriptDebugger.cs index e63b119c0..b68ce0c07 100644 --- a/Source/Assets/TouchScript/Scripts/Debugging/TouchScriptDebugger.cs +++ b/Source/Assets/TouchScript/Scripts/Debugging/TouchScriptDebugger.cs @@ -4,15 +4,18 @@ #if TOUCHSCRIPT_DEBUG +using System.Collections.Generic; +using TouchScript.Debugging.Filters; using UnityEngine; using TouchScript.Debugging.Loggers; +using TouchScript.Pointers; namespace TouchScript.Debugging { /// /// A set of debugging tools for TouchScript. /// - public class TouchScriptDebugger + public class TouchScriptDebugger : ScriptableObject { /// /// The singleton instance of the debugger. @@ -21,10 +24,15 @@ public static TouchScriptDebugger Instance { get { - if (!Application.isPlaying) return null; if (instance == null) { - instance = new TouchScriptDebugger(); + var objs = Resources.FindObjectsOfTypeAll(); + if (objs.Length > 0) instance = objs[0]; + else + { + instance = CreateInstance(); + instance.hideFlags = HideFlags.HideAndDontSave; + } } return instance; } @@ -36,17 +44,56 @@ public static TouchScriptDebugger Instance public IPointerLogger PointerLogger { get { return pointerLogger; } + set + { + if (value == null) return; + if (pointerLogger == value) return; + pointerLogger.Dispose(); + pointerLogger = value; + } } private static TouchScriptDebugger instance; private IPointerLogger pointerLogger; - /// - /// Initializes a new instance of the class. - /// - public TouchScriptDebugger() + public void ClearPointerLogger() + { + if (Application.isEditor) + pointerLogger = new DummyLogger(); + else + pointerLogger = new FileWriterLogger(); + } + + private void OnEnable() + { + if (pointerLogger == null) ClearPointerLogger(); + } + + private void OnDisable() { - pointerLogger = new PointerLogger(); + if (pointerLogger != null) pointerLogger.Dispose(); + } + + private class DummyLogger : IPointerLogger + { + public int PointerCount + { + get { return 0; } + } + + public void Log(Pointer pointer, PointerEvent evt) {} + + public List GetFilteredPointerData(IPointerDataFilter filter = null) + { + return new List(); + } + + public List GetFilteredLogsForPointer(int id, IPointerLogFilter filter = null) + { + return new List(); + } + + public void Dispose() {} } } } From 58ae80a3047bb6e4dfda36efa7528fcd5888f6e4 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 23 Jul 2017 14:30:15 +0300 Subject: [PATCH 33/58] Fixed occasional frozen touches on windows. --- External/WindowsTouch/WindowsTouch.cpp | 6 +++--- .../InputHandlers/WindowsPointerHandlers.cs | 19 +++++++++++-------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/External/WindowsTouch/WindowsTouch.cpp b/External/WindowsTouch/WindowsTouch.cpp index 1efa9dbf4..9bc7fc95f 100644 --- a/External/WindowsTouch/WindowsTouch.cpp +++ b/External/WindowsTouch/WindowsTouch.cpp @@ -104,7 +104,7 @@ void decodeWin8Touches(UINT msg, WPARAM wParam, LPARAM lParam) ScreenToClient(_currentWindow, &p); Vector2 position = Vector2(((float)p.x - _offsetX) * _scaleX, _screenHeight - ((float)p.y - _offsetY) * _scaleY); - PointerData data; + PointerData data {}; data.pointerFlags = pointerInfo.pointerFlags; data.changedButtons = pointerInfo.ButtonChangeType; @@ -156,7 +156,7 @@ void decodeWin7Touches(UINT msg, WPARAM wParam, LPARAM lParam) ScreenToClient(_currentWindow, &p); Vector2 position = Vector2(((float)p.x - _offsetX) * _scaleX, _screenHeight - ((float)p.y - _offsetY) * _scaleY); - PointerData data; + PointerData data {}; if ((touch.dwFlags & TOUCHEVENTF_DOWN) != 0) { @@ -165,7 +165,7 @@ void decodeWin7Touches(UINT msg, WPARAM wParam, LPARAM lParam) } else if ((touch.dwFlags & TOUCHEVENTF_UP) != 0) { - msg = WM_POINTERUP; + msg = WM_POINTERLEAVE; data.changedButtons = POINTER_CHANGE_FIRSTBUTTON_UP; } else if ((touch.dwFlags & TOUCHEVENTF_MOVE) != 0) diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs index c00e945be..ce0a51217 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs @@ -262,7 +262,7 @@ public virtual bool UpdateInput() public virtual void UpdateResolution() { setScaling(); - TouchManager.Instance.CancelPointer(mousePointer.Id); + if (mousePointer != null) TouchManager.Instance.CancelPointer(mousePointer.Id); } /// @@ -500,24 +500,27 @@ private void nativePointer(int id, PointerEvent evt, PointerType type, Vector2 p } break; case PointerType.Touch: + TouchPointer touchPointer; switch (evt) { - // Enter/Leave logic is handles in Down/Up case PointerEvent.Enter: + break; case PointerEvent.Leave: + // Sometimes Windows might not send Up, so have to execute touch release logic here. + // Has been working fine on test devices so far. + if (winTouchToInternalId.TryGetValue(id, out touchPointer)) + { + winTouchToInternalId.Remove(id); + internalRemoveTouchPointer(touchPointer); + } break; case PointerEvent.Down: - TouchPointer touchPointer = internalAddTouchPointer(position); + touchPointer = internalAddTouchPointer(position); touchPointer.Rotation = getTouchRotation(ref data); touchPointer.Pressure = getTouchPressure(ref data); winTouchToInternalId.Add(id, touchPointer); break; case PointerEvent.Up: - if (winTouchToInternalId.TryGetValue(id, out touchPointer)) - { - winTouchToInternalId.Remove(id); - internalRemoveTouchPointer(touchPointer); - } break; case PointerEvent.Update: if (!winTouchToInternalId.TryGetValue(id, out touchPointer)) return; From 3b612b8799d58af86a5de8e083bc76a7a34d6fec Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 25 Jul 2017 08:01:19 +0300 Subject: [PATCH 34/58] Fixed platform defines. --- .../Scripts/Debugging/Loggers/FileReaderLogger.cs | 5 ++--- .../Scripts/Debugging/Loggers/FileWriterLogger.cs | 4 ++-- .../Scripts/Devices/Display/GenericDisplayDevice.cs | 2 ++ 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Debugging/Loggers/FileReaderLogger.cs b/Source/Assets/TouchScript/Scripts/Debugging/Loggers/FileReaderLogger.cs index 4896fcee1..bd3d7395a 100644 --- a/Source/Assets/TouchScript/Scripts/Debugging/Loggers/FileReaderLogger.cs +++ b/Source/Assets/TouchScript/Scripts/Debugging/Loggers/FileReaderLogger.cs @@ -2,6 +2,8 @@ * @author Valentin Simonov / http://va.lent.in/ */ +#if TOUCHSCRIPT_DEBUG + using System; using System.Collections.Generic; using System.IO; @@ -9,8 +11,6 @@ using TouchScript.Pointers; using UnityEngine; -#if TOUCHSCRIPT_DEBUG - namespace TouchScript.Debugging.Loggers { public class FileReaderLogger : IPointerLogger @@ -67,7 +67,6 @@ public FileReaderLogger(string path) list.Add(log); } } - catch (Exception e) {} finally { reader.Close(); diff --git a/Source/Assets/TouchScript/Scripts/Debugging/Loggers/FileWriterLogger.cs b/Source/Assets/TouchScript/Scripts/Debugging/Loggers/FileWriterLogger.cs index 9416477e7..aedd6ade1 100644 --- a/Source/Assets/TouchScript/Scripts/Debugging/Loggers/FileWriterLogger.cs +++ b/Source/Assets/TouchScript/Scripts/Debugging/Loggers/FileWriterLogger.cs @@ -2,6 +2,8 @@ * @author Valentin Simonov / http://va.lent.in/ */ +#if TOUCHSCRIPT_DEBUG + using System; using System.Collections.Generic; using System.IO; @@ -10,8 +12,6 @@ using TouchScript.Utils; using UnityEngine; -#if TOUCHSCRIPT_DEBUG - namespace TouchScript.Debugging.Loggers { public class FileWriterLogger : IPointerLogger diff --git a/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs b/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs index 430d63f8c..1c22f167b 100644 --- a/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs +++ b/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs @@ -3,7 +3,9 @@ */ using System.Text.RegularExpressions; +#if UNITY_STANDALONE_WIN using TouchScript.Utils.Platform; +#endif using UnityEngine; namespace TouchScript.Devices.Display From 73a3799d9f842b228603e3f117fd09f29e6ab1ba Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 25 Jul 2017 08:23:42 +0300 Subject: [PATCH 35/58] - Gesture.ScreenPosition now returns activePointers[0].Position. - Transform gestures ScreenPosition now return activePointers[0].Position. - Moved CombineTouches functionality from Gesture to TapGesture since it is the only place it is used. --- .../Editor/Gestures/GestureEditor.cs | 26 +---- .../Editor/Gestures/TapGestureEditor.cs | 23 ++++- .../TouchScript/Scripts/Gestures/Gesture.cs | 83 ++++------------ .../Scripts/Gestures/TapGesture.cs | 95 ++++++++++++++----- .../Base/TwoPointTransformGestureBase.cs | 22 ----- 5 files changed, 107 insertions(+), 142 deletions(-) diff --git a/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs index 165867da8..70a089b0d 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs @@ -29,19 +29,16 @@ internal class GestureEditor : UnityEditor.Editor public static readonly GUIContent TEXT_SEND_STATE_CHANGE_MESSAGES = new GUIContent("Send State Change Messages", "If checked, the gesture will send a message for every state change. Gestures usually have their own more specific messages, so you should keep this toggle unchecked unless you really want state change messages."); public static readonly GUIContent TEXT_SEND_MESSAGE_TARGET = new GUIContent("Target", "The GameObject target of Unity Messages. If null, host GameObject is used."); public static readonly GUIContent TEXT_SEND_STATE_CHANGE_EVENTS = new GUIContent("Send State Change Events", "If checked, the gesture will send a events for every state change. Gestures usually have their own more specific messages, so you should keep this toggle unchecked unless you really want state change events."); - public static readonly GUIContent TEXT_COMBINE_POINTERS = new GUIContent("Combine Pointers", "When several fingers are used to perform a tap, pointers released not earlier than seconds ago are used to calculate gesture's final screen position."); - public static readonly GUIContent TEXT_COMBINE_TOUCH_POINTERS = new GUIContent("Combine Interval (sec)", TEXT_COMBINE_POINTERS.tooltip); public static readonly GUIContent TEXT_REQUIRE_GESTURE_TO_FAIL = new GUIContent("Require Other Gesture to Fail", "Another gesture must fail for this gesture to start."); public static readonly GUIContent TEXT_LIMIT_POINTERS = new GUIContent(" Limit Pointers", ""); - protected bool shouldDrawCombineTouches = false; protected bool shouldDrawAdvanced = false; protected bool shouldDrawGeneral = true; private Gesture instance; private SerializedProperty debugMode, friendlyGestures, requireGestureToFail, - minPointers, maxPointers, combinePointers, combinePointersInterval, + minPointers, maxPointers, useSendMessage, sendMessageTarget, sendStateChangeMessages, useUnityEvents, sendStateChangeEvents; private SerializedProperty OnStateChange; @@ -63,8 +60,6 @@ protected virtual void OnEnable() debugMode = serializedObject.FindProperty("debugMode"); friendlyGestures = serializedObject.FindProperty("friendlyGestures"); requireGestureToFail = serializedObject.FindProperty("requireGestureToFail"); - combinePointers = serializedObject.FindProperty("combinePointers"); - combinePointersInterval = serializedObject.FindProperty("combinePointersInterval"); useSendMessage = serializedObject.FindProperty("useSendMessage"); sendMessageTarget = serializedObject.FindProperty("sendMessageTarget"); sendStateChangeMessages = serializedObject.FindProperty("sendStateChangeMessages"); @@ -246,28 +241,9 @@ protected virtual void drawSendMessage() protected virtual void drawAdvanced() { - drawCombineTouches(); drawDebug(); } - protected virtual void drawCombineTouches() - { - if (shouldDrawCombineTouches) - { - EditorGUILayout.PropertyField(combinePointers, TEXT_COMBINE_POINTERS); - if (combinePointers.boolValue) - { - EditorGUIUtility.labelWidth = 160; - EditorGUILayout.BeginHorizontal(); - GUILayout.Label(GUIContent.none, GUILayout.Width(10)); - EditorGUILayout.BeginVertical(GUILayout.ExpandWidth(true)); - EditorGUILayout.PropertyField(combinePointersInterval, TEXT_COMBINE_TOUCH_POINTERS); - EditorGUILayout.EndVertical(); - EditorGUILayout.EndHorizontal(); - } - } - } - protected virtual void drawDebug() { if (debugMode == null) return; diff --git a/Source/Assets/TouchScript/Editor/Gestures/TapGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/TapGestureEditor.cs index 4b9ece4b9..e29abdef7 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/TapGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/TapGestureEditor.cs @@ -14,8 +14,10 @@ internal sealed class TapGestureEditor : GestureEditor public static readonly GUIContent TEXT_TIME_LIMIT = new GUIContent("Limit Time (sec)", "Gesture fails if in seconds user didn't do the required number of taps."); public static readonly GUIContent TEXT_DISTANCE_LIMIT = new GUIContent("Limit Movement (cm)", "Gesture fails if taps are made more than cm away from the first pointer position."); public static readonly GUIContent TEXT_NUMBER_OF_TAPS_REQUIRED = new GUIContent("Number of Taps Required", "Number of taps required for this gesture to be recognized."); + public static readonly GUIContent TEXT_COMBINE_POINTERS = new GUIContent("Combine Pointers", "When several fingers are used to perform a tap, pointers released not earlier than seconds ago are used to calculate gesture's final screen position."); + public static readonly GUIContent TEXT_COMBINE_TOUCH_POINTERS = new GUIContent("Combine Interval (sec)", TEXT_COMBINE_POINTERS.tooltip); - private SerializedProperty numberOfTapsRequired, distanceLimit, timeLimit; + private SerializedProperty numberOfTapsRequired, distanceLimit, timeLimit, combinePointers, combinePointersInterval; private SerializedProperty OnTap; protected override void OnEnable() @@ -23,11 +25,11 @@ protected override void OnEnable() numberOfTapsRequired = serializedObject.FindProperty("numberOfTapsRequired"); timeLimit = serializedObject.FindProperty("timeLimit"); distanceLimit = serializedObject.FindProperty("distanceLimit"); + combinePointers = serializedObject.FindProperty("combinePointers"); + combinePointersInterval = serializedObject.FindProperty("combinePointersInterval"); OnTap = serializedObject.FindProperty("OnTap"); - shouldDrawCombineTouches = true; - base.OnEnable(); } @@ -35,7 +37,17 @@ protected override void drawGeneral() { EditorGUIUtility.labelWidth = 180; EditorGUILayout.IntPopup(numberOfTapsRequired, new[] {new GUIContent("One"), new GUIContent("Two"), new GUIContent("Three")}, new[] {1, 2, 3}, TEXT_NUMBER_OF_TAPS_REQUIRED, GUILayout.ExpandWidth(true)); - + EditorGUILayout.PropertyField(combinePointers, TEXT_COMBINE_POINTERS); + if (combinePointers.boolValue) + { + EditorGUIUtility.labelWidth = 160; + EditorGUILayout.BeginHorizontal(); + GUILayout.Label(GUIContent.none, GUILayout.Width(10)); + EditorGUILayout.BeginVertical(GUILayout.ExpandWidth(true)); + EditorGUILayout.PropertyField(combinePointersInterval, TEXT_COMBINE_TOUCH_POINTERS); + EditorGUILayout.EndVertical(); + EditorGUILayout.EndHorizontal(); + } base.drawGeneral (); } @@ -47,11 +59,12 @@ protected override void drawLimits() base.drawLimits(); } - protected override void drawUnityEvents () + protected override void drawUnityEvents() { EditorGUILayout.PropertyField(OnTap); base.drawUnityEvents(); } + } } diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs index 158c1193f..4032ca4e4 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs @@ -200,29 +200,6 @@ public Gesture RequireGestureToFail } } - /// - /// Gets or sets the flag if pointers should be treated as a cluster. - /// - /// true if pointers should be treated as a cluster; otherwise, false. - /// - /// At the end of a gesture when pointers are lifted off due to the fact that computers are faster than humans the very last pointer's position will be gesture's after that. This flag is used to combine several pointers which from the point of a user were lifted off simultaneously and set their centroid as gesture's . - /// - public bool CombinePointers - { - get { return combinePointers; } - set { combinePointers = value; } - } - - /// - /// Gets or sets time interval before gesture is recognized to combine all lifted pointers into a cluster to use its center as . - /// - /// Time in seconds to treat pointers lifted off during this interval as a single gesture. - public float CombinePointersInterval - { - get { return combinePointersInterval; } - set { combinePointersInterval = value; } - } - /// /// Gets or sets whether gesture should use Unity's SendMessage in addition to C# events. /// @@ -347,7 +324,7 @@ public virtual Vector2 ScreenPosition if (!TouchManager.IsInvalidPosition(cachedScreenPosition)) return cachedScreenPosition; return TouchManager.INVALID_POSITION; } - return ClusterUtils.Get2DCenterPosition(activePointers); + return activePointers[0].Position; } } @@ -365,7 +342,7 @@ public virtual Vector2 PreviousScreenPosition return cachedPreviousScreenPosition; return TouchManager.INVALID_POSITION; } - return ClusterUtils.GetPrevious2DCenterPosition(activePointers); + return activePointers[0].PreviousPosition; } } @@ -474,13 +451,6 @@ protected IGestureManager gestureManager [SerializeField] private int maxPointers = 0; - [SerializeField] - [ToggleLeft] - private bool combinePointers = false; - - [SerializeField] - private float combinePointersInterval = .3f; - [SerializeField] [ToggleLeft] private bool useSendMessage = false; @@ -509,7 +479,6 @@ protected IGestureManager gestureManager private int numPointers; private ReadOnlyCollection readonlyActivePointers; - private TimedSequence pointerSequence = new TimedSequence(); private GestureManagerInstance gestureManagerInstance; private GestureState delayedStateChange = GestureState.Idle; private bool requiredGestureFailed = false; @@ -520,13 +489,13 @@ protected IGestureManager gestureManager /// Cached screen position. /// Used to keep tap's position which can't be calculated from pointers when the gesture is recognized since all pointers are gone. /// - private Vector2 cachedScreenPosition; + protected Vector2 cachedScreenPosition; /// /// Cached previous screen position. /// Used to keep tap's position which can't be calculated from pointers when the gesture is recognized since all pointers are gone. /// - private Vector2 cachedPreviousScreenPosition; + protected Vector2 cachedPreviousScreenPosition; #endregion @@ -822,36 +791,20 @@ internal void INTERNAL_PointersReleased(IList pointers) for (var i = 0; i < count; i++) activePointers.Remove(pointers[i]); numPointers = total; - if (combinePointers) - { - for (var i = 0; i < count; i++) pointerSequence.Add(pointers[i]); - - if (NumPointers == 0) - { - // Checking which points were removed in clusterExistenceTime seconds to set their centroid as cached screen position - var cluster = pointerSequence.FindElementsLaterThan(Time.time - combinePointersInterval, - shouldCachePointerPosition); - cachedScreenPosition = ClusterUtils.Get2DCenterPosition(cluster); - cachedPreviousScreenPosition = ClusterUtils.GetPrevious2DCenterPosition(cluster); - } - } - else - { - if (NumPointers == 0) - { - var lastPoint = pointers[count - 1]; - if (shouldCachePointerPosition(lastPoint)) - { - cachedScreenPosition = lastPoint.Position; - cachedPreviousScreenPosition = lastPoint.PreviousPosition; - } - else - { - cachedScreenPosition = TouchManager.INVALID_POSITION; - cachedPreviousScreenPosition = TouchManager.INVALID_POSITION; - } - } - } + if (NumPointers == 0) + { + var lastPoint = pointers[count - 1]; + if (shouldCachePointerPosition(lastPoint)) + { + cachedScreenPosition = lastPoint.Position; + cachedPreviousScreenPosition = lastPoint.PreviousPosition; + } + else + { + cachedScreenPosition = TouchManager.INVALID_POSITION; + cachedPreviousScreenPosition = TouchManager.INVALID_POSITION; + } + } pointersReleased(pointers); } diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs index e1709c166..ed4f702fb 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs @@ -86,6 +86,29 @@ public float DistanceLimit } } + /// + /// Gets or sets the flag if pointers should be treated as a cluster. + /// + /// true if pointers should be treated as a cluster; otherwise, false. + /// + /// At the end of a gesture when pointers are lifted off due to the fact that computers are faster than humans the very last pointer's position will be gesture's after that. This flag is used to combine several pointers which from the point of a user were lifted off simultaneously and set their centroid as gesture's . + /// + public bool CombinePointers + { + get { return combinePointers; } + set { combinePointers = value; } + } + + /// + /// Gets or sets time interval before gesture is recognized to combine all lifted pointers into a cluster to use its center as . + /// + /// Time in seconds to treat pointers lifted off during this interval as a single gesture. + public float CombinePointersInterval + { + get { return combinePointersInterval; } + set { combinePointersInterval = value; } + } + #endregion #region Private variables @@ -95,13 +118,18 @@ public float DistanceLimit [SerializeField] [NullToggle(NullFloatValue = float.PositiveInfinity)] - private float timeLimit = - float.PositiveInfinity; + private float timeLimit = float.PositiveInfinity; [SerializeField] [NullToggle(NullFloatValue = float.PositiveInfinity)] - private float distanceLimit = - float.PositiveInfinity; + private float distanceLimit = float.PositiveInfinity; + + [SerializeField] + [ToggleLeft] + private bool combinePointers = false; + + [SerializeField] + private float combinePointersInterval = .3f; private float distanceLimitInPixelsSquared; @@ -111,6 +139,7 @@ public float DistanceLimit private int tapsDone; private Vector2 startPosition; private Vector2 totalMovement; + private TimedSequence pointerSequence = new TimedSequence(); #endregion @@ -208,27 +237,43 @@ protected override void pointersReleased(IList pointers) { base.pointersReleased(pointers); - if (NumPointers == 0) - { - if (!isActive) - { - setState(GestureState.Failed); - return; - } - - // pointers outside of gesture target are ignored in shouldCachePointerPosition() - // if all pointers are outside ScreenPosition will be invalid - if (TouchManager.IsInvalidPosition(ScreenPosition)) - { - setState(GestureState.Failed); - } - else - { - tapsDone++; - isActive = false; - if (tapsDone >= numberOfTapsRequired) setState(GestureState.Recognized); - } - } + if (combinePointers) + { + var count = pointers.Count; + for (var i = 0; i < count; i++) pointerSequence.Add(pointers[i]); + + if (NumPointers == 0) + { + // Checking which points were removed in clusterExistenceTime seconds to set their centroid as cached screen position + var cluster = pointerSequence.FindElementsLaterThan(Time.time - combinePointersInterval, shouldCachePointerPosition); + cachedScreenPosition = ClusterUtils.Get2DCenterPosition(cluster); + cachedPreviousScreenPosition = ClusterUtils.GetPrevious2DCenterPosition(cluster); + } + } + else + { + if (NumPointers == 0) + { + if (!isActive) + { + setState(GestureState.Failed); + return; + } + + // pointers outside of gesture target are ignored in shouldCachePointerPosition() + // if all pointers are outside ScreenPosition will be invalid + if (TouchManager.IsInvalidPosition(ScreenPosition)) + { + setState(GestureState.Failed); + } + else + { + tapsDone++; + isActive = false; + if (tapsDone >= numberOfTapsRequired) setState(GestureState.Recognized); + } + } + } } /// diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TwoPointTransformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TwoPointTransformGestureBase.cs index 65277b1a1..934bb200f 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TwoPointTransformGestureBase.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TwoPointTransformGestureBase.cs @@ -41,28 +41,6 @@ public virtual float MinScreenPointsDistance } } - /// - public override Vector2 ScreenPosition - { - get - { - if (NumPointers == 0) return TouchManager.INVALID_POSITION; - if (NumPointers == 1) return activePointers[0].Position; - return (getPointScreenPosition(0) + getPointScreenPosition(1)) * .5f; - } - } - - /// - public override Vector2 PreviousScreenPosition - { - get - { - if (NumPointers == 0) return TouchManager.INVALID_POSITION; - if (NumPointers == 1) return activePointers[0].PreviousPosition; - return (getPointPreviousScreenPosition(0) + getPointPreviousScreenPosition(1)) * .5f; - } - } - #endregion #region Private variables From 8dd43399e1d1f873ca1f4089cb62eee8b0234c31 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 25 Jul 2017 11:25:52 +0300 Subject: [PATCH 36/58] Added Basic and Advanced views to most components. --- .../{Visualizer.meta => Cursors.meta} | 0 .../Behaviors/Cursors/CursorManagerEditor.cs | 70 ++++ .../Cursors/CursorManagerEditor.cs.meta | 12 + .../Editor/Behaviors/TransformerEditor.cs | 8 +- .../Editor/EditorUI/GUIElements.cs | 24 ++ .../Editor/Gestures/FlickGestureEditor.cs | 26 +- .../Editor/Gestures/GestureEditor.cs | 117 ++++--- .../Editor/Gestures/LongPressGestureEditor.cs | 14 +- .../Editor/Gestures/MetaGestureEditor.cs | 28 ++ .../Editor/Gestures/MetaGestureEditor.cs.meta | 12 + .../Editor/Gestures/PressGestureEditor.cs | 7 + .../Editor/Gestures/ReleaseGestureEditor.cs | 9 +- .../Editor/Gestures/TapGestureEditor.cs | 13 + .../OnePointTransformGestureBaseEditor.cs | 23 ++ .../Base/TransformGestureBaseEditor.cs | 4 +- .../TwoPointTransformGestureBaseEditor.cs | 28 ++ .../PinnedTransformGestureEditor.cs | 19 ++ .../ScreenTransformGestureEditor.cs | 11 +- .../TransformGestureEditor.cs | 20 ++ .../InputSources/StandardInputEditor.cs | 62 +++- .../Editor/Layers/FullscreenLayerEditor.cs | 8 +- .../Editor/Layers/StandardLayerEditor.cs | 55 +++- .../TouchScript/Editor/TouchManagerEditor.cs | 114 ++++--- .../TouchScript/Examples/Camera/Camera.unity | 12 +- .../Examples/Checkers/Checkers.unity | 298 ++++++++++-------- .../TouchScript/Examples/Colors/Colors.unity | 193 +++++++----- .../TouchScript/Examples/Photos/Photos.unity | 57 ++-- .../TouchScript/Examples/Portal/Portal.unity | 17 +- .../TouchScript/Examples/Taps/Taps.unity | 11 +- .../Behaviors/Cursors/CursorManager.cs | 5 +- .../Scripts/Behaviors/Transformer.cs | 6 +- Source/Assets/TouchScript/Scripts/Core.meta | 9 + .../{ => Core}/DebuggableMonoBehaviour.cs | 2 +- .../DebuggableMonoBehaviour.cs.meta | 0 .../{ => Core}/GestureManagerInstance.cs | 2 +- .../{ => Core}/GestureManagerInstance.cs.meta | 0 .../{ => Core}/LayerManagerInstance.cs | 2 +- .../{ => Core}/LayerManagerInstance.cs.meta | 0 .../{ => Core}/TouchManagerInstance.cs | 3 +- .../{ => Core}/TouchManagerInstance.cs.meta | 0 .../TouchScript/Scripts/GestureManager.cs | 1 + .../Scripts/Gestures/FlickGesture.cs | 6 + .../TouchScript/Scripts/Gestures/Gesture.cs | 14 +- .../Scripts/Gestures/LongPressGesture.cs | 6 + .../Scripts/Gestures/MetaGesture.cs | 18 +- .../Scripts/Gestures/PressGesture.cs | 10 + .../Scripts/Gestures/ReleaseGesture.cs | 18 +- .../Scripts/Gestures/TapGesture.cs | 6 + .../PinnedTransformGesture.cs | 6 + .../ScreenTransformGesture.cs | 8 +- .../TransformGestures/TransformGesture.cs | 6 + .../Scripts/InputSources/InputSource.cs | 15 +- .../Scripts/InputSources/StandardInput.cs | 20 +- .../TouchScript/Scripts/LayerManager.cs | 1 + .../Scripts/Layers/StandardLayer.cs | 20 +- .../TouchScript/Scripts/Pointers/Pointer.cs | 1 + .../TouchScript/Scripts/TouchManager.cs | 21 +- 57 files changed, 1066 insertions(+), 412 deletions(-) rename Source/Assets/TouchScript/Editor/Behaviors/{Visualizer.meta => Cursors.meta} (100%) create mode 100644 Source/Assets/TouchScript/Editor/Behaviors/Cursors/CursorManagerEditor.cs create mode 100644 Source/Assets/TouchScript/Editor/Behaviors/Cursors/CursorManagerEditor.cs.meta create mode 100644 Source/Assets/TouchScript/Editor/Gestures/MetaGestureEditor.cs create mode 100644 Source/Assets/TouchScript/Editor/Gestures/MetaGestureEditor.cs.meta create mode 100644 Source/Assets/TouchScript/Scripts/Core.meta rename Source/Assets/TouchScript/Scripts/{ => Core}/DebuggableMonoBehaviour.cs (96%) rename Source/Assets/TouchScript/Scripts/{ => Core}/DebuggableMonoBehaviour.cs.meta (100%) rename Source/Assets/TouchScript/Scripts/{ => Core}/GestureManagerInstance.cs (99%) rename Source/Assets/TouchScript/Scripts/{ => Core}/GestureManagerInstance.cs.meta (100%) rename Source/Assets/TouchScript/Scripts/{ => Core}/LayerManagerInstance.cs (99%) rename Source/Assets/TouchScript/Scripts/{ => Core}/LayerManagerInstance.cs.meta (100%) rename Source/Assets/TouchScript/Scripts/{ => Core}/TouchManagerInstance.cs (99%) rename Source/Assets/TouchScript/Scripts/{ => Core}/TouchManagerInstance.cs.meta (100%) diff --git a/Source/Assets/TouchScript/Editor/Behaviors/Visualizer.meta b/Source/Assets/TouchScript/Editor/Behaviors/Cursors.meta similarity index 100% rename from Source/Assets/TouchScript/Editor/Behaviors/Visualizer.meta rename to Source/Assets/TouchScript/Editor/Behaviors/Cursors.meta diff --git a/Source/Assets/TouchScript/Editor/Behaviors/Cursors/CursorManagerEditor.cs b/Source/Assets/TouchScript/Editor/Behaviors/Cursors/CursorManagerEditor.cs new file mode 100644 index 000000000..15538d63c --- /dev/null +++ b/Source/Assets/TouchScript/Editor/Behaviors/Cursors/CursorManagerEditor.cs @@ -0,0 +1,70 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using TouchScript.Behaviors.Cursors; +using UnityEditor; +using UnityEngine; +using TouchScript.Editor.EditorUI; + +namespace TouchScript.Editor.Behaviors.Visualizer +{ + + [CustomEditor(typeof(CursorManager))] + internal sealed class CursorManagerEditor : UnityEditor.Editor + { + + public static readonly GUIContent TEXT_DPI_HEADER = new GUIContent("Use DPI", "Scale touch pointer based on DPI."); + public static readonly GUIContent TEXT_CURSORS_HEADER = new GUIContent("Cursors", "Cursor prefabs used for different pointer types."); + public static readonly GUIContent TEXT_POINTER_SIZE = new GUIContent("Pointer size (cm)", "Pointer size in cm based on current DPI."); + public static readonly GUIContent TEXT_POINTER_PIXEL_SIZE = new GUIContent("Pointer size (px)", "Pointer size in pixels."); + + private SerializedProperty mousePointerProxy, touchPointerProxy, penPointerProxy, objectPointerProxy; + private SerializedProperty useDPI, cursorSize, cursorPixelSize; + private SerializedProperty cursorsProps; + + private void OnEnable() + { + mousePointerProxy = serializedObject.FindProperty("mouseCursor"); + touchPointerProxy = serializedObject.FindProperty("touchCursor"); + penPointerProxy = serializedObject.FindProperty("penCursor"); + objectPointerProxy = serializedObject.FindProperty("objectCursor"); + + useDPI = serializedObject.FindProperty("useDPI"); + cursorSize = serializedObject.FindProperty("cursorSize"); + cursorPixelSize = serializedObject.FindProperty("cursorPixelSize"); + + cursorsProps = serializedObject.FindProperty("cursorsProps"); + } + + public override void OnInspectorGUI() + { + serializedObject.Update(); + + GUILayout.Space(5); + + EditorGUILayout.PropertyField(useDPI, TEXT_DPI_HEADER); + if (useDPI.boolValue) + { + EditorGUILayout.PropertyField(cursorSize, TEXT_POINTER_SIZE); + } + else + { + EditorGUILayout.PropertyField(cursorPixelSize, TEXT_POINTER_PIXEL_SIZE); + } + + var display = GUIElements.Header(TEXT_CURSORS_HEADER, cursorsProps); + if (display) + { + EditorGUI.indentLevel++; + EditorGUILayout.PropertyField(mousePointerProxy, new GUIContent("Mouse Pointer Proxy")); + EditorGUILayout.PropertyField(touchPointerProxy, new GUIContent("Touch Pointer Proxy")); + EditorGUILayout.PropertyField(penPointerProxy, new GUIContent("Pen Pointer Proxy")); + EditorGUILayout.PropertyField(objectPointerProxy, new GUIContent("Object Pointer Proxy")); + EditorGUI.indentLevel--; + } + + serializedObject.ApplyModifiedProperties(); + } + } +} diff --git a/Source/Assets/TouchScript/Editor/Behaviors/Cursors/CursorManagerEditor.cs.meta b/Source/Assets/TouchScript/Editor/Behaviors/Cursors/CursorManagerEditor.cs.meta new file mode 100644 index 000000000..0a91081c1 --- /dev/null +++ b/Source/Assets/TouchScript/Editor/Behaviors/Cursors/CursorManagerEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 77945c600a4314a6bb5c7cc758b42194 +timeCreated: 1447582130 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Editor/Behaviors/TransformerEditor.cs b/Source/Assets/TouchScript/Editor/Behaviors/TransformerEditor.cs index 56ddcff5f..b7151ab8e 100644 --- a/Source/Assets/TouchScript/Editor/Behaviors/TransformerEditor.cs +++ b/Source/Assets/TouchScript/Editor/Behaviors/TransformerEditor.cs @@ -21,19 +21,16 @@ internal class TransformerEditor : UnityEditor.Editor public static readonly GUIContent TEXT_ALLOW_CHANGING = new GUIContent("Allow Changing From Outside", "Indicates if this transform can be changed from another script."); public static readonly GUIContent TEXT_SMOOTHING_FACTOR_DESC = new GUIContent("Indicates how much smoothing to apply. \n0 - no smoothing, 100000 - maximum."); + public static readonly GUIContent TEXT_HELP = new GUIContent("This component receives transform data from Transform Gestures and applies changes to the GameObject."); + private Transformer instance; private SerializedProperty enableSmoothing, allowChangingFromOutside; -// private SerializedProperty smoothingFactor, positionThreshold, rotationThreshold, scaleThreshold; private PropertyInfo enableSmoothing_prop; protected virtual void OnEnable() { enableSmoothing = serializedObject.FindProperty("enableSmoothing"); -// smoothingFactor = serializedObject.FindProperty("smoothingFactor"); -// positionThreshold = serializedObject.FindProperty("positionThreshold"); -// rotationThreshold = serializedObject.FindProperty("rotationThreshold"); -// scaleThreshold = serializedObject.FindProperty("scaleThreshold"); allowChangingFromOutside = serializedObject.FindProperty("allowChangingFromOutside"); instance = target as Transformer; @@ -67,6 +64,7 @@ public override void OnInspectorGUI() } EditorGUI.indentLevel--; } + EditorGUILayout.LabelField(TEXT_HELP, GUIElements.HelpBox); serializedObject.ApplyModifiedProperties(); } diff --git a/Source/Assets/TouchScript/Editor/EditorUI/GUIElements.cs b/Source/Assets/TouchScript/Editor/EditorUI/GUIElements.cs index 8c2642aae..3c801a3de 100644 --- a/Source/Assets/TouchScript/Editor/EditorUI/GUIElements.cs +++ b/Source/Assets/TouchScript/Editor/EditorUI/GUIElements.cs @@ -17,6 +17,8 @@ internal static class GUIElements public static GUIStyle HeaderStyle; public static GUIStyle HeaderCheckbox; public static GUIStyle HeaderFoldout; + public static GUIStyle SmallText; + public static GUIStyle SmallButton; public static Texture2D PaneOptionsIcon; @@ -53,6 +55,18 @@ static GUIElements() HeaderCheckbox = new GUIStyle("ShurikenCheckMark"); HeaderFoldout = new GUIStyle("Foldout"); + SmallText = new GUIStyle("miniLabel") + { + alignment = TextAnchor.UpperLeft, + }; + + SmallButton = new GUIStyle("Button") + { + fontSize = SmallText.fontSize, + fontStyle = SmallText.fontStyle, + font = SmallText.font, + }; + if (EditorGUIUtility.isProSkin) PaneOptionsIcon = (Texture2D)EditorGUIUtility.LoadRequired("Builtin Skins/DarkSkin/Images/pane options.png"); else @@ -103,5 +117,15 @@ public static bool Header(GUIContent title, SerializedProperty expanded, Seriali return display; } + + public static bool BasicHelpBox(GUIContent text) + { + EditorGUILayout.LabelField(text, HelpBox); + var rect = GUILayoutUtility.GetRect(10, 22, GUILayout.ExpandWidth(true)); + rect.x = rect.width - 86; + rect.width = 100; + rect.height = 14; + return GUI.Button(rect, "Switch to Advanced", SmallButton); + } } } diff --git a/Source/Assets/TouchScript/Editor/Gestures/FlickGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/FlickGestureEditor.cs index 1ee424e7a..b8c24cd02 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/FlickGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/FlickGestureEditor.cs @@ -16,7 +16,9 @@ internal sealed class FlickGestureEditor : GestureEditor public static readonly GUIContent FLICK_TIME = new GUIContent("Flick Time (sec)", "Time interval in seconds during which pointers must move by for the gesture to be recognized."); public static readonly GUIContent MIN_DISTANCE = new GUIContent("Minimum Distance (cm)", "Minimum distance in cm pointers must move in seconds for the gesture to be recognized."); - private SerializedProperty direction; + public static readonly GUIContent TEXT_HELP = new GUIContent("This component a fast flick gesture started over the GameObject. Switch to advanced view to see more options."); + + private SerializedProperty direction; private SerializedProperty flickTime; private SerializedProperty minDistance; private SerializedProperty movementThreshold; @@ -31,22 +33,24 @@ protected override void OnEnable() direction = serializedObject.FindProperty("direction"); } - public override void OnInspectorGUI() - { -#if UNITY_5_6_OR_NEWER - serializedObject.UpdateIfRequiredOrScript(); -#else - serializedObject.UpdateIfDirtyOrScript(); -#endif + protected override void drawBasic() + { + EditorGUILayout.PropertyField(direction, DIRECTION); + } + protected override void drawGeneral() + { EditorGUIUtility.labelWidth = 180; EditorGUILayout.PropertyField(direction, DIRECTION); EditorGUILayout.PropertyField(movementThreshold, MOVEMENT_THRESHOLD); EditorGUILayout.PropertyField(flickTime, FLICK_TIME); EditorGUILayout.PropertyField(minDistance, MIN_DISTANCE); - - serializedObject.ApplyModifiedProperties(); - base.OnInspectorGUI(); } + + protected override GUIContent getHelpText() + { + return TEXT_HELP; + } + } } diff --git a/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs index 70a089b0d..7afc18011 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs @@ -37,6 +37,7 @@ internal class GestureEditor : UnityEditor.Editor private Gesture instance; + private SerializedProperty basicEditor; private SerializedProperty debugMode, friendlyGestures, requireGestureToFail, minPointers, maxPointers, useSendMessage, sendMessageTarget, sendStateChangeMessages, @@ -56,6 +57,7 @@ protected virtual void OnEnable() advancedProps = serializedObject.FindProperty("advancedProps"); limitsProps = serializedObject.FindProperty("limitsProps"); generalProps = serializedObject.FindProperty("generalProps"); + basicEditor = serializedObject.FindProperty("basicEditor"); debugMode = serializedObject.FindProperty("debugMode"); friendlyGestures = serializedObject.FindProperty("friendlyGestures"); @@ -93,8 +95,6 @@ protected virtual void OnEnable() EditorGUI.LabelField(rect, string.Format("{0} @ {1}", gesture.GetType().Name, gesture.name), GUIElements.BoxLabelStyle); }; friendlyGesturesList.onRemoveCallback += list => { indexToRemove = list.index; }; - - if (debugMode != null) shouldDrawAdvanced = true; } public override void OnInspectorGUI() @@ -108,73 +108,97 @@ public override void OnInspectorGUI() GUILayout.Space(5); bool display; - if (shouldDrawGeneral) + if (basicEditor.boolValue) { - display = GUIElements.Header(TEXT_GENERAL_HEADER, generalProps); - if (display) + drawBasic(); + if (GUIElements.BasicHelpBox(getHelpText())) { - EditorGUI.indentLevel++; - drawGeneral(); - EditorGUI.indentLevel--; + basicEditor.boolValue = false; + Repaint(); } } - - drawOtherGUI(); - - display = GUIElements.Header(TEXT_LIMITS_HEADER, limitsProps); - if (display) + else { - EditorGUI.indentLevel++; - drawLimits(); - EditorGUI.indentLevel--; - } + if (shouldDrawGeneral) + { + display = GUIElements.Header(TEXT_GENERAL_HEADER, generalProps); + if (display) + { + EditorGUI.indentLevel++; + drawGeneral(); + EditorGUI.indentLevel--; + } + } - display = GUIElements.Header(TEXT_GESTURES_HEADER, friendlyGestures); - if (display) - { - EditorGUI.indentLevel++; - drawFriendlyGestures(); - drawRequireToFail(); - GUILayout.Space(5); - EditorGUI.indentLevel--; - } + drawOtherGUI(); - display = GUIElements.Header(TEXT_USE_UNITY_EVENTS_HEADER, useUnityEvents, useUnityEvents, useUnityEvents_prop); - if (display) - { - EditorGUI.indentLevel++; - using (new EditorGUI.DisabledGroupScope(!useUnityEvents.boolValue)) + display = GUIElements.Header(TEXT_LIMITS_HEADER, limitsProps); + if (display) { - drawUnityEvents(); + EditorGUI.indentLevel++; + drawLimits(); + EditorGUI.indentLevel--; } - EditorGUI.indentLevel--; - } - display = GUIElements.Header(TEXT_USE_SEND_MESSAGE_HEADER, useSendMessage, useSendMessage, useSendMessage_prop); - if (display) - { - EditorGUI.indentLevel++; - using (new EditorGUI.DisabledGroupScope(!useSendMessage.boolValue)) + display = GUIElements.Header(TEXT_GESTURES_HEADER, friendlyGestures); + if (display) { - drawSendMessage(); + EditorGUI.indentLevel++; + drawFriendlyGestures(); + drawRequireToFail(); + GUILayout.Space(5); + EditorGUI.indentLevel--; } - EditorGUI.indentLevel--; - } - if (shouldDrawAdvanced) - { - display = GUIElements.Header(TEXT_ADVANCED_HEADER, advancedProps); + display = GUIElements.Header(TEXT_USE_UNITY_EVENTS_HEADER, useUnityEvents, useUnityEvents, useUnityEvents_prop); if (display) { EditorGUI.indentLevel++; - drawAdvanced(); + using (new EditorGUI.DisabledGroupScope(!useUnityEvents.boolValue)) + { + drawUnityEvents(); + } EditorGUI.indentLevel--; } + + display = GUIElements.Header(TEXT_USE_SEND_MESSAGE_HEADER, useSendMessage, useSendMessage, useSendMessage_prop); + if (display) + { + EditorGUI.indentLevel++; + using (new EditorGUI.DisabledGroupScope(!useSendMessage.boolValue)) + { + drawSendMessage(); + } + EditorGUI.indentLevel--; + } + + if (shouldDrawAdvanced) + { + display = GUIElements.Header(TEXT_ADVANCED_HEADER, advancedProps); + if (display) + { + EditorGUI.indentLevel++; + drawAdvanced(); + EditorGUI.indentLevel--; + } + } + + drawDebug(); } serializedObject.ApplyModifiedProperties(); } + protected virtual void drawBasic() + { + + } + + protected virtual GUIContent getHelpText() + { + return new GUIContent(""); + } + protected virtual void drawOtherGUI() { @@ -241,7 +265,6 @@ protected virtual void drawSendMessage() protected virtual void drawAdvanced() { - drawDebug(); } protected virtual void drawDebug() diff --git a/Source/Assets/TouchScript/Editor/Gestures/LongPressGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/LongPressGestureEditor.cs index b4e1fb6b4..af1315833 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/LongPressGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/LongPressGestureEditor.cs @@ -14,7 +14,9 @@ internal sealed class LongPressGestureEditor : GestureEditor public static readonly GUIContent TEXT_TIME_TO_PRESS = new GUIContent("Time to Press (sec)", "Limit maximum number of simultaneous pointers."); public static readonly GUIContent TEXT_DISTANCE_LIMIT = new GUIContent("Limit Movement (cm)", "Gesture fails if fingers move more than cm."); - private SerializedProperty distanceLimit, timeToPress; + public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a gesture when this GameObject is being pressed for seconds. Switch to advanced view to see more options."); + + private SerializedProperty distanceLimit, timeToPress; private SerializedProperty OnLongPress; protected override void OnEnable() @@ -26,6 +28,16 @@ protected override void OnEnable() base.OnEnable(); } + protected override void drawBasic() + { + EditorGUILayout.PropertyField(timeToPress, TEXT_TIME_TO_PRESS); + } + + protected override GUIContent getHelpText() + { + return TEXT_HELP; + } + protected override void drawGeneral () { EditorGUILayout.PropertyField(timeToPress, TEXT_TIME_TO_PRESS); diff --git a/Source/Assets/TouchScript/Editor/Gestures/MetaGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/MetaGestureEditor.cs new file mode 100644 index 000000000..5c32cbaab --- /dev/null +++ b/Source/Assets/TouchScript/Editor/Gestures/MetaGestureEditor.cs @@ -0,0 +1,28 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using TouchScript.Gestures; +using UnityEditor; +using UnityEngine; + +namespace TouchScript.Editor.Gestures +{ + [CustomEditor(typeof(MetaGesture), true)] + internal sealed class MetaGestureEditor : GestureEditor + { + public static readonly GUIContent TEXT_HELP = new GUIContent("This component serves as a proxy from TouchScript gesture recognition logic to C# events. It catches pointers like a normal event and dispatches events for every event of caught pointers. Switch to advanced view to see more options."); + + protected override void OnEnable() + { + base.OnEnable(); + + shouldDrawGeneral = false; + } + + protected override GUIContent getHelpText() + { + return TEXT_HELP; + } + } +} diff --git a/Source/Assets/TouchScript/Editor/Gestures/MetaGestureEditor.cs.meta b/Source/Assets/TouchScript/Editor/Gestures/MetaGestureEditor.cs.meta new file mode 100644 index 000000000..e0ebd396d --- /dev/null +++ b/Source/Assets/TouchScript/Editor/Gestures/MetaGestureEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1526de045810e4fd49854b9fda413e2a +timeCreated: 1500968297 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Editor/Gestures/PressGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/PressGestureEditor.cs index 3fe025d7b..d4e2533d1 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/PressGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/PressGestureEditor.cs @@ -13,6 +13,8 @@ internal sealed class PressGestureEditor : GestureEditor { public static readonly GUIContent TEXT_IGNORE_CHILDREN = new GUIContent("Ignore Children", "If selected this gesture ignores pointers from children."); + public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a gesture when at least one pointer is pressed over this GameObject. Switch to advanced view to see more options."); + private SerializedProperty ignoreChildren; private SerializedProperty OnPress; @@ -24,6 +26,11 @@ protected override void OnEnable() base.OnEnable(); } + protected override GUIContent getHelpText() + { + return TEXT_HELP; + } + protected override void drawGeneral() { EditorGUILayout.PropertyField(ignoreChildren, TEXT_IGNORE_CHILDREN); diff --git a/Source/Assets/TouchScript/Editor/Gestures/ReleaseGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/ReleaseGestureEditor.cs index 7d182ce9b..94f4cc9a9 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/ReleaseGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/ReleaseGestureEditor.cs @@ -13,7 +13,9 @@ internal sealed class ReleaseGestureEditor : GestureEditor { public static readonly GUIContent TEXT_IGNORE_CHILDREN = new GUIContent("Ignore Children", "If selected this gesture ignores pointers from children."); - private SerializedProperty ignoreChildren; + public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a gesture when all pointers are lifted off from this GameObject. Switch to advanced view to see more options."); + + private SerializedProperty ignoreChildren; private SerializedProperty OnRelease; protected override void OnEnable() @@ -24,6 +26,11 @@ protected override void OnEnable() base.OnEnable(); } + protected override GUIContent getHelpText() + { + return TEXT_HELP; + } + protected override void drawGeneral() { EditorGUILayout.PropertyField(ignoreChildren, TEXT_IGNORE_CHILDREN); diff --git a/Source/Assets/TouchScript/Editor/Gestures/TapGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/TapGestureEditor.cs index e29abdef7..3ae96336c 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/TapGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/TapGestureEditor.cs @@ -17,6 +17,8 @@ internal sealed class TapGestureEditor : GestureEditor public static readonly GUIContent TEXT_COMBINE_POINTERS = new GUIContent("Combine Pointers", "When several fingers are used to perform a tap, pointers released not earlier than seconds ago are used to calculate gesture's final screen position."); public static readonly GUIContent TEXT_COMBINE_TOUCH_POINTERS = new GUIContent("Combine Interval (sec)", TEXT_COMBINE_POINTERS.tooltip); + public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a gesture when this GameObject is tapped. Switch to advanced view to see more options."); + private SerializedProperty numberOfTapsRequired, distanceLimit, timeLimit, combinePointers, combinePointersInterval; private SerializedProperty OnTap; @@ -33,6 +35,17 @@ protected override void OnEnable() base.OnEnable(); } + protected override void drawBasic() + { + EditorGUIUtility.labelWidth = 180; + EditorGUILayout.IntPopup(numberOfTapsRequired, new[] { new GUIContent("One"), new GUIContent("Two"), new GUIContent("Three") }, new[] { 1, 2, 3 }, TEXT_NUMBER_OF_TAPS_REQUIRED, GUILayout.ExpandWidth(true)); + } + + protected override GUIContent getHelpText() + { + return TEXT_HELP; + } + protected override void drawGeneral() { EditorGUIUtility.labelWidth = 180; diff --git a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/OnePointTransformGestureBaseEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/OnePointTransformGestureBaseEditor.cs index 5ef17c9f1..9920e1916 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/OnePointTransformGestureBaseEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/OnePointTransformGestureBaseEditor.cs @@ -11,6 +11,29 @@ namespace TouchScript.Editor.Gestures.TransformGestures.Base internal class OnePointTransformGestureBaseEditor : TransformGestureBaseEditor { + protected override void drawBasic() + { + var typeValue = type.intValue; + int newType = 0; + EditorGUILayout.LabelField(TEXT_TYPE); + EditorGUI.indentLevel++; + EditorGUILayout.BeginHorizontal(); + { + var rect = GUILayoutUtility.GetRect(36, 20); + if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_ROTATION, + (typeValue & (int)TransformGesture.TransformType.Rotation) != 0)) + newType |= (int)TransformGesture.TransformType.Rotation; + rect = GUILayoutUtility.GetRect(44, 20); + if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_SCALING, + (typeValue & (int)TransformGesture.TransformType.Scaling) != 0)) + newType |= (int)TransformGesture.TransformType.Scaling; + GUILayoutUtility.GetRect(0, 20, GUILayout.ExpandWidth(true)); + type.intValue = newType; + } + EditorGUILayout.EndHorizontal(); + EditorGUI.indentLevel--; + } + protected override void drawGeneral() { var typeValue = type.intValue; diff --git a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/TransformGestureBaseEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/TransformGestureBaseEditor.cs index 75964f434..05fbde6e7 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/TransformGestureBaseEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/TransformGestureBaseEditor.cs @@ -18,8 +18,8 @@ internal class TransformGestureBaseEditor : GestureEditor public static readonly GUIContent TEXT_TYPE_SCALING = new GUIContent(" Scaling", "Scaling with two or more fingers."); public static readonly GUIContent TEXT_MIN_SCREEN_POINTS_DISTANCE = new GUIContent("Min Points Distance (cm)", "Minimum distance between two pointers (clusters) in cm to consider this gesture started. Used to prevent fake pointers spawned near real ones on cheap multitouch hardware to mess everything up."); public static readonly GUIContent TEXT_SCREEN_TRANSFORM_THRESHOLD = new GUIContent("Movement Threshold (cm)", "Minimum distance in cm pointers must move for the gesture to begin."); - public static readonly GUIContent TEXT_PROJECTION = new GUIContent("Type", "Method used to project 2d screen positions of pointers into 3d space."); - public static readonly GUIContent TEXT_PROJECTION_NORMAL = new GUIContent("Normal", "Normal of the plane in 3d space where pointers' positions are projected."); + public static readonly GUIContent TEXT_PROJECTION = new GUIContent("Projection Type", "Method used to project 2d screen positions of pointers into 3d space."); + public static readonly GUIContent TEXT_PROJECTION_NORMAL = new GUIContent("Projection Normal", "Normal of the plane in 3d space where pointers' positions are projected."); protected SerializedProperty type, minScreenPointsDistance, screenTransformThreshold; protected SerializedProperty OnTransformStart, OnTransform, OnTransformComplete; diff --git a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/TwoPointTransformGestureBaseEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/TwoPointTransformGestureBaseEditor.cs index f556e3068..e705fbc7a 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/TwoPointTransformGestureBaseEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/TwoPointTransformGestureBaseEditor.cs @@ -10,6 +10,34 @@ namespace TouchScript.Editor.Gestures.TransformGestures.Base { internal class TwoPointTransformGestureBaseEditor : TransformGestureBaseEditor { + + protected override void drawBasic() + { + var typeValue = type.intValue; + int newType = 0; + EditorGUILayout.LabelField(TEXT_TYPE); + EditorGUI.indentLevel++; + EditorGUILayout.BeginHorizontal(); + { + var rect = GUILayoutUtility.GetRect(86, 20); + if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_TRANSLATION, + (typeValue & (int)TransformGesture.TransformType.Translation) != 0)) + newType |= (int)TransformGesture.TransformType.Translation; + rect = GUILayoutUtility.GetRect(70, 20); + if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_ROTATION, + (typeValue & (int)TransformGesture.TransformType.Rotation) != 0)) + newType |= (int)TransformGesture.TransformType.Rotation; + rect = GUILayoutUtility.GetRect(64, 20); + if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_SCALING, + (typeValue & (int)TransformGesture.TransformType.Scaling) != 0)) + newType |= (int)TransformGesture.TransformType.Scaling; + GUILayoutUtility.GetRect(0, 20, GUILayout.ExpandWidth(true)); + type.intValue = newType; + } + EditorGUILayout.EndHorizontal(); + EditorGUI.indentLevel--; + } + protected override void drawGeneral() { var typeValue = type.intValue; diff --git a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/PinnedTransformGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/PinnedTransformGestureEditor.cs index f451f970b..394e1d215 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/PinnedTransformGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/PinnedTransformGestureEditor.cs @@ -13,6 +13,9 @@ namespace TouchScript.Editor.Gestures.TransformGestures [CustomEditor(typeof(PinnedTransformGesture), true)] internal class PinnedTransformGestureEditor : OnePointTransformGestureBaseEditor { + + public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a combination of rotation and scaling gestures on the GameObject if it was pinned to the world position. Switch to advanced view to see more options."); + public SerializedProperty projection, projectionPlaneNormal; public SerializedProperty projectionProps; @@ -26,6 +29,22 @@ protected override void OnEnable() base.OnEnable(); } + protected override void drawBasic() + { + base.drawBasic(); + + EditorGUILayout.PropertyField(projection, TEXT_PROJECTION); + if (projection.enumValueIndex != (int)TransformGesture.ProjectionType.Layer) + { + EditorGUILayout.PropertyField(projectionPlaneNormal, TEXT_PROJECTION_NORMAL); + } + } + + protected override GUIContent getHelpText() + { + return TEXT_HELP; + } + protected override void drawOtherGUI() { var display = GUIElements.Header(TEXT_PROJECTION_HEADER, projectionProps); diff --git a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/ScreenTransformGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/ScreenTransformGestureEditor.cs index 4ada899fe..e595cc80b 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/ScreenTransformGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/ScreenTransformGestureEditor.cs @@ -5,11 +5,20 @@ using TouchScript.Editor.Gestures.TransformGestures.Base; using TouchScript.Gestures.TransformGestures; using UnityEditor; +using UnityEngine; namespace TouchScript.Editor.Gestures.TransformGestures { [CustomEditor(typeof(ScreenTransformGesture), true)] internal class ScreenTransformGestureEditor : TwoPointTransformGestureBaseEditor { - } + + public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a combination of translation, rotation and scaling gestures on the GameObject in screen space. Switch to advanced view to see more options."); + + protected override GUIContent getHelpText() + { + return TEXT_HELP; + } + + } } diff --git a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/TransformGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/TransformGestureEditor.cs index 026973fa1..95ded9450 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/TransformGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/TransformGestureEditor.cs @@ -6,12 +6,16 @@ using TouchScript.Gestures.TransformGestures; using UnityEditor; using TouchScript.Editor.EditorUI; +using UnityEngine; namespace TouchScript.Editor.Gestures.TransformGestures { [CustomEditor(typeof(TransformGesture), true)] internal class TransformGestureEditor : TwoPointTransformGestureBaseEditor { + + public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a combination of translation, rotation and scaling gestures on the GameObject. Switch to advanced view to see more options."); + public SerializedProperty projection, projectionPlaneNormal; public SerializedProperty projectionProps; @@ -25,6 +29,22 @@ protected override void OnEnable() base.OnEnable(); } + protected override void drawBasic() + { + base.drawBasic(); + + EditorGUILayout.PropertyField(projection, TEXT_PROJECTION); + if (projection.enumValueIndex != (int)TransformGesture.ProjectionType.Layer) + { + EditorGUILayout.PropertyField(projectionPlaneNormal, TEXT_PROJECTION_NORMAL); + } + } + + protected override GUIContent getHelpText() + { + return TEXT_HELP; + } + protected override void drawOtherGUI() { var display = GUIElements.Header(TEXT_PROJECTION_HEADER, projectionProps); diff --git a/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs b/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs index 1011c4169..9f439e936 100644 --- a/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs +++ b/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs @@ -14,18 +14,23 @@ internal sealed class StandardInputEditor : InputSourceEditor { public static readonly GUIContent TEXT_GENERAL_HEADER = new GUIContent("General", "General settings."); public static readonly GUIContent TEXT_WINDOWS_HEADER = new GUIContent("Windows", "Windows specific settings."); + public static readonly GUIContent TEXT_WEBGL_HEADER = new GUIContent("WebGL", "WebGL specific settings."); - public static readonly GUIContent TEXT_WINDOWS_API = new GUIContent("Select which touch API to use:\n - Windows 8 — new WM_POINTER API,\n - Windows 7 — old WM_TOUCH API,\n - Unity — Unity's native WM_TOUCH implementation,\n - None — no touch please."); + public static readonly GUIContent TEXT_EMULATE_MOUSE = new GUIContent("Emulate Second Mouse Pointer", "If selected, you can press ALT to make a stationary mouse pointer. This is used to simulate multi-touch."); + public static readonly GUIContent TEXT_WINDOWS_API = new GUIContent("Select which touch API to use:\n - Windows 8 — new WM_POINTER API,\n - Windows 7 — old WM_TOUCH API,\n - Unity — Unity's WM_TOUCH implementation,\n - None — no touch."); public static readonly GUIContent TEXT_WINDOWS8 = new GUIContent("Windows 8+ API"); public static readonly GUIContent TEXT_WINDOWS7 = new GUIContent("Windows 7 API"); public static readonly GUIContent TEXT_WINDOWS8_MOUSE = new GUIContent("Enable Mouse on Windows 8+"); public static readonly GUIContent TEXT_WINDOWS7_MOUSE = new GUIContent("Enable Mouse on Windows 7"); public static readonly GUIContent TEXT_UWP_MOUSE = new GUIContent("Enable Mouse on UWP"); + public static readonly GUIContent TEXT_HELP = new GUIContent("This component gathers input data from various devices like touch, mouse and pen on all platforms. Switch to advanced view to see more options."); + + private SerializedProperty basicEditor; private SerializedProperty windows8Touch, windows7Touch, webGLTouch, windows8Mouse, windows7Mouse, universalWindowsMouse, emulateSecondMousePointer; - private SerializedProperty generalProps, windowsProps; + private SerializedProperty generalProps, windowsProps, webglProps; private StandardInput instance; @@ -34,6 +39,7 @@ protected override void OnEnable() base.OnEnable(); instance = target as StandardInput; + basicEditor = serializedObject.FindProperty("basicEditor"); windows8Touch = serializedObject.FindProperty("windows8API"); windows7Touch = serializedObject.FindProperty("windows7API"); webGLTouch = serializedObject.FindProperty("webGLTouch"); @@ -44,6 +50,7 @@ protected override void OnEnable() generalProps = serializedObject.FindProperty("generalProps"); windowsProps = serializedObject.FindProperty("windowsProps"); + webglProps = serializedObject.FindProperty("webglProps"); } public override void OnInspectorGUI() @@ -56,21 +63,51 @@ public override void OnInspectorGUI() GUILayout.Space(5); + if (basicEditor.boolValue) + { + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(emulateSecondMousePointer, TEXT_EMULATE_MOUSE); + if (EditorGUI.EndChangeCheck()) + { + instance.EmulateSecondMousePointer = emulateSecondMousePointer.boolValue; + } + + if (GUIElements.BasicHelpBox(TEXT_HELP)) + { + basicEditor.boolValue = false; + Repaint(); + } + } + else + { + drawGeneral(); + drawWindows(); + drawWebGL(); + } + + serializedObject.ApplyModifiedProperties(); + base.OnInspectorGUI(); + } + + private void drawGeneral() + { var display = GUIElements.Header(TEXT_GENERAL_HEADER, generalProps); if (display) { EditorGUI.indentLevel++; EditorGUI.BeginChangeCheck(); - EditorGUILayout.PropertyField(emulateSecondMousePointer); + EditorGUILayout.PropertyField(emulateSecondMousePointer, TEXT_EMULATE_MOUSE); if (EditorGUI.EndChangeCheck()) { instance.EmulateSecondMousePointer = emulateSecondMousePointer.boolValue; } - EditorGUILayout.PropertyField(webGLTouch); EditorGUI.indentLevel--; } + } - display = GUIElements.Header(TEXT_WINDOWS_HEADER, windowsProps); + private void drawWindows() + { + var display = GUIElements.Header(TEXT_WINDOWS_HEADER, windowsProps); if (display) { EditorGUI.indentLevel++; @@ -82,9 +119,18 @@ public override void OnInspectorGUI() EditorGUILayout.PropertyField(universalWindowsMouse, TEXT_UWP_MOUSE); EditorGUI.indentLevel--; } - - serializedObject.ApplyModifiedProperties(); - base.OnInspectorGUI(); } + + private void drawWebGL() + { + var display = GUIElements.Header(TEXT_WEBGL_HEADER, webglProps); + if (display) + { + EditorGUI.indentLevel++; + EditorGUILayout.PropertyField(webGLTouch); + EditorGUI.indentLevel--; + } + } + } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Editor/Layers/FullscreenLayerEditor.cs b/Source/Assets/TouchScript/Editor/Layers/FullscreenLayerEditor.cs index 1986c8492..9f87df0f5 100644 --- a/Source/Assets/TouchScript/Editor/Layers/FullscreenLayerEditor.cs +++ b/Source/Assets/TouchScript/Editor/Layers/FullscreenLayerEditor.cs @@ -2,6 +2,7 @@ * @author Valentin Simonov / http://va.lent.in/ */ +using TouchScript.Editor.EditorUI; using TouchScript.Layers; using UnityEditor; using UnityEngine; @@ -11,7 +12,10 @@ namespace TouchScript.Editor.Layers [CustomEditor(typeof(FullscreenLayer))] internal sealed class FullscreenLayerEditor : UnityEditor.Editor { - private SerializedProperty type, camera; + + public static readonly GUIContent TEXT_HELP = new GUIContent("This component receives all pointers which were not caught by other layers. It sets poitners' Target property to itself, so all fullscreen gestures must be attached to the same GameObject as FullscreenGesture."); + + private SerializedProperty type, camera; private FullscreenLayer instance; private void OnEnable() @@ -42,6 +46,8 @@ public override void OnInspectorGUI() instance.Camera = camera.objectReferenceValue as Camera; } } + + EditorGUILayout.LabelField(TEXT_HELP, GUIElements.HelpBox); } } } diff --git a/Source/Assets/TouchScript/Editor/Layers/StandardLayerEditor.cs b/Source/Assets/TouchScript/Editor/Layers/StandardLayerEditor.cs index 0fa210c2b..4045c9828 100644 --- a/Source/Assets/TouchScript/Editor/Layers/StandardLayerEditor.cs +++ b/Source/Assets/TouchScript/Editor/Layers/StandardLayerEditor.cs @@ -22,7 +22,10 @@ internal class StandardLayerEditor : UnityEditor.Editor public static readonly GUIContent TEXT_LAYER_MASK = new GUIContent("Layer Mask", "Layer mask."); public static readonly GUIContent TEXT_HIT_FILTERS = new GUIContent("Use Hit FIlters", "Layer should test for individual HitTest objects."); - private SerializedProperty advanced, hit; + public static readonly GUIContent TEXT_HELP = new GUIContent("This component assigns target GameObjects in the scene for pressed pointers. Switch to advanced view to see more options."); + + private SerializedProperty advancedProps, hitProps; + private SerializedProperty basicEditor; private SerializedProperty hit3DObjects; private SerializedProperty hit2DObjects; private SerializedProperty hitWorldSpaceUI; @@ -34,8 +37,9 @@ protected virtual void OnEnable() { hideFlags = HideFlags.HideAndDontSave; - advanced = serializedObject.FindProperty("advancedProps"); - hit = serializedObject.FindProperty("hitProps"); + advancedProps = serializedObject.FindProperty("advancedProps"); + hitProps = serializedObject.FindProperty("hitProps"); + basicEditor = serializedObject.FindProperty("basicEditor"); hit3DObjects = serializedObject.FindProperty("hit3DObjects"); hit2DObjects = serializedObject.FindProperty("hit2DObjects"); hitWorldSpaceUI = serializedObject.FindProperty("hitWorldSpaceUI"); @@ -52,27 +56,39 @@ public override void OnInspectorGUI() serializedObject.UpdateIfDirtyOrScript(); #endif - GUILayout.Space(5); - var display = GUIElements.Header(TEXT_HIT_HEADER, hit); - if (display) + GUILayout.Space(5); + + if (basicEditor.boolValue) { - EditorGUI.indentLevel++; drawHit(); - EditorGUI.indentLevel--; + + if (GUIElements.BasicHelpBox(TEXT_HELP)) + { + basicEditor.boolValue = false; + Repaint(); + } } + else + { + drawHit(); + drawAdvanced(); + } + + serializedObject.ApplyModifiedProperties(); + } - display = GUIElements.Header(TEXT_ADVANCED_HEADER, advanced); + private void drawHit() + { + var display = GUIElements.Header(TEXT_HIT_HEADER, hitProps); if (display) { EditorGUI.indentLevel++; - drawAdvanced(); + doDrawHit(); EditorGUI.indentLevel--; } - - serializedObject.ApplyModifiedProperties(); } - protected virtual void drawHit() + protected virtual void doDrawHit() { EditorGUILayout.PropertyField(hitScreenSpaceUI, TEXT_SS_UI); EditorGUILayout.PropertyField(hit3DObjects, TEXT_3D_OBJECTS); @@ -81,7 +97,18 @@ protected virtual void drawHit() EditorGUILayout.PropertyField(layerMask, TEXT_LAYER_MASK); } - protected virtual void drawAdvanced() + private void drawAdvanced() + { + var display = GUIElements.Header(TEXT_ADVANCED_HEADER, advancedProps); + if (display) + { + EditorGUI.indentLevel++; + doDrawAdvanced(); + EditorGUI.indentLevel--; + } + } + + protected virtual void doDrawAdvanced() { EditorGUILayout.PropertyField(useHitFilters, TEXT_HIT_FILTERS); } diff --git a/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs b/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs index b9ab847cf..975d32055 100644 --- a/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs +++ b/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs @@ -18,7 +18,7 @@ namespace TouchScript.Editor [CustomEditor(typeof(TouchManager))] internal sealed class TouchManagerEditor : UnityEditor.Editor { - public static readonly GUIContent TEXT_ADVANCED_HEADER = new GUIContent("Advanced", "Advanced properties."); + public static readonly GUIContent TEXT_LAYERS_HELP = new GUIContent("Layers at the top get to process pointer input first."); public static readonly GUIContent TEXT_LAYERS_HEADER = new GUIContent("Pointer Layers", "Sorted array of Pointer Layers in the scene."); public static readonly GUIContent TEXT_USE_SEND_MESSAGE_HEADER = new GUIContent("Use SendMessage", "Enables sending events through SendMessage. Warnning: this method is slow!"); public static readonly GUIContent TEXT_USE_UNITY_EVENTS_HEADER = new GUIContent("Use Unity Events", "Enables sending events through Unity Events."); @@ -31,9 +31,11 @@ internal sealed class TouchManagerEditor : UnityEditor.Editor public static readonly GUIContent TEXT_SEND_MESSAGE_TARGET = new GUIContent("Target", "The GameObject target of Unity Messages. If null, host GameObject is used."); public static readonly GUIContent TEXT_SEND_MESSAGE_EVENTS = new GUIContent("Events", "Which events should be sent as Unity Messages."); + public static readonly GUIContent TEXT_HELP = new GUIContent("This component holds TouchScript configuration options for a scene. Switch to advanced view to see more options."); + private TouchManager instance; private ReorderableList layersList; - private SerializedProperty advancedProps; + private SerializedProperty basicEditor; private SerializedProperty debugMode; private SerializedProperty layers, displayDevice, shouldCreateCameraLayer, shouldCreateStandardInput, useSendMessage, sendMessageTarget, sendMessageEvents; @@ -45,7 +47,7 @@ private void OnEnable() { instance = target as TouchManager; - advancedProps = serializedObject.FindProperty("advancedProps"); + basicEditor = serializedObject.FindProperty("basicEditor"); debugMode = serializedObject.FindProperty("debugMode"); layers = serializedObject.FindProperty("layers"); displayDevice = serializedObject.FindProperty("displayDevice"); @@ -92,10 +94,38 @@ private void OnEnable() public override void OnInspectorGUI() { - serializedObject.Update(); +#if UNITY_5_6_OR_NEWER + serializedObject.UpdateIfRequiredOrScript(); +#else + serializedObject.UpdateIfDirtyOrScript(); +#endif GUILayout.Space(5); + if (basicEditor.boolValue) + { + drawLayers(); + + if (GUIElements.BasicHelpBox(TEXT_HELP)) + { + basicEditor.boolValue = false; + Repaint(); + } + } + else + { + drawDefaults(); + drawLayers(); + drawUnityEvents(); + drawSendMessage(); + drawDebug(); + } + + serializedObject.ApplyModifiedProperties(); + } + + private void drawDefaults() + { var display = GUIElements.Header(TEXT_DEFAULTS_HEADER, shouldCreateCameraLayer); if (display) { @@ -105,10 +135,41 @@ public override void OnInspectorGUI() EditorGUILayout.PropertyField(shouldCreateCameraLayer, TEXT_CREATE_CAMERA_LAYER); EditorGUILayout.PropertyField(shouldCreateStandardInput, TEXT_CREATE_STANDARD_INPUT); } + + var r = EditorGUILayout.GetControlRect(true, 16f, EditorStyles.objectField); + var label = EditorGUI.BeginProperty(r, TEXT_DISPLAY_DEVICE, displayDevice); + EditorGUI.BeginChangeCheck(); + r = EditorGUI.PrefixLabel(r, label); + var newDevice = EditorGUI.ObjectField(r, instance.DisplayDevice as Object, typeof(IDisplayDevice), true) as IDisplayDevice; + if (EditorGUI.EndChangeCheck()) + { + instance.DisplayDevice = newDevice; + EditorUtility.SetDirty(instance); + } + EditorGUI.EndProperty(); + EditorGUI.indentLevel--; } + } + + private void drawLayers() + { + var display = GUIElements.Header(TEXT_LAYERS_HEADER, layers); + if (display) + { + EditorGUILayout.LabelField(TEXT_LAYERS_HELP, GUIElements.HelpBox); + EditorGUI.indentLevel++; + using (new EditorGUI.DisabledGroupScope(Application.isPlaying)) + { + layersList.DoLayoutList(); + } + EditorGUI.indentLevel--; + } + } - display = GUIElements.Header(TEXT_USE_UNITY_EVENTS_HEADER, useUnityEvents, useUnityEvents, useUnityEvents_prop); + private void drawUnityEvents() + { + var display = GUIElements.Header(TEXT_USE_UNITY_EVENTS_HEADER, useUnityEvents, useUnityEvents, useUnityEvents_prop); if (display) { EditorGUI.indentLevel++; @@ -125,8 +186,11 @@ public override void OnInspectorGUI() } EditorGUI.indentLevel--; } + } - display = GUIElements.Header(TEXT_USE_SEND_MESSAGE_HEADER, useSendMessage, useSendMessage, useSendMessage_prop); + private void drawSendMessage() + { + var display = GUIElements.Header(TEXT_USE_SEND_MESSAGE_HEADER, useSendMessage, useSendMessage, useSendMessage_prop); if (display) { EditorGUI.indentLevel++; @@ -148,44 +212,6 @@ public override void OnInspectorGUI() } EditorGUI.indentLevel--; } - - display = GUIElements.Header(TEXT_LAYERS_HEADER, layers); - if (display) - { - EditorGUI.indentLevel++; - using (new EditorGUI.DisabledGroupScope(Application.isPlaying)) - { - layersList.DoLayoutList(); - } - EditorGUI.indentLevel--; - } - - display = GUIElements.Header(TEXT_ADVANCED_HEADER, advancedProps); - if (display) - { - EditorGUI.indentLevel++; - drawAdvanced(); - EditorGUI.indentLevel--; - } - - serializedObject.ApplyModifiedProperties(); - } - - private void drawAdvanced() - { - var r = EditorGUILayout.GetControlRect(true, 16f, EditorStyles.objectField); - var label = EditorGUI.BeginProperty(r, TEXT_DISPLAY_DEVICE, displayDevice); - EditorGUI.BeginChangeCheck(); - r = EditorGUI.PrefixLabel(r, label); - var newDevice = EditorGUI.ObjectField(r, instance.DisplayDevice as Object, typeof(IDisplayDevice), true) as IDisplayDevice; - if (EditorGUI.EndChangeCheck()) - { - instance.DisplayDevice = newDevice; - EditorUtility.SetDirty(instance); - } - EditorGUI.EndProperty(); - - drawDebug(); } private void drawDebug() diff --git a/Source/Assets/TouchScript/Examples/Camera/Camera.unity b/Source/Assets/TouchScript/Examples/Camera/Camera.unity index 81d0a8e85..6ced9e1d4 100644 --- a/Source/Assets/TouchScript/Examples/Camera/Camera.unity +++ b/Source/Assets/TouchScript/Examples/Camera/Camera.unity @@ -479,6 +479,10 @@ Prefab: m_Modification: m_TransformParent: {fileID: 0} m_Modifications: + - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} + propertyPath: layers.Array.size + value: 1 + objectReference: {fileID: 0} - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: m_LocalPosition.x value: 0 @@ -765,18 +769,18 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 74ae431eff8434b0897d3f7f1cff4311, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 OnStateChange: m_PersistentCalls: m_Calls: [] m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + basicEditor: 0 generalProps: 0 limitsProps: 0 advancedProps: 0 minPointers: 1 maxPointers: 1 - combinePointers: 0 - combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -858,18 +862,18 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 74ae431eff8434b0897d3f7f1cff4311, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 OnStateChange: m_PersistentCalls: m_Calls: [] m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + basicEditor: 0 generalProps: 0 limitsProps: 0 advancedProps: 0 minPointers: 2 maxPointers: 10 - combinePointers: 0 - combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} diff --git a/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity b/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity index 99973bc75..f25eab3ce 100644 --- a/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity +++ b/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity @@ -1,19 +1,19 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: --- !u!29 &1 -SceneSettings: +OcclusionCullingSettings: m_ObjectHideFlags: 0 - m_PVSData: - m_PVSObjectsArray: [] - m_PVSPortalsArray: [] + serializedVersion: 2 m_OcclusionBakeSettings: smallestOccluder: 5 smallestHole: 0.25 backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 - serializedVersion: 6 + serializedVersion: 8 m_Fog: 0 m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 @@ -25,6 +25,7 @@ RenderSettings: m_AmbientGroundColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} m_AmbientIntensity: 1 m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} m_SkyboxMaterial: {fileID: 2100000, guid: a07fadb24ea940240afba3afc1a692cc, type: 2} m_HaloStrength: 0.5 m_FlareStrength: 1 @@ -37,12 +38,12 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} --- !u!157 &4 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 6 + serializedVersion: 9 m_GIWorkflowMode: 1 - m_LightmapsMode: 1 m_GISettings: serializedVersion: 2 m_BounceScale: 1 @@ -53,37 +54,59 @@ LightmapSettings: m_EnableBakedLightmaps: 1 m_EnableRealtimeLightmaps: 0 m_LightmapEditorSettings: - serializedVersion: 3 + serializedVersion: 8 m_Resolution: 1 m_BakeResolution: 50 m_TextureWidth: 1024 m_TextureHeight: 1024 + m_AO: 0 m_AOMaxDistance: 1 - m_Padding: 2 m_CompAOExponent: 0 + m_CompAOExponentDirect: 0 + m_Padding: 2 m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 m_TextureCompression: 0 m_FinalGather: 0 + m_FinalGatherFiltering: 1 m_FinalGatherRayCount: 1024 m_ReflectionCompression: 2 + m_MixedBakeMode: 1 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVRFiltering: 0 + m_PVRFilteringMode: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousColorSigma: 1 + m_PVRFilteringAtrousNormalSigma: 1 + m_PVRFilteringAtrousPositionSigma: 1 m_LightingDataAsset: {fileID: 0} - m_RuntimeCPUUsage: 25 + m_ShadowMaskMode: 2 --- !u!196 &5 NavMeshSettings: serializedVersion: 2 m_ObjectHideFlags: 0 m_BuildSettings: serializedVersion: 2 + agentTypeID: 0 agentRadius: 0.5 agentHeight: 2 agentSlope: 45 agentClimb: 0.4 ledgeDropHeight: 0 maxJumpAcrossDistance: 0 - accuratePlacement: 0 minRegionArea: 2 - cellSize: 0.16666666 manualCellSize: 0 + cellSize: 0.16666666 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 m_NavMeshData: {fileID: 0} --- !u!1 &12619638 stripped GameObject: @@ -144,14 +167,14 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 62216952} - - 20: {fileID: 62216957} - - 92: {fileID: 62216956} - - 124: {fileID: 62216955} - - 81: {fileID: 62216954} - - 114: {fileID: 62216953} + - component: {fileID: 62216952} + - component: {fileID: 62216957} + - component: {fileID: 62216956} + - component: {fileID: 62216955} + - component: {fileID: 62216954} + - component: {fileID: 62216953} m_Layer: 0 m_Name: Camera m_TagString: MainCamera @@ -168,10 +191,10 @@ Transform: m_LocalRotation: {x: 0.26945794, y: 0, z: 0, w: 0.96301216} m_LocalPosition: {x: -1.11, y: 7.79, z: -14.44} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 31.264, y: 0, z: 0} m_Children: [] m_Father: {fileID: 930800601} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 31.264, y: 0, z: 0} --- !u!114 &62216953 MonoBehaviour: m_ObjectHideFlags: 0 @@ -184,6 +207,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Name: Camera + basicEditor: 1 advancedProps: 0 hitProps: 0 hit3DObjects: 1 @@ -245,6 +269,8 @@ Camera: m_TargetDisplay: 0 m_TargetEye: 3 m_HDR: 0 + m_AllowMSAA: 1 + m_ForceIntoRT: 0 m_OcclusionCulling: 1 m_StereoConvergence: 10 m_StereoSeparation: 0.022 @@ -258,11 +284,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 242343086} - - 222: {fileID: 242343088} - - 114: {fileID: 242343087} + - component: {fileID: 242343086} + - component: {fileID: 242343088} + - component: {fileID: 242343087} m_Layer: 5 m_Name: Image m_TagString: Untagged @@ -279,10 +305,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1962593004} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} @@ -326,10 +352,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 250857271} - - 114: {fileID: 250857270} + - component: {fileID: 250857271} + - component: {fileID: 250857270} m_Layer: 5 m_Name: List m_TagString: Untagged @@ -357,6 +383,8 @@ MonoBehaviour: m_Spacing: 0 m_ChildForceExpandWidth: 1 m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 --- !u!224 &250857271 RectTransform: m_ObjectHideFlags: 0 @@ -366,13 +394,13 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1679844150} - {fileID: 1962593004} - {fileID: 841877613} m_Father: {fileID: 1981142013} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} @@ -453,6 +481,10 @@ Prefab: m_Modification: m_TransformParent: {fileID: 0} m_Modifications: + - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} + propertyPath: layers.Array.size + value: 1 + objectReference: {fileID: 0} - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: m_LocalPosition.x value: 0 @@ -781,18 +813,20 @@ MeshCollider: m_Enabled: 1 serializedVersion: 2 m_Convex: 1 + m_InflateMesh: 0 + m_SkinWidth: 0.01 m_Mesh: {fileID: 4300006, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} --- !u!1 &724610588 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 724610589} - - 222: {fileID: 724610592} - - 114: {fileID: 724610591} - - 114: {fileID: 724610590} + - component: {fileID: 724610589} + - component: {fileID: 724610592} + - component: {fileID: 724610591} + - component: {fileID: 724610590} m_Layer: 5 m_Name: Text m_TagString: Untagged @@ -809,10 +843,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 841877613} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} @@ -880,11 +914,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 740851132} - - 223: {fileID: 740851135} - - 114: {fileID: 740851134} + - component: {fileID: 740851132} + - component: {fileID: 740851135} + - component: {fileID: 740851134} m_Layer: 5 m_Name: Canvas m_TagString: Untagged @@ -901,12 +935,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0, y: 0, z: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1981142013} - {fileID: 1552723601} m_Father: {fileID: 0} m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -940,7 +974,7 @@ Canvas: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 740851131} m_Enabled: 1 - serializedVersion: 2 + serializedVersion: 3 m_RenderMode: 0 m_Camera: {fileID: 0} m_PlaneDistance: 100 @@ -949,6 +983,7 @@ Canvas: m_OverrideSorting: 0 m_OverridePixelPerfect: 0 m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 m_SortingLayerID: 0 m_SortingOrder: 0 m_TargetDisplay: 0 @@ -1045,10 +1080,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 841877613} - - 114: {fileID: 841877614} + - component: {fileID: 841877613} + - component: {fileID: 841877614} m_Layer: 5 m_Name: Space m_TagString: Untagged @@ -1065,12 +1100,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 900258188} - {fileID: 724610589} m_Father: {fileID: 250857271} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -1103,11 +1138,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 900258188} - - 222: {fileID: 900258190} - - 114: {fileID: 900258189} + - component: {fileID: 900258188} + - component: {fileID: 900258190} + - component: {fileID: 900258189} m_Layer: 5 m_Name: Image m_TagString: Untagged @@ -1124,10 +1159,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 841877613} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 36.77, y: 0} @@ -1244,10 +1279,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 930800601} - - 114: {fileID: 930800602} + - component: {fileID: 930800601} + - component: {fileID: 930800602} m_Layer: 0 m_Name: Scene m_TagString: Untagged @@ -1264,7 +1299,6 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 2135305920} - {fileID: 62216952} @@ -1272,6 +1306,7 @@ Transform: - {fileID: 584553677} m_Father: {fileID: 0} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &930800602 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1401,11 +1436,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1138005900} - - 222: {fileID: 1138005902} - - 114: {fileID: 1138005901} + - component: {fileID: 1138005900} + - component: {fileID: 1138005902} + - component: {fileID: 1138005901} m_Layer: 5 m_Name: Image m_TagString: Untagged @@ -1422,10 +1457,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1679844150} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} @@ -1529,18 +1564,20 @@ MeshCollider: m_Enabled: 1 serializedVersion: 2 m_Convex: 1 + m_InflateMesh: 0 + m_SkinWidth: 0.01 m_Mesh: {fileID: 4300004, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} --- !u!1 &1399100003 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1399100004} - - 222: {fileID: 1399100006} - - 114: {fileID: 1399100005} - - 114: {fileID: 1399100007} + - component: {fileID: 1399100004} + - component: {fileID: 1399100006} + - component: {fileID: 1399100005} + - component: {fileID: 1399100007} m_Layer: 5 m_Name: Text m_TagString: Untagged @@ -1557,10 +1594,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1962593004} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} @@ -1668,12 +1705,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1408280581} - - 222: {fileID: 1408280583} - - 114: {fileID: 1408280582} - - 114: {fileID: 1408280584} + - component: {fileID: 1408280581} + - component: {fileID: 1408280583} + - component: {fileID: 1408280582} + - component: {fileID: 1408280584} m_Layer: 5 m_Name: Text m_TagString: Untagged @@ -1690,10 +1727,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1679844150} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} @@ -1880,12 +1917,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1552723601} - - 222: {fileID: 1552723603} - - 114: {fileID: 1552723602} - - 114: {fileID: 1552723604} + - component: {fileID: 1552723601} + - component: {fileID: 1552723603} + - component: {fileID: 1552723602} + - component: {fileID: 1552723604} m_Layer: 5 m_Name: Description m_TagString: Untagged @@ -1902,10 +1939,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 740851132} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 178, y: 78} @@ -2079,10 +2116,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1679844150} - - 114: {fileID: 1679844151} + - component: {fileID: 1679844150} + - component: {fileID: 1679844151} m_Layer: 5 m_Name: Drag m_TagString: Untagged @@ -2099,12 +2136,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1138005900} - {fileID: 1408280581} m_Father: {fileID: 250857271} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -2179,10 +2216,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 1764701050} - - 114: {fileID: 1764701049} + - component: {fileID: 1764701050} + - component: {fileID: 1764701049} m_Layer: 0 m_Name: EventSystem m_TagString: Untagged @@ -2213,10 +2250,10 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 0} m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &1766364327 Prefab: m_ObjectHideFlags: 0 @@ -2361,10 +2398,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1962593004} - - 114: {fileID: 1962593005} + - component: {fileID: 1962593004} + - component: {fileID: 1962593005} m_Layer: 5 m_Name: Rotate m_TagString: Untagged @@ -2381,12 +2418,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 242343086} - {fileID: 1399100004} m_Father: {fileID: 250857271} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -2503,9 +2540,9 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1981142013} + - component: {fileID: 1981142013} m_Layer: 5 m_Name: Panel m_TagString: Untagged @@ -2522,11 +2559,11 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 250857271} m_Father: {fileID: 740851132} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0.25263783, y: 1} m_AnchoredPosition: {x: 5, y: 50} @@ -2541,13 +2578,13 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 119514, guid: 4af91eff6c67b4995be4765a62f7eb5d, type: 2} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 2027571738} - - 33: {fileID: 2027571741} - - 23: {fileID: 2027571740} - - 114: {fileID: 2027571737} - - 114: {fileID: 2027571735} + - component: {fileID: 2027571738} + - component: {fileID: 2027571741} + - component: {fileID: 2027571740} + - component: {fileID: 2027571737} + - component: {fileID: 2027571735} m_Layer: 0 m_Name: Board m_TagString: Untagged @@ -2567,18 +2604,18 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 38e07bff8743d4ee38bf724a7a2b4cbb, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 OnStateChange: m_PersistentCalls: m_Calls: [] m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + basicEditor: 1 generalProps: 0 limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 - combinePointers: 0 - combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -2627,12 +2664,12 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 2041409367} - {fileID: 2130344072} m_Father: {fileID: 930800601} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!23 &2027571740 MeshRenderer: m_ObjectHideFlags: 0 @@ -2643,22 +2680,28 @@ MeshRenderer: m_Enabled: 1 m_CastShadows: 0 m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 m_Materials: - {fileID: 2100000, guid: c39504b52f7f64f26b5762f1bb63f09c, type: 2} - m_SubsetIndices: + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 m_StaticBatchRoot: {fileID: 0} - m_UseLightProbes: 0 - m_ReflectionProbeUsage: 1 m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} m_ScaleInLightmap: 1 m_PreserveUVs: 0 m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 m_MinimumChartSize: 4 m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} m_SortingLayerID: 0 + m_SortingLayer: 0 m_SortingOrder: 0 --- !u!33 &2027571741 MeshFilter: @@ -2673,13 +2716,13 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 119512, guid: 4af91eff6c67b4995be4765a62f7eb5d, type: 2} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 2041409367} - - 33: {fileID: 2041409372} - - 23: {fileID: 2041409369} - - 65: {fileID: 2041409368} - - 54: {fileID: 2041409371} + - component: {fileID: 2041409367} + - component: {fileID: 2041409372} + - component: {fileID: 2041409369} + - component: {fileID: 2041409368} + - component: {fileID: 2041409371} m_Layer: 0 m_Name: Body m_TagString: Untagged @@ -2696,10 +2739,10 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: -0.101, z: 0} m_LocalScale: {x: 10, y: 0.2, z: 10} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 2027571738} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!65 &2041409368 BoxCollider: m_ObjectHideFlags: 0 @@ -2723,22 +2766,28 @@ MeshRenderer: m_Enabled: 1 m_CastShadows: 0 m_ReceiveShadows: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 m_Materials: - {fileID: 2100000, guid: bade3b3ccc3024624b44815e95a6af4e, type: 2} - m_SubsetIndices: + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 m_StaticBatchRoot: {fileID: 0} - m_UseLightProbes: 0 - m_ReflectionProbeUsage: 1 m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} m_ScaleInLightmap: 1 m_PreserveUVs: 0 m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 m_MinimumChartSize: 4 m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} m_SortingLayerID: 0 + m_SortingLayer: 0 m_SortingOrder: 0 --- !u!54 &2041409371 Rigidbody: @@ -2814,9 +2863,9 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 2130344072} + - component: {fileID: 2130344072} m_Layer: 0 m_Name: Container m_TagString: Untagged @@ -2833,7 +2882,6 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1423153197} - {fileID: 868514750} @@ -2853,15 +2901,16 @@ Transform: - {fileID: 1140064800} m_Father: {fileID: 2027571738} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &2135305919 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 2135305920} - - 108: {fileID: 2135305921} + - component: {fileID: 2135305920} + - component: {fileID: 2135305921} m_Layer: 0 m_Name: Directional light m_TagString: Untagged @@ -2878,10 +2927,10 @@ Transform: m_LocalRotation: {x: 0.24194291, y: -0.49854365, z: 0.22107579, w: 0.80252314} m_LocalPosition: {x: 6.1004148, y: 15.540384, z: -20.566225} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 930800601} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!108 &2135305921 Light: m_ObjectHideFlags: 0 @@ -2889,7 +2938,7 @@ Light: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 2135305919} m_Enabled: 1 - serializedVersion: 6 + serializedVersion: 8 m_Type: 1 m_Color: {r: 1, g: 1, b: 1, a: 1} m_Intensity: 1.3 @@ -2899,6 +2948,7 @@ Light: m_Shadows: m_Type: 2 m_Resolution: 3 + m_CustomResolution: -1 m_Strength: 0.56 m_Bias: 0.1 m_NormalBias: 0.4 @@ -2911,10 +2961,12 @@ Light: serializedVersion: 2 m_Bits: 4294967295 m_Lightmapping: 1 + m_AreaSize: {x: 1, y: 1} m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 m_ShadowRadius: 0 m_ShadowAngle: 0 - m_AreaSize: {x: 1, y: 1} --- !u!4 &2137966724 stripped Transform: m_PrefabParentObject: {fileID: 437898, guid: b4fd857376bb94265b47bcf5b50f67fa, type: 2} diff --git a/Source/Assets/TouchScript/Examples/Colors/Colors.unity b/Source/Assets/TouchScript/Examples/Colors/Colors.unity index ac905627a..cd5edaf6a 100644 --- a/Source/Assets/TouchScript/Examples/Colors/Colors.unity +++ b/Source/Assets/TouchScript/Examples/Colors/Colors.unity @@ -1,19 +1,19 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: --- !u!29 &1 -SceneSettings: +OcclusionCullingSettings: m_ObjectHideFlags: 0 - m_PVSData: - m_PVSObjectsArray: [] - m_PVSPortalsArray: [] + serializedVersion: 2 m_OcclusionBakeSettings: smallestOccluder: 5 smallestHole: 0.25 backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 - serializedVersion: 6 + serializedVersion: 8 m_Fog: 0 m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 @@ -25,6 +25,7 @@ RenderSettings: m_AmbientGroundColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} m_AmbientIntensity: 1 m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} m_SkyboxMaterial: {fileID: 2100000, guid: a07fadb24ea940240afba3afc1a692cc, type: 2} m_HaloStrength: 0.5 m_FlareStrength: 1 @@ -37,12 +38,12 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} --- !u!157 &4 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 6 + serializedVersion: 9 m_GIWorkflowMode: 1 - m_LightmapsMode: 1 m_GISettings: serializedVersion: 2 m_BounceScale: 1 @@ -53,51 +54,73 @@ LightmapSettings: m_EnableBakedLightmaps: 1 m_EnableRealtimeLightmaps: 0 m_LightmapEditorSettings: - serializedVersion: 3 + serializedVersion: 8 m_Resolution: 1 m_BakeResolution: 50 m_TextureWidth: 1024 m_TextureHeight: 1024 + m_AO: 0 m_AOMaxDistance: 1 - m_Padding: 2 m_CompAOExponent: 0 + m_CompAOExponentDirect: 0 + m_Padding: 2 m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 m_TextureCompression: 0 m_FinalGather: 0 + m_FinalGatherFiltering: 1 m_FinalGatherRayCount: 1024 m_ReflectionCompression: 2 + m_MixedBakeMode: 1 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVRFiltering: 0 + m_PVRFilteringMode: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousColorSigma: 1 + m_PVRFilteringAtrousNormalSigma: 1 + m_PVRFilteringAtrousPositionSigma: 1 m_LightingDataAsset: {fileID: 0} - m_RuntimeCPUUsage: 25 + m_ShadowMaskMode: 2 --- !u!196 &5 NavMeshSettings: serializedVersion: 2 m_ObjectHideFlags: 0 m_BuildSettings: serializedVersion: 2 + agentTypeID: 0 agentRadius: 0.5 agentHeight: 2 agentSlope: 45 agentClimb: 0.4 ledgeDropHeight: 0 maxJumpAcrossDistance: 0 - accuratePlacement: 0 minRegionArea: 2 - cellSize: 0.16666666 manualCellSize: 0 + cellSize: 0.16666666 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 m_NavMeshData: {fileID: 0} --- !u!1 &62216951 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 62216952} - - 20: {fileID: 62216957} - - 92: {fileID: 62216956} - - 124: {fileID: 62216955} - - 81: {fileID: 62216954} - - 114: {fileID: 62216953} + - component: {fileID: 62216952} + - component: {fileID: 62216957} + - component: {fileID: 62216956} + - component: {fileID: 62216955} + - component: {fileID: 62216954} + - component: {fileID: 62216953} m_Layer: 0 m_Name: Camera m_TagString: MainCamera @@ -114,10 +137,10 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: -10} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 930800601} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &62216953 MonoBehaviour: m_ObjectHideFlags: 0 @@ -130,6 +153,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Name: Camera + basicEditor: 1 advancedProps: 0 hitProps: 0 hit3DObjects: 0 @@ -191,6 +215,8 @@ Camera: m_TargetDisplay: 0 m_TargetEye: 3 m_HDR: 0 + m_AllowMSAA: 1 + m_ForceIntoRT: 0 m_OcclusionCulling: 1 m_StereoConvergence: 10 m_StereoSeparation: 0.022 @@ -200,9 +226,9 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 68250097} + - component: {fileID: 68250097} m_Layer: 0 m_Name: Container m_TagString: Untagged @@ -219,19 +245,19 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 930800601} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &250857269 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 250857271} - - 114: {fileID: 250857270} + - component: {fileID: 250857271} + - component: {fileID: 250857270} m_Layer: 5 m_Name: List m_TagString: Untagged @@ -259,6 +285,8 @@ MonoBehaviour: m_Spacing: 0 m_ChildForceExpandWidth: 1 m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 --- !u!224 &250857271 RectTransform: m_ObjectHideFlags: 0 @@ -268,12 +296,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1679844150} - {fileID: 602940323} m_Father: {fileID: 1981142013} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} @@ -286,6 +314,10 @@ Prefab: m_Modification: m_TransformParent: {fileID: 0} m_Modifications: + - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} + propertyPath: layers.Array.size + value: 1 + objectReference: {fileID: 0} - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: m_LocalPosition.x value: 0 @@ -330,10 +362,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 602940323} - - 114: {fileID: 602940324} + - component: {fileID: 602940323} + - component: {fileID: 602940324} m_Layer: 5 m_Name: Scale m_TagString: Untagged @@ -350,12 +382,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 2046579559} - {fileID: 1122129733} m_Father: {fileID: 250857271} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -384,11 +416,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 740851132} - - 223: {fileID: 740851135} - - 114: {fileID: 740851134} + - component: {fileID: 740851132} + - component: {fileID: 740851135} + - component: {fileID: 740851134} m_Layer: 5 m_Name: Canvas m_TagString: Untagged @@ -405,12 +437,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0, y: 0, z: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1981142013} - {fileID: 1552723601} m_Father: {fileID: 0} m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -444,7 +476,7 @@ Canvas: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 740851131} m_Enabled: 1 - serializedVersion: 2 + serializedVersion: 3 m_RenderMode: 0 m_Camera: {fileID: 0} m_PlaneDistance: 100 @@ -453,6 +485,7 @@ Canvas: m_OverrideSorting: 0 m_OverridePixelPerfect: 0 m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 m_SortingLayerID: 0 m_SortingOrder: 0 m_TargetDisplay: 0 @@ -461,10 +494,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 930800601} - - 114: {fileID: 930800602} + - component: {fileID: 930800601} + - component: {fileID: 930800602} m_Layer: 0 m_Name: Scene m_TagString: Untagged @@ -481,12 +514,12 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 62216952} - {fileID: 68250097} m_Father: {fileID: 0} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &930800602 MonoBehaviour: m_ObjectHideFlags: 0 @@ -505,12 +538,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1122129733} - - 222: {fileID: 1122129736} - - 114: {fileID: 1122129735} - - 114: {fileID: 1122129734} + - component: {fileID: 1122129733} + - component: {fileID: 1122129736} + - component: {fileID: 1122129735} + - component: {fileID: 1122129734} m_Layer: 5 m_Name: Text m_TagString: Untagged @@ -527,10 +560,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 602940323} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 196, y: 0} @@ -594,11 +627,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1138005900} - - 222: {fileID: 1138005902} - - 114: {fileID: 1138005901} + - component: {fileID: 1138005900} + - component: {fileID: 1138005902} + - component: {fileID: 1138005901} m_Layer: 5 m_Name: Image m_TagString: Untagged @@ -615,10 +648,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1679844150} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} @@ -662,12 +695,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1408280581} - - 222: {fileID: 1408280583} - - 114: {fileID: 1408280582} - - 114: {fileID: 1408280584} + - component: {fileID: 1408280581} + - component: {fileID: 1408280583} + - component: {fileID: 1408280582} + - component: {fileID: 1408280584} m_Layer: 5 m_Name: Text m_TagString: Untagged @@ -684,10 +717,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1679844150} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 196, y: 0} @@ -753,12 +786,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1552723601} - - 222: {fileID: 1552723603} - - 114: {fileID: 1552723602} - - 114: {fileID: 1552723604} + - component: {fileID: 1552723601} + - component: {fileID: 1552723603} + - component: {fileID: 1552723602} + - component: {fileID: 1552723604} m_Layer: 5 m_Name: Description m_TagString: Untagged @@ -775,10 +808,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 740851132} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 178, y: 78} @@ -849,10 +882,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1679844150} - - 114: {fileID: 1679844151} + - component: {fileID: 1679844150} + - component: {fileID: 1679844151} m_Layer: 5 m_Name: Drag m_TagString: Untagged @@ -869,12 +902,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1138005900} - {fileID: 1408280581} m_Father: {fileID: 250857271} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -903,10 +936,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 1764701050} - - 114: {fileID: 1764701049} + - component: {fileID: 1764701050} + - component: {fileID: 1764701049} m_Layer: 0 m_Name: EventSystem m_TagString: Untagged @@ -937,10 +970,10 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 0} m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &1772227325 Prefab: m_ObjectHideFlags: 0 @@ -968,9 +1001,9 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1981142013} + - component: {fileID: 1981142013} m_Layer: 5 m_Name: Panel m_TagString: Untagged @@ -987,11 +1020,11 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 250857271} m_Father: {fileID: 740851132} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0.25263783, y: 1} m_AnchoredPosition: {x: 5, y: 50} @@ -1002,11 +1035,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 2046579559} - - 222: {fileID: 2046579561} - - 114: {fileID: 2046579560} + - component: {fileID: 2046579559} + - component: {fileID: 2046579561} + - component: {fileID: 2046579560} m_Layer: 5 m_Name: Image m_TagString: Untagged @@ -1023,10 +1056,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 602940323} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} diff --git a/Source/Assets/TouchScript/Examples/Photos/Photos.unity b/Source/Assets/TouchScript/Examples/Photos/Photos.unity index 85b0bda33..225a82457 100644 --- a/Source/Assets/TouchScript/Examples/Photos/Photos.unity +++ b/Source/Assets/TouchScript/Examples/Photos/Photos.unity @@ -221,6 +221,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Name: Main Camera + basicEditor: 1 advancedProps: 0 hitProps: 0 hit3DObjects: 0 @@ -970,18 +971,18 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 OnStateChange: m_PersistentCalls: m_Calls: [] m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + basicEditor: 1 generalProps: 0 limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 - combinePointers: 0 - combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -1021,18 +1022,18 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 OnStateChange: m_PersistentCalls: m_Calls: [] m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + basicEditor: 1 generalProps: 0 limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 - combinePointers: 0 - combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -1601,18 +1602,18 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 OnStateChange: m_PersistentCalls: m_Calls: [] m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + basicEditor: 1 generalProps: 0 limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 - combinePointers: 0 - combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -1654,18 +1655,18 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 OnStateChange: m_PersistentCalls: m_Calls: [] m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + basicEditor: 1 generalProps: 0 limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 - combinePointers: 0 - combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -1858,18 +1859,18 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 OnStateChange: m_PersistentCalls: m_Calls: [] m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + basicEditor: 1 generalProps: 0 limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 - combinePointers: 0 - combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -1911,18 +1912,18 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 OnStateChange: m_PersistentCalls: m_Calls: [] m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + basicEditor: 1 generalProps: 0 limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 - combinePointers: 0 - combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -1990,6 +1991,10 @@ Prefab: m_Modification: m_TransformParent: {fileID: 0} m_Modifications: + - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} + propertyPath: layers.Array.size + value: 1 + objectReference: {fileID: 0} - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: m_LocalPosition.x value: 0 @@ -2820,18 +2825,18 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 OnStateChange: m_PersistentCalls: m_Calls: [] m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + basicEditor: 1 generalProps: 0 limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 - combinePointers: 0 - combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -2873,18 +2878,18 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 OnStateChange: m_PersistentCalls: m_Calls: [] m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + basicEditor: 1 generalProps: 0 limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 - combinePointers: 0 - combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -3365,7 +3370,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.30900002, y: 0} m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: -0.13402176, y: -21.099998} + m_AnchoredPosition: {x: -0.13402176, y: -21.09999} m_SizeDelta: {x: -0.26796, y: 29.8} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1027187499 @@ -4358,7 +4363,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 156, y: 48.3} + m_AnchoredPosition: {x: 156, y: 48.300003} m_SizeDelta: {x: 276, y: 68.5} m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &1423800607 @@ -4692,18 +4697,18 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 OnStateChange: m_PersistentCalls: m_Calls: [] m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + basicEditor: 1 generalProps: 0 limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 - combinePointers: 0 - combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -4745,18 +4750,18 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 OnStateChange: m_PersistentCalls: m_Calls: [] m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + basicEditor: 1 generalProps: 0 limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 - combinePointers: 0 - combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -5497,18 +5502,18 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 OnStateChange: m_PersistentCalls: m_Calls: [] m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + basicEditor: 1 generalProps: 0 limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 - combinePointers: 0 - combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -5550,18 +5555,18 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 OnStateChange: m_PersistentCalls: m_Calls: [] m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + basicEditor: 1 generalProps: 0 limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 - combinePointers: 0 - combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} diff --git a/Source/Assets/TouchScript/Examples/Portal/Portal.unity b/Source/Assets/TouchScript/Examples/Portal/Portal.unity index e59693e1f..c07cc2bdb 100644 --- a/Source/Assets/TouchScript/Examples/Portal/Portal.unity +++ b/Source/Assets/TouchScript/Examples/Portal/Portal.unity @@ -154,6 +154,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Name: Camera + basicEditor: 1 advancedProps: 0 hitProps: 0 hit3DObjects: 1 @@ -384,6 +385,10 @@ Prefab: m_Modification: m_TransformParent: {fileID: 0} m_Modifications: + - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} + propertyPath: layers.Array.size + value: 1 + objectReference: {fileID: 0} - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: m_LocalPosition.x value: 0 @@ -490,13 +495,12 @@ MonoBehaviour: m_Calls: [] m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + basicEditor: 1 generalProps: 0 limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 - combinePointers: 0 - combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -1042,13 +1046,12 @@ MonoBehaviour: m_Calls: [] m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + basicEditor: 1 generalProps: 0 limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 - combinePointers: 0 - combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -1344,13 +1347,12 @@ MonoBehaviour: m_Calls: [] m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + basicEditor: 1 generalProps: 0 limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 - combinePointers: 0 - combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -1787,13 +1789,12 @@ MonoBehaviour: m_Calls: [] m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + basicEditor: 1 generalProps: 0 limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 - combinePointers: 0 - combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} diff --git a/Source/Assets/TouchScript/Examples/Taps/Taps.unity b/Source/Assets/TouchScript/Examples/Taps/Taps.unity index 14ab6aaa6..15ffc54b7 100644 --- a/Source/Assets/TouchScript/Examples/Taps/Taps.unity +++ b/Source/Assets/TouchScript/Examples/Taps/Taps.unity @@ -153,6 +153,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Name: Scene Camera + basicEditor: 1 advancedProps: 0 hitProps: 0 hit3DObjects: 1 @@ -454,6 +455,10 @@ Prefab: m_Modification: m_TransformParent: {fileID: 0} m_Modifications: + - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} + propertyPath: layers.Array.size + value: 1 + objectReference: {fileID: 0} - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: m_LocalPosition.x value: 0 @@ -512,18 +517,18 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 7a878a6ff128243dfb1d89ca0273f059, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 OnStateChange: m_PersistentCalls: m_Calls: [] m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + basicEditor: 1 generalProps: 0 limitsProps: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 - combinePointers: 0 - combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -539,6 +544,8 @@ MonoBehaviour: numberOfTapsRequired: 2 timeLimit: Infinity distanceLimit: Infinity + combinePointers: 0 + combinePointersInterval: 0.3 --- !u!114 &584553679 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs index 896445cea..143703920 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs @@ -100,10 +100,7 @@ public uint CursorPixelSize #region Private variables [SerializeField] - private bool generalProps; // Used in the custom inspector - - [SerializeField] - private bool advancedProps; // Used in the custom inspector + private bool cursorsProps; // Used in the custom inspector [SerializeField] private PointerCursor mouseCursor; diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs index e42753177..970b86cbb 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs @@ -107,11 +107,11 @@ public bool AllowChangingFromOutside set { allowChangingFromOutside = value; } } - #endregion + #endregion - #region Private variables + #region Private variables - [SerializeField] + [SerializeField] [ToggleLeft] private bool enableSmoothing = false; diff --git a/Source/Assets/TouchScript/Scripts/Core.meta b/Source/Assets/TouchScript/Scripts/Core.meta new file mode 100644 index 000000000..515de20f1 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Core.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: bb470f21b40fb46658df225e066112a2 +folderAsset: yes +timeCreated: 1500961062 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/DebuggableMonoBehaviour.cs b/Source/Assets/TouchScript/Scripts/Core/DebuggableMonoBehaviour.cs similarity index 96% rename from Source/Assets/TouchScript/Scripts/DebuggableMonoBehaviour.cs rename to Source/Assets/TouchScript/Scripts/Core/DebuggableMonoBehaviour.cs index ba763d0c0..61bd36e44 100644 --- a/Source/Assets/TouchScript/Scripts/DebuggableMonoBehaviour.cs +++ b/Source/Assets/TouchScript/Scripts/Core/DebuggableMonoBehaviour.cs @@ -7,7 +7,7 @@ #endif using UnityEngine; -namespace TouchScript +namespace TouchScript.Core { /// /// A debuggable component. When built with TOUCHSCRIPT_DEBUG define has a checkbox to turn debug information on and off. diff --git a/Source/Assets/TouchScript/Scripts/DebuggableMonoBehaviour.cs.meta b/Source/Assets/TouchScript/Scripts/Core/DebuggableMonoBehaviour.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/DebuggableMonoBehaviour.cs.meta rename to Source/Assets/TouchScript/Scripts/Core/DebuggableMonoBehaviour.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs b/Source/Assets/TouchScript/Scripts/Core/GestureManagerInstance.cs similarity index 99% rename from Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs rename to Source/Assets/TouchScript/Scripts/Core/GestureManagerInstance.cs index 0f1028591..44557b306 100644 --- a/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/Core/GestureManagerInstance.cs @@ -9,7 +9,7 @@ using TouchScript.Pointers; using UnityEngine; -namespace TouchScript +namespace TouchScript.Core { /// /// Internal implementation of . diff --git a/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs.meta b/Source/Assets/TouchScript/Scripts/Core/GestureManagerInstance.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs.meta rename to Source/Assets/TouchScript/Scripts/Core/GestureManagerInstance.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/LayerManagerInstance.cs b/Source/Assets/TouchScript/Scripts/Core/LayerManagerInstance.cs similarity index 99% rename from Source/Assets/TouchScript/Scripts/LayerManagerInstance.cs rename to Source/Assets/TouchScript/Scripts/Core/LayerManagerInstance.cs index 00a50fe4b..5c78e6303 100644 --- a/Source/Assets/TouchScript/Scripts/LayerManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/Core/LayerManagerInstance.cs @@ -9,7 +9,7 @@ using TouchScript.Pointers; using UnityEngine; -namespace TouchScript +namespace TouchScript.Core { /// /// Internal implementation of . diff --git a/Source/Assets/TouchScript/Scripts/LayerManagerInstance.cs.meta b/Source/Assets/TouchScript/Scripts/Core/LayerManagerInstance.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/LayerManagerInstance.cs.meta rename to Source/Assets/TouchScript/Scripts/Core/LayerManagerInstance.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/Core/TouchManagerInstance.cs similarity index 99% rename from Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs rename to Source/Assets/TouchScript/Scripts/Core/TouchManagerInstance.cs index ac67f812c..a998d0cce 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/Core/TouchManagerInstance.cs @@ -13,6 +13,7 @@ using TouchScript.Pointers; using UnityEngine; using UnityEngine.Profiling; +using TouchScript.Core; #if TOUCHSCRIPT_DEBUG using TouchScript.Debugging.GL; using TouchScript.Debugging.Loggers; @@ -21,7 +22,7 @@ using UnityEngine.SceneManagement; #endif -namespace TouchScript +namespace TouchScript.Core { /// /// Default implementation of . diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs.meta b/Source/Assets/TouchScript/Scripts/Core/TouchManagerInstance.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs.meta rename to Source/Assets/TouchScript/Scripts/Core/TouchManagerInstance.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/GestureManager.cs b/Source/Assets/TouchScript/Scripts/GestureManager.cs index c5f46e8f7..bbd7996e1 100644 --- a/Source/Assets/TouchScript/Scripts/GestureManager.cs +++ b/Source/Assets/TouchScript/Scripts/GestureManager.cs @@ -2,6 +2,7 @@ * @author Valentin Simonov / http://va.lent.in/ */ +using TouchScript.Core; using UnityEngine; namespace TouchScript diff --git a/Source/Assets/TouchScript/Scripts/Gestures/FlickGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/FlickGesture.cs index 40cae9a69..ec70b3d05 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/FlickGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/FlickGesture.cs @@ -149,6 +149,12 @@ protected void LateUpdate() deltaSequence.Add(ScreenPosition - PreviousScreenPosition); } + [ContextMenu("Basic Editor")] + private void switchToBasicEditor() + { + basicEditor = true; + } + #endregion #region Gesture callbacks diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs index 4032ca4e4..ec4bf0180 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs @@ -11,6 +11,7 @@ using TouchScript.Pointers; using UnityEngine; using UnityEngine.Events; +using TouchScript.Core; namespace TouchScript.Gestures { @@ -436,16 +437,27 @@ protected IGestureManager gestureManager /// protected Transform cachedTransform; +#pragma warning disable CS0414 + + [SerializeField] + [HideInInspector] + protected bool basicEditor = true; + [SerializeField] + [HideInInspector] private bool generalProps; // Used in the custom inspector [SerializeField] + [HideInInspector] private bool limitsProps; // Used in the custom inspector [SerializeField] + [HideInInspector] private bool advancedProps; // Used in the custom inspector - [SerializeField] +#pragma warning restore CS0414 + + [SerializeField] private int minPointers = 0; [SerializeField] diff --git a/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs index 877767e30..d0c33d839 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs @@ -99,6 +99,12 @@ protected override void OnEnable() distanceLimitInPixelsSquared = Mathf.Pow(distanceLimit * touchManager.DotsPerCentimeter, 2); } + [ContextMenu("Basic Editor")] + private void switchToBasicEditor() + { + basicEditor = true; + } + #endregion #region Gesture callbacks diff --git a/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs index 379f19c2a..c8e2c8bfb 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs @@ -85,12 +85,22 @@ public event EventHandler PointerCancelled pointerReleasedInvoker, pointerCancelledInvoker; - #endregion + #endregion - #region Gesture callbacks + #region Unity - /// - protected override void pointersPressed(IList pointers) + [ContextMenu("Basic Editor")] + private void switchToBasicEditor() + { + basicEditor = true; + } + + #endregion + + #region Gesture callbacks + + /// + protected override void pointersPressed(IList pointers) { base.pointersPressed(pointers); diff --git a/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs index 0cd866a1d..d25621db5 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs @@ -71,6 +71,16 @@ public bool IgnoreChildren [ToggleLeft] private bool ignoreChildren = false; + #endregion + + #region Unity + + [ContextMenu("Basic Editor")] + private void switchToBasicEditor() + { + basicEditor = true; + } + #endregion #region Gesture callbacks diff --git a/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs index 6271252d7..65d86d30c 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs @@ -66,12 +66,22 @@ public bool IgnoreChildren [ToggleLeft] private bool ignoreChildren = false; - #endregion + #endregion - #region Gesture callbacks + #region Unity - /// - public override bool ShouldReceivePointer(Pointer pointer) + [ContextMenu("Basic Editor")] + private void switchToBasicEditor() + { + basicEditor = true; + } + + #endregion + + #region Gesture callbacks + + /// + public override bool ShouldReceivePointer(Pointer pointer) { if (!IgnoreChildren) return base.ShouldReceivePointer(pointer); if (!base.ShouldReceivePointer(pointer)) return false; diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs index ed4f702fb..5dbd831a4 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs @@ -166,6 +166,12 @@ protected override void OnEnable() distanceLimitInPixelsSquared = Mathf.Pow(distanceLimit * touchManager.DotsPerCentimeter, 2); } + [ContextMenu("Basic Editor")] + private void switchToBasicEditor() + { + basicEditor = true; + } + #endregion #region Gesture callbacks diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs index 54a8bf645..240d369e8 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs @@ -110,6 +110,12 @@ protected override void OnEnable() updateProjectionPlane(); } + [ContextMenu("Basic Editor")] + private void switchToBasicEditor() + { + basicEditor = true; + } + #endregion #region Gesture callbacks diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/ScreenTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/ScreenTransformGesture.cs index f357b5e60..f4edaf962 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/ScreenTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/ScreenTransformGesture.cs @@ -20,7 +20,13 @@ namespace TouchScript.Gestures.TransformGestures [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Gestures_ScreenTransformGesture.htm")] public class ScreenTransformGesture : TwoPointTransformGestureBase { - #region Public methods + #region Unity + + [ContextMenu("Basic Editor")] + private void switchToBasicEditor() + { + basicEditor = true; + } #endregion diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs index 7f0fb56a1..483e8cc7e 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs @@ -162,6 +162,12 @@ protected override void OnEnable() updateProjectionPlane(); } + [ContextMenu("Basic Editor")] + private void switchToBasicEditor() + { + basicEditor = true; + } + #endregion #region Gesture callbacks diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs index 98c04b0a9..7d7222327 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs @@ -3,6 +3,7 @@ */ using System; +using TouchScript.Core; using TouchScript.Pointers; using UnityEngine; @@ -37,15 +38,19 @@ public ICoordinatesRemapper CoordinatesRemapper } } - #endregion + #endregion + + #region Private variables - #region Private variables +#pragma warning disable CS0414 - [SerializeField] + [SerializeField] [HideInInspector] - private bool advancedProps; // is used to save whether advanced properties are opened or closed + protected bool basicEditor = true; + +#pragma warning restore CS0414 - private ICoordinatesRemapper coordinatesRemapper; + private ICoordinatesRemapper coordinatesRemapper; private TouchManagerInstance manager; #endregion diff --git a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs index 6ff47c055..64e38e5f2 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs @@ -145,13 +145,23 @@ public bool EmulateSecondMousePointer private static StandardInput instance; - [SerializeField] +#pragma warning disable CS0414 + + [SerializeField] + [HideInInspector] private bool generalProps; // Used in the custom inspector [SerializeField] + [HideInInspector] private bool windowsProps; // Used in the custom inspector - [SerializeField] + [SerializeField] + [HideInInspector] + private bool webglProps; // Used in the custom inspector + +#pragma warning restore CS0414 + + [SerializeField] private Windows8APIType windows8API = Windows8APIType.Windows8; [SerializeField] @@ -351,6 +361,12 @@ protected override void OnDisable() base.OnDisable(); } + [ContextMenu("Basic Editor")] + private void switchToBasicEditor() + { + basicEditor = true; + } + #endregion #region Protected methods diff --git a/Source/Assets/TouchScript/Scripts/LayerManager.cs b/Source/Assets/TouchScript/Scripts/LayerManager.cs index e1bc5cf0e..f0d4bff5f 100644 --- a/Source/Assets/TouchScript/Scripts/LayerManager.cs +++ b/Source/Assets/TouchScript/Scripts/LayerManager.cs @@ -2,6 +2,7 @@ * @author Valentin Simonov / http://va.lent.in/ */ +using TouchScript.Core; using UnityEngine; namespace TouchScript diff --git a/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs index 5df151de7..e482c3478 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs @@ -125,10 +125,20 @@ public override Vector3 WorldProjectionNormal #endif private static RaycastHit2D[] raycastHits2D = new RaycastHit2D[20]; - [SerializeField] +#pragma warning disable CS0414 + + [SerializeField] + [HideInInspector] + private bool basicEditor = true; + + [SerializeField] + [HideInInspector] private bool advancedProps; // is used to save if advanced properties are opened or closed - [SerializeField] +#pragma warning restore CS0414 + + [SerializeField] + [HideInInspector] private bool hitProps; [SerializeField] @@ -258,6 +268,12 @@ private void OnDisable() if (TouchManager.Instance != null) TouchManager.Instance.FrameStarted -= frameStartedHandler; } + [ContextMenu("Basic Editor")] + private void switchToBasicEditor() + { + basicEditor = true; + } + #endregion #region Protected functions diff --git a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs index 2e3d97550..8ce785202 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs @@ -4,6 +4,7 @@ using System; using System.Text; +using TouchScript.Core; using TouchScript.Hit; using TouchScript.InputSources; using TouchScript.Layers; diff --git a/Source/Assets/TouchScript/Scripts/TouchManager.cs b/Source/Assets/TouchScript/Scripts/TouchManager.cs index b5b864e7b..c82434b4a 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManager.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManager.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; +using TouchScript.Core; using TouchScript.Devices.Display; using TouchScript.Layers; using TouchScript.Pointers; @@ -15,7 +16,7 @@ namespace TouchScript { /// - /// A façade object to configure and hold parameters for an instance of . Contains constants used throughout the library. + /// A facade object to configure and hold parameters for an instance of . Contains constants used throughout the library. /// /// /// @@ -369,10 +370,15 @@ public static bool IsInvalidPosition(Vector2 position) #region Private variables - [SerializeField] - private bool advancedProps; // is used to save if advanced properties are opened or closed + #pragma warning disable CS0414 [SerializeField] + [HideInInspector] + private bool basicEditor = true; + + #pragma warning restore CS0414 + + [SerializeField] private Object displayDevice; [SerializeField] @@ -389,7 +395,8 @@ public static bool IsInvalidPosition(Vector2 position) [SerializeField] private MessageType sendMessageEvents = MessageType.PointersPressed | MessageType.PointersCancelled | - MessageType.PointersReleased | MessageType.PointersUpdated; + MessageType.PointersReleased | MessageType.PointersUpdated | + MessageType.PointersAdded | MessageType.PointersRemoved; [SerializeField] private GameObject sendMessageTarget; @@ -434,6 +441,12 @@ private void OnDisable() removeUnityEventsSubscriptions(); } + [ContextMenu("Basic Editor")] + private void switchToBasicEditor() + { + basicEditor = true; + } + #endregion #region Private functions From 6aa37cefad61068215fece8d4d36879a1486ed57 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 25 Jul 2017 16:43:31 +0300 Subject: [PATCH 37/58] Made TransformGesture editors prettier. --- .../Visualizer/CursorManagerEditor.cs | 81 ------------- .../Visualizer/CursorManagerEditor.cs.meta | 12 -- .../Editor/EditorResources/Icons.meta | 9 ++ .../Editor/EditorResources/Icons/selector.png | Bin 0 -> 133 bytes .../EditorResources/Icons/selector.png.meta | 76 +++++++++++++ .../Editor/EditorResources/Icons/unknown.png | Bin 0 -> 2541 bytes .../EditorResources/Icons/unknown.png.meta | 76 +++++++++++++ .../Editor/EditorResources/Icons/xy.png | Bin 0 -> 2576 bytes .../Editor/EditorResources/Icons/xy.png.meta | 76 +++++++++++++ .../Editor/EditorResources/Icons/xz.png | Bin 0 -> 2555 bytes .../Editor/EditorResources/Icons/xz.png.meta | 76 +++++++++++++ .../Editor/EditorResources/Icons/yz.png | Bin 0 -> 2543 bytes .../Editor/EditorResources/Icons/yz.png.meta | 76 +++++++++++++ .../Editor/EditorUI/GUIElements.cs | 18 +-- .../Editor/Gestures/FlickGestureEditor.cs | 2 +- .../Editor/Gestures/GestureEditor.cs | 6 +- .../Editor/Gestures/LongPressGestureEditor.cs | 2 +- .../Editor/Gestures/MetaGestureEditor.cs | 2 +- .../Editor/Gestures/PressGestureEditor.cs | 2 +- .../Editor/Gestures/ReleaseGestureEditor.cs | 2 +- .../Editor/Gestures/TapGestureEditor.cs | 2 +- .../OnePointTransformGestureBaseEditor.cs | 53 +++++---- .../Base/TransformGestureBaseEditor.cs | 107 +++++++++++++++++- .../TwoPointTransformGestureBaseEditor.cs | 57 +++++----- .../PinnedTransformGestureEditor.cs | 25 +--- .../ScreenTransformGestureEditor.cs | 2 +- .../TransformGestureEditor.cs | 24 +--- .../InputSources/StandardInputEditor.cs | 2 +- .../Editor/Layers/StandardLayerEditor.cs | 2 +- .../TouchScript/Editor/TouchManagerEditor.cs | 2 +- .../Examples/Checkers/Checkers.unity | 13 --- Source/ProjectSettings/ProjectSettings.asset | 2 +- 32 files changed, 584 insertions(+), 223 deletions(-) delete mode 100644 Source/Assets/TouchScript/Editor/Behaviors/Visualizer/CursorManagerEditor.cs delete mode 100644 Source/Assets/TouchScript/Editor/Behaviors/Visualizer/CursorManagerEditor.cs.meta create mode 100644 Source/Assets/TouchScript/Editor/EditorResources/Icons.meta create mode 100644 Source/Assets/TouchScript/Editor/EditorResources/Icons/selector.png create mode 100644 Source/Assets/TouchScript/Editor/EditorResources/Icons/selector.png.meta create mode 100644 Source/Assets/TouchScript/Editor/EditorResources/Icons/unknown.png create mode 100644 Source/Assets/TouchScript/Editor/EditorResources/Icons/unknown.png.meta create mode 100644 Source/Assets/TouchScript/Editor/EditorResources/Icons/xy.png create mode 100644 Source/Assets/TouchScript/Editor/EditorResources/Icons/xy.png.meta create mode 100644 Source/Assets/TouchScript/Editor/EditorResources/Icons/xz.png create mode 100644 Source/Assets/TouchScript/Editor/EditorResources/Icons/xz.png.meta create mode 100644 Source/Assets/TouchScript/Editor/EditorResources/Icons/yz.png create mode 100644 Source/Assets/TouchScript/Editor/EditorResources/Icons/yz.png.meta diff --git a/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/CursorManagerEditor.cs b/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/CursorManagerEditor.cs deleted file mode 100644 index 88cd877fa..000000000 --- a/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/CursorManagerEditor.cs +++ /dev/null @@ -1,81 +0,0 @@ -/* - * @author Valentin Simonov / http://va.lent.in/ - */ - -using TouchScript.Behaviors.Cursors; -using UnityEditor; -using UnityEngine; -using TouchScript.Editor.EditorUI; - -namespace TouchScript.Editor.Behaviors.Visualizer -{ - - [CustomEditor(typeof(CursorManager))] - internal sealed class CursorManagerEditor : UnityEditor.Editor - { - - public static readonly GUIContent TEXT_DPI_HEADER = new GUIContent("Use DPI", "Scale touch pointer based on DPI."); - public static readonly GUIContent TEXT_ADVANCED_HEADER = new GUIContent("Advanced", "Advanced settings."); - public static readonly GUIContent TEXT_POINTER_SIZE = new GUIContent("Pointer size (cm)", "Pointer size in cm based on current DPI."); - public static readonly GUIContent TEXT_POINTER_PIXEL_SIZE = new GUIContent("Pointer size (px)", "Pointer size in pixels."); - - private SerializedProperty mousePointerProxy, touchPointerProxy, penPointerProxy, objectPointerProxy; - private SerializedProperty useDPI, cursorSize, cursorPixelSize; - private SerializedProperty advancedProps; - - private void OnEnable() - { - mousePointerProxy = serializedObject.FindProperty("mouseCursor"); - touchPointerProxy = serializedObject.FindProperty("touchCursor"); - penPointerProxy = serializedObject.FindProperty("penCursor"); - objectPointerProxy = serializedObject.FindProperty("objectCursor"); - - useDPI = serializedObject.FindProperty("useDPI"); - cursorSize = serializedObject.FindProperty("cursorSize"); - cursorPixelSize = serializedObject.FindProperty("cursorPixelSize"); - - advancedProps = serializedObject.FindProperty("advancedProps"); - } - - public override void OnInspectorGUI() - { - serializedObject.Update(); - - GUILayout.Space(5); - - // var display = GUIElements.Header(TEXT_DPI_HEADER, useDPI, useDPI); - // if (display) - // { - // EditorGUI.indentLevel++; - // using (new EditorGUI.DisabledGroupScope(!useDPI.boolValue)) - // { - // EditorGUILayout.PropertyField(useDPI, TEXT_DPI_HEADER); - // } - // EditorGUI.indentLevel--; - // } - - EditorGUILayout.PropertyField(useDPI, TEXT_DPI_HEADER); - if (useDPI.boolValue) - { - EditorGUILayout.PropertyField(cursorSize, TEXT_POINTER_SIZE); - } - else - { - EditorGUILayout.PropertyField(cursorPixelSize, TEXT_POINTER_PIXEL_SIZE); - } - - var display = GUIElements.Header(TEXT_ADVANCED_HEADER, advancedProps); - if (display) - { - EditorGUI.indentLevel++; - EditorGUILayout.PropertyField(mousePointerProxy, new GUIContent("Mouse Pointer Proxy")); - EditorGUILayout.PropertyField(touchPointerProxy, new GUIContent("Touch Pointer Proxy")); - EditorGUILayout.PropertyField(penPointerProxy, new GUIContent("Pen Pointer Proxy")); - EditorGUILayout.PropertyField(objectPointerProxy, new GUIContent("Object Pointer Proxy")); - EditorGUI.indentLevel--; - } - - serializedObject.ApplyModifiedProperties(); - } - } -} diff --git a/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/CursorManagerEditor.cs.meta b/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/CursorManagerEditor.cs.meta deleted file mode 100644 index 0a91081c1..000000000 --- a/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/CursorManagerEditor.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 77945c600a4314a6bb5c7cc758b42194 -timeCreated: 1447582130 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Source/Assets/TouchScript/Editor/EditorResources/Icons.meta b/Source/Assets/TouchScript/Editor/EditorResources/Icons.meta new file mode 100644 index 000000000..acc16807b --- /dev/null +++ b/Source/Assets/TouchScript/Editor/EditorResources/Icons.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 375fcf571e23249898d00c0d11ffbf93 +folderAsset: yes +timeCreated: 1500984768 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Editor/EditorResources/Icons/selector.png b/Source/Assets/TouchScript/Editor/EditorResources/Icons/selector.png new file mode 100644 index 0000000000000000000000000000000000000000..3eb285fa8d023b1a462b67b201e9ab5f308b1c28 GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^IzX({+P)NYcDNaTO*>NO&cTH-W#vCNn4_A z(!{hihL+rx)LL4s(A3nMTd7hnr3SIU4Akgy|1t7D9f2`o#nY118( z*PiQe!!QVoA)z0lg+^(0-YK;tF`nQ^_Q*#zU9;({0YTgftaI90(nTQ9Z|{c-1GYSi ziIWo)P8Kjc19btzlqOw`T^}z+O7zzCE>08^NFgWLgoK#d##1qrkf8rYz=mlMRzj+| zD#8<(risvkbB$y<$+5a)?R%Q{+yb!U(jE7r!PMp?J1r!hiehUQg?wkU=L6PSqYOnt zCrFK_5C{z0z`(!|lcz8QwbfeowC=elv_b$nS~@;z%|Pb>Zp_7w*eI>gXAC!R8LS;l?QGe3&zb9Y&f57oCvZ+V0F6Q-w1K4@ zBx-8L|FysZfkGiY$;h!026qnPlpPXQf@l~eDo@RHkY*@0WVY^W{Y2Y9TL-}019QJ) zo-iK^A_1{5MpQXXZWl}LK)RpRnAK3lCwu|x?v2L6VhR&a$B{ZjAPGZ(ZC40_NV=n=<==XG>TfxCaONjw z&mQhuz54KzK@i3FO`dw{T>$@u9GsX#wNRy6sA9)#q%SeFK_CJuMg{SwOp-!UHp{2h z356{@OyOX763;V8CM7@l$()Vbx6i))%p+E;`282APY-opUkulMmmWS-!VoB_D2BH#MfWvgC%@$$P*n>tRw%9Z>6vs$$Y zLxEwOy`!8J*l`?$5R}VhwAO!q=XoB!?}GudDk+VXNXC;8oRb&Jk&L~O#4kC_oHI%` zGr_ubH>}^W80;O*PDfANVYo_HJ} z7K;ten>Vkiqod>Q_3PJvAE2?Z@!0a^%dd~e;{%1U0_KoOra3e9-X}DM0j1$2b?E}T z_ch)2qo)@>C#6MAO|i6c<+hvJ+WKGV@6Rx88Uu+07)FF>^!)95N*&&~apRYPvDApvbFucpZdW~&q--fUq9OO&_mD9oIQK+mEPVgVQ5mRn3PHeAdyl{ns4jjhK7dO zt5&T#o=&Gf_{=lUkV>UaRw|XbOO`Cb^So66EiEm>vu4erCR&5x8YrbO-tz7B+2VM( z+hy&KuYPt{NApsE>#jTe^JU9^yQEOC8F({=5E^BgXmP4dTagIbQs^K6A&|k;eyhG!O;lmtj0%SP=!bo zVh)9#!&C!}l}sYE#*M|^9(eKM#cbHHA?Y~IwzX^5-sdGlo(Z2As`inK^T2q^_)ipS$&C0W6+49t=bx(pcfr6ySY4aJqa;cJJtv#0Lr&d>bUFXqkkPHMF` zPm>oC%MD_uqNrkkJDx*UB;rs9rSd2$mBEz~)3Px1+3WC>q}#uLKOG$%^ZWYxZtLpm znpG?oab1_8p`n|*ySrCODKn;NB1{9VG-(y1(aKP7CaH^L`OyBxp0=Iv!;!D?`!F-( zvrm8N+ihEayCB0L&M-^_{s<1E8W*zv*}2C`(uS{cAr@; z<7kZ*g7H)eE1$1%M~jUJ8!=EfzgXE?iE1WtFJD-dHwpm3pZ?d{h}jB{=H(`R5BTR&hFi-G0jY+ zrUoI;-ay{@<>vyVg+K#dsf1H56IzykX#V^sd#=C!$;Qsk4>k4n-gil7=kn~(PZ^|pwYF}%bl0wx-5>t&4O`Z%`J|x~wP%68pg)ek7TyX&QYTIjA0B47rDf-i zTW(qTe=Anh{%+Bt&ll3^p4wcl_0nCtRsvkQefyGyU;p|~#~T{(Yis}Uz-NLBAezsU z9vVU@RqknP`|dC9xTEzq%a?!YOxrmxy|nDcHEUj~rc(br;7JNYY$1p?Hd4CrMjX>T z0)!(C4R02r(W5|r>(;IRa@pgL|Ia^#?>)VzzoY&Ln9z$Ze@j%t00000NkvXXu0mjf Dj5P;G literal 0 HcmV?d00001 diff --git a/Source/Assets/TouchScript/Editor/EditorResources/Icons/unknown.png.meta b/Source/Assets/TouchScript/Editor/EditorResources/Icons/unknown.png.meta new file mode 100644 index 000000000..cc814c2da --- /dev/null +++ b/Source/Assets/TouchScript/Editor/EditorResources/Icons/unknown.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 29c2d4978005b4ea68d2f3ecbd258ffd +timeCreated: 1500987331 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Editor/EditorResources/Icons/xy.png b/Source/Assets/TouchScript/Editor/EditorResources/Icons/xy.png new file mode 100644 index 0000000000000000000000000000000000000000..e0ee77109bc5c8eb49e7356d83ce6e4fd5aa29eb GIT binary patch literal 2576 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 RL*)Pf002ovPDHLkV1iB{u|fa< literal 0 HcmV?d00001 diff --git a/Source/Assets/TouchScript/Editor/EditorResources/Icons/xz.png.meta b/Source/Assets/TouchScript/Editor/EditorResources/Icons/xz.png.meta new file mode 100644 index 000000000..747e5b64b --- /dev/null +++ b/Source/Assets/TouchScript/Editor/EditorResources/Icons/xz.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: a8bb65c0cb8d14e93baa4c3403e83181 +timeCreated: 1500984768 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Editor/EditorResources/Icons/yz.png b/Source/Assets/TouchScript/Editor/EditorResources/Icons/yz.png new file mode 100644 index 0000000000000000000000000000000000000000..b38c8a412d7099b8c16daa2275af4bdf38255165 GIT binary patch literal 2543 zcmV!52RX=+99F>T8mmAP)3exEAwNtd9 zW$ILM9ISPGFj}eU$VinC6{MsZAS66gHX%HA69UO5o9ynrzk7eb{;?5-@V2%8@SQm` zclO@jJ)b?lbI&n_m2nTHx6qZ z_JXb1AS&xZ5de%s_Xw!Z20FvoQC$w(RS1S$q*4sYq>f0W8?M`lWRid}g16q9d#sO> zIhRVpB`!GSu!sf588oJy)HvfPN*7^o(cWubx%!nAoN@S-zxTclrCj8@2F6FmV^aPk z6d40xyAIUZg!iPt1b_sP0=9&j-uTFk3*8vxhumUWD=sJ2O#E?Kylfi)jBgmX%oj74 z_XKPVh)Hcf$9yz@u$bG z!kX8{AjeRMgdIR|*xW`i6YN^BWkF?WXX!xzn6`IX^~|QZRld%4K=@F+ukrRN&pr1M zd*&HJe!m26v)Ql|V`W zZ>$`L=Ee|a-@65--$pvaktgzyOLEbvcjf>Iq zffW$Q@poY3`av*qT+F?{7Q*2WN+8YBN5A~e{BWJGwFNVtU$P^8L8cdeQ{ zxpDK(ofyn?>epWE*t99XUs%zoG+IcN4eki4&)YrlJruw7=kp$GE*+o#G zl7c7zM1n$rW_dt}ga-kWSumL&DKFK#UQqz3zGuz?aiHR_;oa|}Xk#^OU020gS98@x z6~;@O=RUoqGO`c=rcbZ`OG`^|)R-}c)|Qlr%okroU>GOwfPH{_jGjS$&);rHBS|HN z=5aV&6idx@q@u3!7zj~PDWY7DPy*T+(1OS~87O=m7MF839k9`E_>dDCijl$HZPC3K z1Qz_`iH6VjMoIzTrkgfBI(v4*5>1Q1b+w#BhYDa>r{35;z<$gBT69=+9B<;~LtBT& z>Lza6-I)u``fO_b{&fEv(bylHr+Yk)sl9tU_DSp+O+6EwXj$N1X+royhYusB4~PA; za=iC3o4K<3+KLo%5e_EXe|qP~H;)(*t7>e_M_Cz#Ww8`vK5%~O`Jzt_&uo~v#PK=) z?L)WU-jd%ka9=oHe)+Dc>!ui)CkK>lc&MUc&0S?>ogGT){>v_luJT+P-Dw*h@s61d z2=_FDa}@Y8cz?}^-#z=rthZCh#i&vHH$JfF-H~NwZB@<9d5{vYZHi2WKuQmuCy%ky zMtDke%9_EggLhVrsr==(0o!I%MQ~f~tY0;JzozZM5sA(H3Qbg2_Fp-9@}W(SKfdpY z*7z{A+XvB+aI(O?A7HjxbFHJ z4>9Ip*|L9LxoxY4g9qC|!%6rw3UpI|XPs>Q*N~f6J~?&yKAT>m>#n-vj_Ns=UfQ(k zz<~(b+6)AP*-Ai&1m`|5Mi7g|pcH{&7}*)cG*1tl3??!0$i&@aTgEnQ@4x**5~WM) z`qyI4=u+IXaO_LX%~t-4FRmWc(sDq2@PP#)O_YvOC>%_I9v5uTPKl2%!8><9wg{jI z1X9g+-L-!DuwiXG;_(Ow@laIM4WG{er4Bf^kxYh=N-@M@`(YR+g25m-=Vu0NPy<}& zu&5ORfX(`*OnE^7ufKTJZL9xYHm{(d8@09C4Rv*s^9u{@mQf?)FJwA&q{9-{fGAQA z|FIB%xEBC$(M5Ycz4g}Wi*s{rB$GJ^g^qwy2Zq7mI1Z%Dw*6$X9h`F*h6!EQ!8r$G z?0B>j11qKAPzNMKKBYG49_SBhn^u*%RWA>_j1c$BM1r_0R@|^0AZ*~k_|{32{`Nw5 z(uC>dVL(L3;HrvsUjP@*x$`4bRBRsF-Az{|66QNOImuN@Q7A>=I1H|4BjjHHkobV5X)h2v>;iC!ntyeV#G2otEq*I&o`OfTR+NX8V9;DHsMI zC4csKil2QtkQWO>zf)E17 zahhz~Zm?~eE2W@m8t>`pnHr15RsgvB|G{`(=k>qRe*g)TT@bI*e?b5M002ovPDHLk FV1oI^!(9LX literal 0 HcmV?d00001 diff --git a/Source/Assets/TouchScript/Editor/EditorResources/Icons/yz.png.meta b/Source/Assets/TouchScript/Editor/EditorResources/Icons/yz.png.meta new file mode 100644 index 000000000..3ea117e2c --- /dev/null +++ b/Source/Assets/TouchScript/Editor/EditorResources/Icons/yz.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 5b7a913101fce4f3589a24ca1780a607 +timeCreated: 1500984768 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Editor/EditorUI/GUIElements.cs b/Source/Assets/TouchScript/Editor/EditorUI/GUIElements.cs index 3c801a3de..a5d4dc3a0 100644 --- a/Source/Assets/TouchScript/Editor/EditorUI/GUIElements.cs +++ b/Source/Assets/TouchScript/Editor/EditorUI/GUIElements.cs @@ -10,11 +10,11 @@ namespace TouchScript.Editor.EditorUI { internal static class GUIElements { - public static GUIStyle BoxStyle; - public static GUIStyle BoxLabelStyle; + public static GUIStyle Box; + public static GUIStyle BoxLabel; public static GUIStyle HelpBox; - public static GUIStyle HeaderStyle; + public static GUIStyle HeaderBox; public static GUIStyle HeaderCheckbox; public static GUIStyle HeaderFoldout; public static GUIStyle SmallText; @@ -24,16 +24,16 @@ internal static class GUIElements static GUIElements() { - BoxStyle = new GUIStyle(GUI.skin.box) + Box = new GUIStyle(GUI.skin.box) { margin = new RectOffset(0, 0, 1, 0), padding = new RectOffset(0, 0, 0, 0), contentOffset = new Vector2(0, 0), alignment = TextAnchor.MiddleCenter, }; - BoxStyle.normal.textColor = GUI.skin.label.normal.textColor; + Box.normal.textColor = GUI.skin.label.normal.textColor; - BoxLabelStyle = new GUIStyle(GUI.skin.label) + BoxLabel = new GUIStyle(GUI.skin.label) { fontSize = 9, padding = new RectOffset(0, 0, 5, 0), @@ -44,7 +44,7 @@ static GUIElements() wordWrap = true, }; - HeaderStyle = new GUIStyle("ShurikenModuleTitle") + HeaderBox = new GUIStyle("ShurikenModuleTitle") { font = (new GUIStyle("Label")).font, border = new RectOffset(15, 7, 4, 4), @@ -75,8 +75,8 @@ static GUIElements() public static bool Header(GUIContent title, SerializedProperty expanded, SerializedProperty enabled = null, PropertyInfo enabledProp = null) { - var rect = GUILayoutUtility.GetRect(16f, 22f, HeaderStyle); - GUI.Box(rect, title, HeaderStyle); + var rect = GUILayoutUtility.GetRect(16f, 22f, HeaderBox); + GUI.Box(rect, title, HeaderBox); var display = expanded == null || expanded.isExpanded; diff --git a/Source/Assets/TouchScript/Editor/Gestures/FlickGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/FlickGestureEditor.cs index b8c24cd02..d9efa4d78 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/FlickGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/FlickGestureEditor.cs @@ -16,7 +16,7 @@ internal sealed class FlickGestureEditor : GestureEditor public static readonly GUIContent FLICK_TIME = new GUIContent("Flick Time (sec)", "Time interval in seconds during which pointers must move by for the gesture to be recognized."); public static readonly GUIContent MIN_DISTANCE = new GUIContent("Minimum Distance (cm)", "Minimum distance in cm pointers must move in seconds for the gesture to be recognized."); - public static readonly GUIContent TEXT_HELP = new GUIContent("This component a fast flick gesture started over the GameObject. Switch to advanced view to see more options."); + public static readonly GUIContent TEXT_HELP = new GUIContent("This component a fast flick gesture started over the GameObject."); private SerializedProperty direction; private SerializedProperty flickTime; diff --git a/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs index 7afc18011..482c35f48 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs @@ -92,7 +92,7 @@ protected virtual void OnEnable() EditorGUI.LabelField(rect, GUIContent.none); return; } - EditorGUI.LabelField(rect, string.Format("{0} @ {1}", gesture.GetType().Name, gesture.name), GUIElements.BoxLabelStyle); + EditorGUI.LabelField(rect, string.Format("{0} @ {1}", gesture.GetType().Name, gesture.name), GUIElements.BoxLabel); }; friendlyGesturesList.onRemoveCallback += list => { indexToRemove = list.index; }; } @@ -290,8 +290,8 @@ private void drawGestureList(SerializedProperty prop, Action cm."); - public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a gesture when this GameObject is being pressed for seconds. Switch to advanced view to see more options."); + public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a gesture when this GameObject is being pressed for seconds."); private SerializedProperty distanceLimit, timeToPress; private SerializedProperty OnLongPress; diff --git a/Source/Assets/TouchScript/Editor/Gestures/MetaGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/MetaGestureEditor.cs index 5c32cbaab..c8803f031 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/MetaGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/MetaGestureEditor.cs @@ -11,7 +11,7 @@ namespace TouchScript.Editor.Gestures [CustomEditor(typeof(MetaGesture), true)] internal sealed class MetaGestureEditor : GestureEditor { - public static readonly GUIContent TEXT_HELP = new GUIContent("This component serves as a proxy from TouchScript gesture recognition logic to C# events. It catches pointers like a normal event and dispatches events for every event of caught pointers. Switch to advanced view to see more options."); + public static readonly GUIContent TEXT_HELP = new GUIContent("This component serves as a proxy from TouchScript gesture recognition logic to C# events. It catches pointers like a normal event and dispatches events for every event of caught pointers."); protected override void OnEnable() { diff --git a/Source/Assets/TouchScript/Editor/Gestures/PressGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/PressGestureEditor.cs index d4e2533d1..8d394260a 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/PressGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/PressGestureEditor.cs @@ -13,7 +13,7 @@ internal sealed class PressGestureEditor : GestureEditor { public static readonly GUIContent TEXT_IGNORE_CHILDREN = new GUIContent("Ignore Children", "If selected this gesture ignores pointers from children."); - public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a gesture when at least one pointer is pressed over this GameObject. Switch to advanced view to see more options."); + public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a gesture when at least one pointer is pressed over this GameObject."); private SerializedProperty ignoreChildren; private SerializedProperty OnPress; diff --git a/Source/Assets/TouchScript/Editor/Gestures/ReleaseGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/ReleaseGestureEditor.cs index 94f4cc9a9..ef554a102 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/ReleaseGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/ReleaseGestureEditor.cs @@ -13,7 +13,7 @@ internal sealed class ReleaseGestureEditor : GestureEditor { public static readonly GUIContent TEXT_IGNORE_CHILDREN = new GUIContent("Ignore Children", "If selected this gesture ignores pointers from children."); - public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a gesture when all pointers are lifted off from this GameObject. Switch to advanced view to see more options."); + public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a gesture when all pointers are lifted off from this GameObject."); private SerializedProperty ignoreChildren; private SerializedProperty OnRelease; diff --git a/Source/Assets/TouchScript/Editor/Gestures/TapGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/TapGestureEditor.cs index 3ae96336c..75c018cda 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/TapGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/TapGestureEditor.cs @@ -17,7 +17,7 @@ internal sealed class TapGestureEditor : GestureEditor public static readonly GUIContent TEXT_COMBINE_POINTERS = new GUIContent("Combine Pointers", "When several fingers are used to perform a tap, pointers released not earlier than seconds ago are used to calculate gesture's final screen position."); public static readonly GUIContent TEXT_COMBINE_TOUCH_POINTERS = new GUIContent("Combine Interval (sec)", TEXT_COMBINE_POINTERS.tooltip); - public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a gesture when this GameObject is tapped. Switch to advanced view to see more options."); + public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a gesture when this GameObject is tapped."); private SerializedProperty numberOfTapsRequired, distanceLimit, timeLimit, combinePointers, combinePointersInterval; private SerializedProperty OnTap; diff --git a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/OnePointTransformGestureBaseEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/OnePointTransformGestureBaseEditor.cs index 9920e1916..650b93783 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/OnePointTransformGestureBaseEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/OnePointTransformGestureBaseEditor.cs @@ -16,22 +16,18 @@ protected override void drawBasic() var typeValue = type.intValue; int newType = 0; EditorGUILayout.LabelField(TEXT_TYPE); - EditorGUI.indentLevel++; - EditorGUILayout.BeginHorizontal(); - { - var rect = GUILayoutUtility.GetRect(36, 20); - if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_ROTATION, - (typeValue & (int)TransformGesture.TransformType.Rotation) != 0)) - newType |= (int)TransformGesture.TransformType.Rotation; - rect = GUILayoutUtility.GetRect(44, 20); - if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_SCALING, - (typeValue & (int)TransformGesture.TransformType.Scaling) != 0)) - newType |= (int)TransformGesture.TransformType.Scaling; - GUILayoutUtility.GetRect(0, 20, GUILayout.ExpandWidth(true)); - type.intValue = newType; - } - EditorGUILayout.EndHorizontal(); - EditorGUI.indentLevel--; + + var rect = GUILayoutUtility.GetRect(0, 20, GUILayout.ExpandWidth(true)); + rect.x += 10; + rect.width = 70; + if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_ROTATION, + (typeValue & (int)TransformGesture.TransformType.Rotation) != 0)) + newType |= (int)TransformGesture.TransformType.Rotation; + rect.x += rect.width; + if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_SCALING, + (typeValue & (int)TransformGesture.TransformType.Scaling) != 0)) + newType |= (int)TransformGesture.TransformType.Scaling; + type.intValue = newType; } protected override void drawGeneral() @@ -39,17 +35,20 @@ protected override void drawGeneral() var typeValue = type.intValue; int newType = 0; EditorGUILayout.LabelField(TEXT_TYPE); - EditorGUI.indentLevel++; - EditorGUILayout.BeginVertical(); - if (EditorGUILayout.ToggleLeft(TEXT_TYPE_ROTATION, - (typeValue & (int)TransformGesture.TransformType.Rotation) != 0)) - newType |= (int)TransformGesture.TransformType.Rotation; - if (EditorGUILayout.ToggleLeft(TEXT_TYPE_SCALING, - (typeValue & (int)TransformGesture.TransformType.Scaling) != 0)) - newType |= (int)TransformGesture.TransformType.Scaling; - type.intValue = newType; - EditorGUILayout.EndVertical(); - EditorGUI.indentLevel--; + + EditorGUI.indentLevel--; + var rect = GUILayoutUtility.GetRect(0, 20, GUILayout.ExpandWidth(true)); + rect.x += 26; + rect.width = 70; + if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_ROTATION, + (typeValue & (int)TransformGesture.TransformType.Rotation) != 0)) + newType |= (int)TransformGesture.TransformType.Rotation; + rect.x += rect.width; + if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_SCALING, + (typeValue & (int)TransformGesture.TransformType.Scaling) != 0)) + newType |= (int)TransformGesture.TransformType.Scaling; + type.intValue = newType; + EditorGUI.indentLevel++; EditorGUIUtility.labelWidth = 160; EditorGUILayout.PropertyField(screenTransformThreshold, TEXT_SCREEN_TRANSFORM_THRESHOLD); diff --git a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/TransformGestureBaseEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/TransformGestureBaseEditor.cs index 05fbde6e7..e493a1d01 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/TransformGestureBaseEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/TransformGestureBaseEditor.cs @@ -2,6 +2,7 @@ * @author Valentin Simonov / http://va.lent.in/ */ +using TouchScript.Editor.EditorUI; using TouchScript.Gestures.TransformGestures; using UnityEditor; using UnityEngine; @@ -12,18 +13,32 @@ internal class TransformGestureBaseEditor : GestureEditor { public static readonly GUIContent TEXT_PROJECTION_HEADER = new GUIContent("Projection", "Screen to 3D object projection parameters."); + public static readonly GUIContent TEXT_TYPE = new GUIContent("Transform Type", "Specifies what gestures should be detected: Translation, Rotation, Scaling."); - public static readonly GUIContent TEXT_TYPE_TRANSLATION = new GUIContent(" Translation", "Dragging with one ore more fingers."); - public static readonly GUIContent TEXT_TYPE_ROTATION = new GUIContent(" Rotation", "Rotating with two or more fingers."); - public static readonly GUIContent TEXT_TYPE_SCALING = new GUIContent(" Scaling", "Scaling with two or more fingers."); + public static readonly GUIContent TEXT_TYPE_TRANSLATION = new GUIContent("Translation", "Dragging with one ore more fingers."); + public static readonly GUIContent TEXT_TYPE_ROTATION = new GUIContent("Rotation", "Rotating with two or more fingers."); + public static readonly GUIContent TEXT_TYPE_SCALING = new GUIContent("Scaling", "Scaling with two or more fingers."); public static readonly GUIContent TEXT_MIN_SCREEN_POINTS_DISTANCE = new GUIContent("Min Points Distance (cm)", "Minimum distance between two pointers (clusters) in cm to consider this gesture started. Used to prevent fake pointers spawned near real ones on cheap multitouch hardware to mess everything up."); public static readonly GUIContent TEXT_SCREEN_TRANSFORM_THRESHOLD = new GUIContent("Movement Threshold (cm)", "Minimum distance in cm pointers must move for the gesture to begin."); + public static readonly GUIContent TEXT_PROJECTION = new GUIContent("Projection Type", "Method used to project 2d screen positions of pointers into 3d space."); + public static readonly GUIContent TEXT_PROJECTION_LAYER = new GUIContent("Transform plane is parallel to the camera."); + public static readonly GUIContent TEXT_PROJECTION_OBJECT = new GUIContent("Transform plane is relative to the object."); + public static readonly GUIContent TEXT_PROJECTION_GLOBAL = new GUIContent("Transform plane is relative to the world."); public static readonly GUIContent TEXT_PROJECTION_NORMAL = new GUIContent("Projection Normal", "Normal of the plane in 3d space where pointers' positions are projected."); + protected SerializedProperty type, minScreenPointsDistance, screenTransformThreshold; protected SerializedProperty OnTransformStart, OnTransform, OnTransformComplete; + public SerializedProperty projection, projectionPlaneNormal; + public SerializedProperty projectionProps; + + private Texture2D xy, xz, yz, unknown, selector; + private Color selectorColor = new Color(1, 1, 1, .05f); + private Color selectorColorSelected = new Color(1, 1, 1, .9f); + protected bool customProjection = false; + protected override void OnEnable() { type = serializedObject.FindProperty("type"); @@ -33,6 +48,16 @@ protected override void OnEnable() OnTransform = serializedObject.FindProperty("OnTransform"); OnTransformComplete = serializedObject.FindProperty("OnTransformComplete"); + projection = serializedObject.FindProperty("projection"); + projectionPlaneNormal = serializedObject.FindProperty("projectionPlaneNormal"); + projectionProps = serializedObject.FindProperty("projectionProps"); + + xy = EditorResources.Load("Icons/xy.png"); + xz = EditorResources.Load("Icons/xz.png"); + yz = EditorResources.Load("Icons/yz.png"); + unknown = EditorResources.Load("Icons/unknown.png"); + selector = EditorResources.Load("Icons/selector.png"); + base.OnEnable(); } @@ -45,6 +70,82 @@ protected override void drawUnityEvents () base.drawUnityEvents (); } + protected void initCustomProjection() + { + var v = projectionPlaneNormal.vector3Value; + customProjection = !(v == Vector3.up || v == Vector3.right || v == Vector3.forward); + } + + protected bool drawProjection(bool custom) + { + EditorGUILayout.PropertyField(projection, TEXT_PROJECTION); + switch (projection.enumValueIndex) + { + case (int)TransformGesture.ProjectionType.Layer: + EditorGUILayout.LabelField(TEXT_PROJECTION_LAYER, GUIElements.HelpBox); + break; + case (int)TransformGesture.ProjectionType.Object: + EditorGUILayout.LabelField(TEXT_PROJECTION_OBJECT, GUIElements.HelpBox); + break; + case (int)TransformGesture.ProjectionType.Global: + EditorGUILayout.LabelField(TEXT_PROJECTION_GLOBAL, GUIElements.HelpBox); + break; + } + + if (projection.enumValueIndex != (int)TransformGesture.ProjectionType.Layer) + { + var v = projectionPlaneNormal.vector3Value; + var rect = GUILayoutUtility.GetRect(0, 35, GUILayout.ExpandWidth(true)); + + rect.width = 44; + rect.x += 10; + GUI.DrawTexture(rect, yz); + if (drawSelector(rect, !custom && v == Vector3.right)) + { + projectionPlaneNormal.vector3Value = Vector3.right; + custom = false; + } + + rect.x += rect.width + 5; + GUI.DrawTexture(rect, xz); + if (drawSelector(rect, !custom && v == Vector3.up)) + { + projectionPlaneNormal.vector3Value = Vector3.up; + custom = false; + } + + rect.x += rect.width + 5; + GUI.DrawTexture(rect, xy); + if (drawSelector(rect, !custom && v == Vector3.forward)) + { + projectionPlaneNormal.vector3Value = Vector3.forward; + custom = false; + } + + rect.x += rect.width + 10; + GUI.DrawTexture(rect, unknown); + if (drawSelector(rect, custom)) custom = true; + + if (custom) EditorGUILayout.PropertyField(projectionPlaneNormal, TEXT_PROJECTION_NORMAL); + } + + return custom; + } + + protected bool drawSelector(Rect rect, bool selected) + { + GUI.color = selected ? selectorColorSelected : selectorColor; + GUI.DrawTexture(rect, selector); + GUI.color = Color.white; + + if (Event.current.type == EventType.MouseUp && rect.Contains(Event.current.mousePosition)) + { + Event.current.Use(); + return true; + } + return false; + } + } } diff --git a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/TwoPointTransformGestureBaseEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/TwoPointTransformGestureBaseEditor.cs index e705fbc7a..e49e978e5 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/TwoPointTransformGestureBaseEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/TwoPointTransformGestureBaseEditor.cs @@ -16,26 +16,23 @@ protected override void drawBasic() var typeValue = type.intValue; int newType = 0; EditorGUILayout.LabelField(TEXT_TYPE); - EditorGUI.indentLevel++; - EditorGUILayout.BeginHorizontal(); - { - var rect = GUILayoutUtility.GetRect(86, 20); - if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_TRANSLATION, - (typeValue & (int)TransformGesture.TransformType.Translation) != 0)) - newType |= (int)TransformGesture.TransformType.Translation; - rect = GUILayoutUtility.GetRect(70, 20); - if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_ROTATION, - (typeValue & (int)TransformGesture.TransformType.Rotation) != 0)) - newType |= (int)TransformGesture.TransformType.Rotation; - rect = GUILayoutUtility.GetRect(64, 20); - if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_SCALING, - (typeValue & (int)TransformGesture.TransformType.Scaling) != 0)) - newType |= (int)TransformGesture.TransformType.Scaling; - GUILayoutUtility.GetRect(0, 20, GUILayout.ExpandWidth(true)); - type.intValue = newType; - } - EditorGUILayout.EndHorizontal(); - EditorGUI.indentLevel--; + + var rect = GUILayoutUtility.GetRect(0, 20, GUILayout.ExpandWidth(true)); + rect.x += 10; + rect.width = 90; + if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_TRANSLATION, + (typeValue & (int)TransformGesture.TransformType.Translation) != 0)) + newType |= (int)TransformGesture.TransformType.Translation; + rect.x += rect.width; + rect.width = 70; + if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_ROTATION, + (typeValue & (int)TransformGesture.TransformType.Rotation) != 0)) + newType |= (int)TransformGesture.TransformType.Rotation; + rect.x += rect.width; + if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_SCALING, + (typeValue & (int)TransformGesture.TransformType.Scaling) != 0)) + newType |= (int)TransformGesture.TransformType.Scaling; + type.intValue = newType; } protected override void drawGeneral() @@ -43,20 +40,26 @@ protected override void drawGeneral() var typeValue = type.intValue; int newType = 0; EditorGUILayout.LabelField(TEXT_TYPE); - EditorGUI.indentLevel++; - EditorGUILayout.BeginVertical(); - if (EditorGUILayout.ToggleLeft(TEXT_TYPE_TRANSLATION, + EditorGUI.indentLevel--; + + var rect = GUILayoutUtility.GetRect(0, 20, GUILayout.ExpandWidth(true)); + rect.x += 26; + rect.width = 90; + if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_TRANSLATION, (typeValue & (int)TransformGesture.TransformType.Translation) != 0)) newType |= (int)TransformGesture.TransformType.Translation; - if (EditorGUILayout.ToggleLeft(TEXT_TYPE_ROTATION, + rect.x += rect.width; + rect.width = 70; + if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_ROTATION, (typeValue & (int)TransformGesture.TransformType.Rotation) != 0)) newType |= (int)TransformGesture.TransformType.Rotation; - if (EditorGUILayout.ToggleLeft(TEXT_TYPE_SCALING, + rect.x += rect.width; + if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_SCALING, (typeValue & (int)TransformGesture.TransformType.Scaling) != 0)) newType |= (int)TransformGesture.TransformType.Scaling; type.intValue = newType; - EditorGUILayout.EndVertical(); - EditorGUI.indentLevel--; + + EditorGUI.indentLevel++; EditorGUIUtility.labelWidth = 160; EditorGUILayout.PropertyField(minScreenPointsDistance, TEXT_MIN_SCREEN_POINTS_DISTANCE); diff --git a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/PinnedTransformGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/PinnedTransformGestureEditor.cs index 394e1d215..56649e5b4 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/PinnedTransformGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/PinnedTransformGestureEditor.cs @@ -14,30 +14,20 @@ namespace TouchScript.Editor.Gestures.TransformGestures internal class PinnedTransformGestureEditor : OnePointTransformGestureBaseEditor { - public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a combination of rotation and scaling gestures on the GameObject if it was pinned to the world position. Switch to advanced view to see more options."); - - public SerializedProperty projection, projectionPlaneNormal; - public SerializedProperty projectionProps; + public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a combination of rotation and scaling gestures on the GameObject if it was pinned to the world position."); protected override void OnEnable() { - projection = serializedObject.FindProperty("projection"); - projectionPlaneNormal = serializedObject.FindProperty("projectionPlaneNormal"); - - projectionProps = serializedObject.FindProperty("projectionProps"); - base.OnEnable(); + + initCustomProjection(); } protected override void drawBasic() { base.drawBasic(); - EditorGUILayout.PropertyField(projection, TEXT_PROJECTION); - if (projection.enumValueIndex != (int)TransformGesture.ProjectionType.Layer) - { - EditorGUILayout.PropertyField(projectionPlaneNormal, TEXT_PROJECTION_NORMAL); - } + customProjection = drawProjection(customProjection); } protected override GUIContent getHelpText() @@ -51,11 +41,8 @@ protected override void drawOtherGUI() if (display) { EditorGUI.indentLevel++; - EditorGUILayout.PropertyField(projection, TEXT_PROJECTION); - if (projection.enumValueIndex != (int)TransformGesture.ProjectionType.Layer) - { - EditorGUILayout.PropertyField(projectionPlaneNormal, TEXT_PROJECTION_NORMAL); - } + customProjection = drawProjection(customProjection); + EditorGUILayout.Space(); EditorGUI.indentLevel--; } } diff --git a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/ScreenTransformGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/ScreenTransformGestureEditor.cs index e595cc80b..cd1c4bc96 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/ScreenTransformGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/ScreenTransformGestureEditor.cs @@ -13,7 +13,7 @@ namespace TouchScript.Editor.Gestures.TransformGestures internal class ScreenTransformGestureEditor : TwoPointTransformGestureBaseEditor { - public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a combination of translation, rotation and scaling gestures on the GameObject in screen space. Switch to advanced view to see more options."); + public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a combination of translation, rotation and scaling gestures on the GameObject in screen space."); protected override GUIContent getHelpText() { diff --git a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/TransformGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/TransformGestureEditor.cs index 95ded9450..8ad2620c1 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/TransformGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/TransformGestureEditor.cs @@ -14,30 +14,21 @@ namespace TouchScript.Editor.Gestures.TransformGestures internal class TransformGestureEditor : TwoPointTransformGestureBaseEditor { - public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a combination of translation, rotation and scaling gestures on the GameObject. Switch to advanced view to see more options."); + public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a combination of translation, rotation and scaling gestures on the GameObject."); - public SerializedProperty projection, projectionPlaneNormal; - public SerializedProperty projectionProps; protected override void OnEnable() { - projection = serializedObject.FindProperty("projection"); - projectionPlaneNormal = serializedObject.FindProperty("projectionPlaneNormal"); - - projectionProps = serializedObject.FindProperty("projectionProps"); - base.OnEnable(); + + initCustomProjection(); } protected override void drawBasic() { base.drawBasic(); - EditorGUILayout.PropertyField(projection, TEXT_PROJECTION); - if (projection.enumValueIndex != (int)TransformGesture.ProjectionType.Layer) - { - EditorGUILayout.PropertyField(projectionPlaneNormal, TEXT_PROJECTION_NORMAL); - } + customProjection = drawProjection(customProjection); } protected override GUIContent getHelpText() @@ -51,11 +42,8 @@ protected override void drawOtherGUI() if (display) { EditorGUI.indentLevel++; - EditorGUILayout.PropertyField(projection, TEXT_PROJECTION); - if (projection.enumValueIndex != (int)TransformGesture.ProjectionType.Layer) - { - EditorGUILayout.PropertyField(projectionPlaneNormal, TEXT_PROJECTION_NORMAL); - } + customProjection = drawProjection(customProjection); + EditorGUILayout.Space(); EditorGUI.indentLevel--; } } diff --git a/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs b/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs index 9f439e936..572d1a8f2 100644 --- a/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs +++ b/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs @@ -25,7 +25,7 @@ internal sealed class StandardInputEditor : InputSourceEditor public static readonly GUIContent TEXT_WINDOWS7_MOUSE = new GUIContent("Enable Mouse on Windows 7"); public static readonly GUIContent TEXT_UWP_MOUSE = new GUIContent("Enable Mouse on UWP"); - public static readonly GUIContent TEXT_HELP = new GUIContent("This component gathers input data from various devices like touch, mouse and pen on all platforms. Switch to advanced view to see more options."); + public static readonly GUIContent TEXT_HELP = new GUIContent("This component gathers input data from various devices like touch, mouse and pen on all platforms."); private SerializedProperty basicEditor; private SerializedProperty windows8Touch, windows7Touch, webGLTouch, windows8Mouse, diff --git a/Source/Assets/TouchScript/Editor/Layers/StandardLayerEditor.cs b/Source/Assets/TouchScript/Editor/Layers/StandardLayerEditor.cs index 4045c9828..a54b560e6 100644 --- a/Source/Assets/TouchScript/Editor/Layers/StandardLayerEditor.cs +++ b/Source/Assets/TouchScript/Editor/Layers/StandardLayerEditor.cs @@ -22,7 +22,7 @@ internal class StandardLayerEditor : UnityEditor.Editor public static readonly GUIContent TEXT_LAYER_MASK = new GUIContent("Layer Mask", "Layer mask."); public static readonly GUIContent TEXT_HIT_FILTERS = new GUIContent("Use Hit FIlters", "Layer should test for individual HitTest objects."); - public static readonly GUIContent TEXT_HELP = new GUIContent("This component assigns target GameObjects in the scene for pressed pointers. Switch to advanced view to see more options."); + public static readonly GUIContent TEXT_HELP = new GUIContent("This component assigns target GameObjects in the scene for pressed pointers."); private SerializedProperty advancedProps, hitProps; private SerializedProperty basicEditor; diff --git a/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs b/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs index 975d32055..ed020e552 100644 --- a/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs +++ b/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs @@ -31,7 +31,7 @@ internal sealed class TouchManagerEditor : UnityEditor.Editor public static readonly GUIContent TEXT_SEND_MESSAGE_TARGET = new GUIContent("Target", "The GameObject target of Unity Messages. If null, host GameObject is used."); public static readonly GUIContent TEXT_SEND_MESSAGE_EVENTS = new GUIContent("Events", "Which events should be sent as Unity Messages."); - public static readonly GUIContent TEXT_HELP = new GUIContent("This component holds TouchScript configuration options for a scene. Switch to advanced view to see more options."); + public static readonly GUIContent TEXT_HELP = new GUIContent("This component holds TouchScript configuration options for a scene."); private TouchManager instance; private ReorderableList layersList; diff --git a/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity b/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity index f25eab3ce..a74b7ad80 100644 --- a/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity +++ b/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity @@ -2312,18 +2312,6 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: --- !u!114 &1841925476 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1841925474} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f91ca003806bd40f7938a006eee71921, type: 3} - m_Name: - m_EditorClassIdentifier: - OverColor: {r: 1, g: 0, b: 0, a: 1} ---- !u!114 &1841925477 MonoBehaviour: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} @@ -2604,7 +2592,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 38e07bff8743d4ee38bf724a7a2b4cbb, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 OnStateChange: m_PersistentCalls: m_Calls: [] diff --git a/Source/ProjectSettings/ProjectSettings.asset b/Source/ProjectSettings/ProjectSettings.asset index 9e7f5bb84..68627b0a0 100644 --- a/Source/ProjectSettings/ProjectSettings.asset +++ b/Source/ProjectSettings/ProjectSettings.asset @@ -512,7 +512,7 @@ PlayerSettings: webGLUseWasm: 0 webGLCompressionFormat: 1 scriptingDefineSymbols: - 1: TOUCHSCRIPT_DEBUG + 1: 4: platformArchitecture: iOS: 0 From 1099a029bbd883bd900dcbd1abcb5757afb434e5 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 25 Jul 2017 19:29:27 +0300 Subject: [PATCH 38/58] Axes Flash project. --- Resources/Icons/Axes/Axes.xfl | 1 + Resources/Icons/Axes/DOMDocument.xml | 656 +++++++++++++++++++++ Resources/Icons/Axes/LIBRARY/Arrow.xml | 29 + Resources/Icons/Axes/LIBRARY/Line.xml | 31 + Resources/Icons/Axes/META-INF/metadata.xml | 0 Resources/Icons/Axes/MobileSettings.xml | 0 Resources/Icons/Axes/PublishSettings.xml | 175 ++++++ Resources/Icons/Axes/bin/SymDepend.cache | Bin 0 -> 51 bytes 8 files changed, 892 insertions(+) create mode 100644 Resources/Icons/Axes/Axes.xfl create mode 100644 Resources/Icons/Axes/DOMDocument.xml create mode 100644 Resources/Icons/Axes/LIBRARY/Arrow.xml create mode 100644 Resources/Icons/Axes/LIBRARY/Line.xml create mode 100644 Resources/Icons/Axes/META-INF/metadata.xml create mode 100644 Resources/Icons/Axes/MobileSettings.xml create mode 100644 Resources/Icons/Axes/PublishSettings.xml create mode 100644 Resources/Icons/Axes/bin/SymDepend.cache diff --git a/Resources/Icons/Axes/Axes.xfl b/Resources/Icons/Axes/Axes.xfl new file mode 100644 index 000000000..860a820ec --- /dev/null +++ b/Resources/Icons/Axes/Axes.xfl @@ -0,0 +1 @@ +PROXY-CS5 \ No newline at end of file diff --git a/Resources/Icons/Axes/DOMDocument.xml b/Resources/Icons/Axes/DOMDocument.xml new file mode 100644 index 000000000..4c20f7dd3 --- /dev/null +++ b/Resources/Icons/Axes/DOMDocument.xml @@ -0,0 +1,656 @@ + + + + + + + + + + + + + + + + + + + + X + + + + + + Z + + + + + + + + + + + + + + + + + X + + + + + + Z + + + + + + + + + + + + + + + + + Y + + + + + + Z + + + + + + + + + + + + + + + + + X + + + + + + Y + + + + + + + + + + + + + + + + + + + + + + + ?? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Resources/Icons/Axes/LIBRARY/Arrow.xml b/Resources/Icons/Axes/LIBRARY/Arrow.xml new file mode 100644 index 000000000..8b36b0679 --- /dev/null +++ b/Resources/Icons/Axes/LIBRARY/Arrow.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Resources/Icons/Axes/LIBRARY/Line.xml b/Resources/Icons/Axes/LIBRARY/Line.xml new file mode 100644 index 000000000..a4a6db0ad --- /dev/null +++ b/Resources/Icons/Axes/LIBRARY/Line.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Resources/Icons/Axes/META-INF/metadata.xml b/Resources/Icons/Axes/META-INF/metadata.xml new file mode 100644 index 000000000..e69de29bb diff --git a/Resources/Icons/Axes/MobileSettings.xml b/Resources/Icons/Axes/MobileSettings.xml new file mode 100644 index 000000000..e69de29bb diff --git a/Resources/Icons/Axes/PublishSettings.xml b/Resources/Icons/Axes/PublishSettings.xml new file mode 100644 index 000000000..8258315df --- /dev/null +++ b/Resources/Icons/Axes/PublishSettings.xml @@ -0,0 +1,175 @@ + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + axes.swf + axes.exe + axes.app + axes.html + axes.gif + axes.jpg + axes.png + axes.swc + axes.oam + 0 + 0 + 0 + 0 + + + 0 + 25,0,0,0;23,0,0,0;21,0,0,0;20,0,0,0;19,0,0,0;18,0,0,0;17,0,0,0;16,0,0,0;14,0,0,0;13,0,0,0;12,0,0,0;11,9,0,0;11,8,0,0;11,7,0,0;11,6,0,0;11,5,0,0;11,4,0,0;11,3,0,0;11,2,0,0;11,1,0,0;10,3,0,0;10,2,153,0;10,1,52,0;9,0,124,0;8,0,24,0;7,0,14,0;6,0,79,0;5,0,58,0;4,0,32,0;3,0,8,0;2,0,1,12;1,0,0,1; + 1 + 1 + axes_content.html + axes_alternate.html + 0 + + 550 + 400 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 4 + 0 + 0 + 1 + 0 + /Users/valyard/Library/Application Support/Adobe/Animate CC 2017/en_US/Configuration/HTML/Default.html + 1 + + + + + 0 + 0 + 0 + 80 + 0 + 0 + 7 + 0 + 7 + 0 + 36 + FlashPlayer25.0 + 3 + 1 + + . + CONFIG::FLASH_AUTHORING="true"; + 0 + + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + 2 + 4 + 4096 + AS3 + 1 + 1 + 0 + 15 + 1 + 0 + 4102 + rsl + wrap + $(AppConfig)/ActionScript 3.0/rsls/loader_animation.swf + + + $(AppConfig)/ActionScript 3.0/libs + merge + + + + + 0 + + + + 550 + 400 + 0 + 4718592 + 0 + 80 + 1 + + + 550 + 400 + 0 + 1 + 1 + + 1 + 255 + + + 550 + 400 + 1 + 1 + 24-bit with Alpha + 255 + + + 550 + 400 + 1 + 0 + + 0 + + + true + axes.zip + + + true + true + false + Untitled-1.svg + images + true + 0.1 + + + true + Untitled-1.app + + + true + Untitled-1.exe + + + \ No newline at end of file diff --git a/Resources/Icons/Axes/bin/SymDepend.cache b/Resources/Icons/Axes/bin/SymDepend.cache new file mode 100644 index 0000000000000000000000000000000000000000..cf9bc671eb4521ebf81336d1b59d99030f4639e1 GIT binary patch literal 51 xcmYdiU|@L2&d$KZAju%iAj4n` Date: Wed, 26 Jul 2017 11:13:30 +0300 Subject: [PATCH 39/58] Fixed an issue with UI released/cancelled events. --- .../Scripts/Layers/UI/TouchScriptInputModule.cs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs index e6a8b4802..2a05f3710 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs @@ -76,8 +76,8 @@ private TouchScriptInputModule() if (raycastersProp == null) { raycastersProp = Type.GetType(Assembly.CreateQualifiedName("UnityEngine.UI", "UnityEngine.EventSystems.RaycasterManager")). - GetField("s_Raycasters", BindingFlags.NonPublic | BindingFlags.Static); - canvasProp = typeof (GraphicRaycaster).GetProperty("canvas", BindingFlags.NonPublic | BindingFlags.Instance); + GetField("s_Raycasters", BindingFlags.NonPublic | BindingFlags.Static); + canvasProp = typeof(GraphicRaycaster).GetProperty("canvas", BindingFlags.NonPublic | BindingFlags.Instance); } } @@ -569,9 +569,7 @@ public virtual void ProcessReleased(object sender, PointerEventArgs pointerEvent for (var i = 0; i < count; i++) { var pointer = pointers[i]; - var over = pointer.GetOverData(); - if (over.Type != HitData.HitType.UI && over.Type != HitData.HitType.ScreenSpace) continue; PointerEventData data; GetPointerData(pointer.Id, out data, true); @@ -622,9 +620,7 @@ public virtual void ProcessCancelled(object sender, PointerEventArgs pointerEven for (var i = 0; i < count; i++) { var pointer = pointers[i]; - var over = pointer.GetOverData(); - if (over.Type != HitData.HitType.UI && over.Type != HitData.HitType.ScreenSpace) continue; PointerEventData data; GetPointerData(pointer.Id, out data, true); From 6c0ebcecbdc014972e86fb389a0660812c28bdd4 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Wed, 26 Jul 2017 13:48:51 +0300 Subject: [PATCH 40/58] Updated documentation generation and properties. --- Docs/docs.shfbproj | 48 +++++++++---------- Docs/howto.txt | 28 +++++++++++ .../Camera/Scripts/CameraController.cs | 4 +- .../Examples/Checkers/Scripts/Board.cs | 1 + .../Examples/Checkers/Scripts/Exclusive.cs | 1 + .../Examples/Colors/Scripts/Circle.cs | 1 + .../Examples/Colors/Scripts/Colors.cs | 1 + .../Cube/Scripts/CustomPointerProxy.cs | 1 + .../TouchScript/Examples/Cube/Scripts/Init.cs | 1 + .../Examples/Cube/Scripts/LayerDelegate.cs | 1 + .../Examples/Cube/Scripts/RedirectInput.cs | 1 + .../Examples/Multiuser/Scripts/Logo.cs | 1 + .../Examples/Photos/Scripts/Container.cs | 1 + .../Examples/Photos/Scripts/SetColor.cs | 1 + .../Examples/Portal/Scripts/Planet.cs | 1 + .../Examples/Portal/Scripts/Rotator.cs | 1 + .../Examples/Portal/Scripts/Spawner.cs | 1 + .../Examples/Portal/Scripts/Vortex.cs | 1 + .../Examples/RawInput/Scripts/Ball.cs | 1 + .../Examples/RawInput/Scripts/Spawner.cs | 1 + .../Examples/Taps/Scripts/Break.cs | 1 + .../TouchScript/Examples/Taps/Scripts/Kick.cs | 1 + .../Examples/Taps/Scripts/Spawn.cs | 1 + .../Examples/_misc/Scripts/ExamplesList.cs | 1 + .../Examples/_misc/Scripts/Highlight.cs | 1 + .../Examples/_misc/Scripts/KillMe.cs | 4 +- .../Examples/_misc/Scripts/Runner.cs | 4 +- .../Examples/_misc/Scripts/ShowMe.cs | 1 + .../Behaviors/Cursors/CursorManager.cs | 1 + .../Scripts/Behaviors/Cursors/MouseCursor.cs | 4 +- .../Scripts/Behaviors/Cursors/ObjectCursor.cs | 2 + .../Scripts/Behaviors/Cursors/PenCursor.cs | 4 +- .../Behaviors/Cursors/PointerCursor.cs | 16 +++++++ .../Scripts/Behaviors/Cursors/TouchCursor.cs | 2 + .../Behaviors/Cursors/UI/GradientTexture.cs | 24 ++++++++++ .../Behaviors/Cursors/UI/TextureSwitch.cs | 1 + .../Scripts/Behaviors/UI/OverHelper.cs | 2 +- .../Scripts/Devices/Display/DisplayDevice.cs | 7 +++ .../Devices/Display/GenericDisplayDevice.cs | 1 + .../TouchScript/Scripts/Gestures/Gesture.cs | 12 ++--- .../Scripts/Gestures/LongPressGesture.cs | 3 ++ .../Scripts/Gestures/PressGesture.cs | 3 ++ .../Scripts/Gestures/ReleaseGesture.cs | 3 ++ .../Scripts/Gestures/TapGesture.cs | 29 ++++++----- .../Base/OnePointTrasformGestureBase.cs | 1 + .../Base/TransformGestureBase.cs | 25 +++++++++- .../Base/TwoPointTransformGestureBase.cs | 3 ++ .../ClusteredPinnedTransformGesture.cs | 2 +- .../ClusteredScreenTransformGesture.cs | 2 +- .../Clustered/ClusteredTransformGesture.cs | 2 +- .../PinnedTransformGesture.cs | 2 +- .../ScreenTransformGesture.cs | 2 +- .../TransformGestures/TransformGesture.cs | 12 ++++- .../Assets/TouchScript/Scripts/Hit/HitData.cs | 8 ++++ .../Assets/TouchScript/Scripts/Hit/HitTest.cs | 1 + .../TouchScript/Scripts/Hit/RaycastHitUI.cs | 4 +- .../TouchScript/Scripts/ITouchManager.cs | 5 +- .../Scripts/InputSources/IInputSource.cs | 6 ++- .../InputHandlers/MouseHandler.cs | 4 +- .../InputHandlers/TouchHandler.cs | 4 +- .../InputHandlers/WindowsPointerHandlers.cs | 4 +- .../Scripts/InputSources/InputSource.cs | 13 ++--- .../TouchScript/Scripts/LayerManager.cs | 1 + .../Scripts/Layers/ProjectionParams.cs | 2 +- .../Scripts/Layers/StandardLayer.cs | 1 + .../TouchScript/Scripts/Layers/TouchLayer.cs | 13 ++++- .../TouchScript/Scripts/Pointers/IPointer.cs | 5 +- .../TouchScript/Scripts/Pointers/Pointer.cs | 8 +++- .../Scripts/Pointers/PointerFactory.cs | 2 +- .../TouchScript/Scripts/TouchManager.cs | 1 - .../TouchScript/Scripts/Utils/ObjectPool.cs | 5 +- 71 files changed, 272 insertions(+), 91 deletions(-) create mode 100644 Docs/howto.txt diff --git a/Docs/docs.shfbproj b/Docs/docs.shfbproj index 2877f2d66..7832740c9 100644 --- a/Docs/docs.shfbproj +++ b/Docs/docs.shfbproj @@ -23,8 +23,9 @@ TouchScript ..\..\..\..\Program Files (x86)\Sandcastle\ - - + + + Website C# @@ -48,9 +49,9 @@ False TouchScript — multitouch library for Unity AboveNamespaces - Attributes, ExplicitInterfaceImplementations, InheritedMembers, Protected + ExplicitInterfaceImplementations, InheritedMembers, Protected AutoDocumentCtors, AutoDocumentDispose - TouchScript is a multitouch library for Unity. Inspired by iOS, TouchScript makes handling complex gesture interactions on any touch surface much easier. Please refer to: https://github.com/TouchScript/TouchScript + TouchScript is a multitouch library for Unity. Inspired by iOS, TouchScript makes handling complex gesture interactions on any touch surface much easier. Please refer to: &lt%3ba href=&quot%3bhttps://github.com/TouchScript/TouchScript&quot%3b&gt%3bhttps://github.com/TouchScript/TouchScript&lt%3b/a&gt%3b. TouchScript. @@ -69,25 +70,20 @@ TouchScript.Gestures. - + TouchScript.Gestures.Clustered. TouchScript.Gestures.UI. TouchScript.Hit. TouchScript.InputSources. TouchScript.InputSources.InputHandlers TouchScript.Layers. - TouchScript.Utils. - - + TouchScript.Utils. + + 1.0.0.0 - - - - - - + @@ -99,15 +95,19 @@ - - - - - + + + + + + + - - - + + + + + diff --git a/Docs/howto.txt b/Docs/howto.txt new file mode 100644 index 000000000..36c7f548d --- /dev/null +++ b/Docs/howto.txt @@ -0,0 +1,28 @@ +## How to build Documentation. + +The docs are built using Sandcastle Help File Builder +https://github.com/EWSoftware/SHFB/releases + +First, you need to generate the docs XML file and build the DLL from Visual Studio. + +Right now it is only possible to do on Windows: +1. Open Source.sln in Visual Studio. +2. Open Source.CSharp Properties. + If unable, need to configure VS Tools for Unity so it would allow chaning project properties. + You need to enable the "Access to project properties" option in the "Tools > Options > Tools for Unity > General" section and restart Visual Studio. +3. Enable "XML Documentation File" option in "Build" tab. +4. Save the project and build it from Visual Studio. + +This will generate two files needed by the docs build process: +1. Source/Temp/UnityVS_bin/Debug/Assembly-CSharp.DLL +2. Source/Temp/UnityVS_bin/Debug/Assembly-CSharp.XML + +To build the docs you need to: +1. Download the latest release of SHFB. +2. Run SandcastleBuilderGUI.exe from the folder where you installed SHFB. +3. Delete Docs/Help folder if it exists. +4. Open docs.shfbproj file. +5. Go to Project "Properties > Visibility > Edit API Filter" and uncheck all Examples namespaces and non-TouchScript namespaces which might have gotten there if you have any other code in the Unity project. +6. Save and press "Build the Help File" button. + +Documentation will be saved to Docs/Help folder. \ No newline at end of file diff --git a/Source/Assets/TouchScript/Examples/Camera/Scripts/CameraController.cs b/Source/Assets/TouchScript/Examples/Camera/Scripts/CameraController.cs index 73938a3e4..fdb638a4d 100644 --- a/Source/Assets/TouchScript/Examples/Camera/Scripts/CameraController.cs +++ b/Source/Assets/TouchScript/Examples/Camera/Scripts/CameraController.cs @@ -7,9 +7,7 @@ namespace TouchScript.Examples.CameraControl { - /// - /// This component controls camera movement. - /// + /// public class CameraController : MonoBehaviour { public ScreenTransformGesture TwoFingerMoveGesture; diff --git a/Source/Assets/TouchScript/Examples/Checkers/Scripts/Board.cs b/Source/Assets/TouchScript/Examples/Checkers/Scripts/Board.cs index 8b8aee113..8355c9702 100644 --- a/Source/Assets/TouchScript/Examples/Checkers/Scripts/Board.cs +++ b/Source/Assets/TouchScript/Examples/Checkers/Scripts/Board.cs @@ -7,6 +7,7 @@ namespace TouchScript.Examples.Checkers { + /// public class Board : MonoBehaviour { private PinnedTransformGesture gesture; diff --git a/Source/Assets/TouchScript/Examples/Checkers/Scripts/Exclusive.cs b/Source/Assets/TouchScript/Examples/Checkers/Scripts/Exclusive.cs index d4c978979..559eb97dc 100644 --- a/Source/Assets/TouchScript/Examples/Checkers/Scripts/Exclusive.cs +++ b/Source/Assets/TouchScript/Examples/Checkers/Scripts/Exclusive.cs @@ -9,6 +9,7 @@ namespace TouchScript.Examples.Checkers { + /// public class Exclusive : MonoBehaviour, IGestureDelegate { public TransformGesture Target; diff --git a/Source/Assets/TouchScript/Examples/Colors/Scripts/Circle.cs b/Source/Assets/TouchScript/Examples/Colors/Scripts/Circle.cs index 0c0248370..77a9931ea 100644 --- a/Source/Assets/TouchScript/Examples/Colors/Scripts/Circle.cs +++ b/Source/Assets/TouchScript/Examples/Colors/Scripts/Circle.cs @@ -8,6 +8,7 @@ namespace TouchScript.Examples.Colors { + /// public class Circle : MonoBehaviour { private bool isDestroyed = false; diff --git a/Source/Assets/TouchScript/Examples/Colors/Scripts/Colors.cs b/Source/Assets/TouchScript/Examples/Colors/Scripts/Colors.cs index 2739ecf38..db9a39431 100644 --- a/Source/Assets/TouchScript/Examples/Colors/Scripts/Colors.cs +++ b/Source/Assets/TouchScript/Examples/Colors/Scripts/Colors.cs @@ -7,6 +7,7 @@ namespace TouchScript.Examples.Colors { + /// public class Colors : MonoBehaviour { public Transform Prefab; diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs index e6d0e0de0..7e9810db5 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs @@ -7,6 +7,7 @@ namespace TouchScript.Examples.Cube { + /// public class CustomPointerProxy : PointerCursor { protected override void updateOnce(IPointer pointer) { diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/Init.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/Init.cs index 9803930bd..dfccb4da7 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/Init.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/Init.cs @@ -7,6 +7,7 @@ namespace TouchScript.Examples.Cube { + /// public class Init : MonoBehaviour { void Start () { diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/LayerDelegate.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/LayerDelegate.cs index d11bc2887..3fc8fe4de 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/LayerDelegate.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/LayerDelegate.cs @@ -9,6 +9,7 @@ namespace TouchScript.Examples.Cube { + /// public class LayerDelegate : MonoBehaviour, ILayerDelegate { diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs index 54090315c..1d9c98ddf 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs @@ -12,6 +12,7 @@ namespace TouchScript.Examples.Cube { + /// public class RedirectInput : InputSource { diff --git a/Source/Assets/TouchScript/Examples/Multiuser/Scripts/Logo.cs b/Source/Assets/TouchScript/Examples/Multiuser/Scripts/Logo.cs index 34ccd9468..c99f0bd5c 100644 --- a/Source/Assets/TouchScript/Examples/Multiuser/Scripts/Logo.cs +++ b/Source/Assets/TouchScript/Examples/Multiuser/Scripts/Logo.cs @@ -9,6 +9,7 @@ namespace TouchScript.Examples.Multiuser { + /// public class Logo : MonoBehaviour { private static Color[] COLORS = new[] diff --git a/Source/Assets/TouchScript/Examples/Photos/Scripts/Container.cs b/Source/Assets/TouchScript/Examples/Photos/Scripts/Container.cs index 8d394061f..01660c615 100644 --- a/Source/Assets/TouchScript/Examples/Photos/Scripts/Container.cs +++ b/Source/Assets/TouchScript/Examples/Photos/Scripts/Container.cs @@ -7,6 +7,7 @@ namespace TouchScript.Examples.Photos { + /// public class Container : MonoBehaviour { public int Width = 500; diff --git a/Source/Assets/TouchScript/Examples/Photos/Scripts/SetColor.cs b/Source/Assets/TouchScript/Examples/Photos/Scripts/SetColor.cs index 950a56604..e37fd5bbe 100644 --- a/Source/Assets/TouchScript/Examples/Photos/Scripts/SetColor.cs +++ b/Source/Assets/TouchScript/Examples/Photos/Scripts/SetColor.cs @@ -8,6 +8,7 @@ namespace TouchScript.Examples.UI { + /// public class SetColor : MonoBehaviour { public List Colors; diff --git a/Source/Assets/TouchScript/Examples/Portal/Scripts/Planet.cs b/Source/Assets/TouchScript/Examples/Portal/Scripts/Planet.cs index 5fde18802..6be31661c 100644 --- a/Source/Assets/TouchScript/Examples/Portal/Scripts/Planet.cs +++ b/Source/Assets/TouchScript/Examples/Portal/Scripts/Planet.cs @@ -8,6 +8,7 @@ namespace TouchScript.Examples.Portal { + /// public class Planet : MonoBehaviour { private enum PlanetStatus diff --git a/Source/Assets/TouchScript/Examples/Portal/Scripts/Rotator.cs b/Source/Assets/TouchScript/Examples/Portal/Scripts/Rotator.cs index 2e51297d1..6c43ca4ee 100644 --- a/Source/Assets/TouchScript/Examples/Portal/Scripts/Rotator.cs +++ b/Source/Assets/TouchScript/Examples/Portal/Scripts/Rotator.cs @@ -6,6 +6,7 @@ namespace TouchScript.Examples.Portal { + /// public class Rotator : MonoBehaviour { public float RotationSpeed = 1f; diff --git a/Source/Assets/TouchScript/Examples/Portal/Scripts/Spawner.cs b/Source/Assets/TouchScript/Examples/Portal/Scripts/Spawner.cs index db72cea3e..ada86c798 100644 --- a/Source/Assets/TouchScript/Examples/Portal/Scripts/Spawner.cs +++ b/Source/Assets/TouchScript/Examples/Portal/Scripts/Spawner.cs @@ -8,6 +8,7 @@ namespace TouchScript.Examples.Portal { + /// public class Spawner : MonoBehaviour { diff --git a/Source/Assets/TouchScript/Examples/Portal/Scripts/Vortex.cs b/Source/Assets/TouchScript/Examples/Portal/Scripts/Vortex.cs index fa59ba387..bc42ec982 100644 --- a/Source/Assets/TouchScript/Examples/Portal/Scripts/Vortex.cs +++ b/Source/Assets/TouchScript/Examples/Portal/Scripts/Vortex.cs @@ -6,6 +6,7 @@ namespace TouchScript.Examples.Portal { + /// public class Vortex : MonoBehaviour { private void OnTriggerEnter(Collider other) diff --git a/Source/Assets/TouchScript/Examples/RawInput/Scripts/Ball.cs b/Source/Assets/TouchScript/Examples/RawInput/Scripts/Ball.cs index d99706fcf..1a2cfc856 100644 --- a/Source/Assets/TouchScript/Examples/RawInput/Scripts/Ball.cs +++ b/Source/Assets/TouchScript/Examples/RawInput/Scripts/Ball.cs @@ -6,6 +6,7 @@ namespace TouchScript.Examples.RawInput { + /// public class Ball : MonoBehaviour { public float Speed = 1f; diff --git a/Source/Assets/TouchScript/Examples/RawInput/Scripts/Spawner.cs b/Source/Assets/TouchScript/Examples/RawInput/Scripts/Spawner.cs index b7f6fd2ae..a4c1a89ae 100644 --- a/Source/Assets/TouchScript/Examples/RawInput/Scripts/Spawner.cs +++ b/Source/Assets/TouchScript/Examples/RawInput/Scripts/Spawner.cs @@ -6,6 +6,7 @@ namespace TouchScript.Examples.RawInput { + /// public class Spawner : MonoBehaviour { public GameObject Prefab; diff --git a/Source/Assets/TouchScript/Examples/Taps/Scripts/Break.cs b/Source/Assets/TouchScript/Examples/Taps/Scripts/Break.cs index 404752b1e..dfcc6f05e 100644 --- a/Source/Assets/TouchScript/Examples/Taps/Scripts/Break.cs +++ b/Source/Assets/TouchScript/Examples/Taps/Scripts/Break.cs @@ -9,6 +9,7 @@ namespace TouchScript.Examples.Tap { + /// public class Break : MonoBehaviour { public float Power = 10.0f; diff --git a/Source/Assets/TouchScript/Examples/Taps/Scripts/Kick.cs b/Source/Assets/TouchScript/Examples/Taps/Scripts/Kick.cs index 757a0b662..8627b46a8 100644 --- a/Source/Assets/TouchScript/Examples/Taps/Scripts/Kick.cs +++ b/Source/Assets/TouchScript/Examples/Taps/Scripts/Kick.cs @@ -7,6 +7,7 @@ namespace TouchScript.Examples.Tap { + /// public class Kick : MonoBehaviour { public float Force = 3f; diff --git a/Source/Assets/TouchScript/Examples/Taps/Scripts/Spawn.cs b/Source/Assets/TouchScript/Examples/Taps/Scripts/Spawn.cs index 7f71494e5..040bc10a0 100644 --- a/Source/Assets/TouchScript/Examples/Taps/Scripts/Spawn.cs +++ b/Source/Assets/TouchScript/Examples/Taps/Scripts/Spawn.cs @@ -9,6 +9,7 @@ namespace TouchScript.Examples.Tap { + /// public class Spawn : MonoBehaviour { public Transform CubePrefab; diff --git a/Source/Assets/TouchScript/Examples/_misc/Scripts/ExamplesList.cs b/Source/Assets/TouchScript/Examples/_misc/Scripts/ExamplesList.cs index 6fde3c15c..3e2737ea4 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Scripts/ExamplesList.cs +++ b/Source/Assets/TouchScript/Examples/_misc/Scripts/ExamplesList.cs @@ -1,5 +1,6 @@ using UnityEngine; +/// public class ExamplesList : MonoBehaviour { diff --git a/Source/Assets/TouchScript/Examples/_misc/Scripts/Highlight.cs b/Source/Assets/TouchScript/Examples/_misc/Scripts/Highlight.cs index b20d1eb8e..89936a2f4 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Scripts/Highlight.cs +++ b/Source/Assets/TouchScript/Examples/_misc/Scripts/Highlight.cs @@ -5,6 +5,7 @@ using UnityEngine; using TouchScript.Behaviors.UI; +/// public class Highlight : MonoBehaviour { diff --git a/Source/Assets/TouchScript/Examples/_misc/Scripts/KillMe.cs b/Source/Assets/TouchScript/Examples/_misc/Scripts/KillMe.cs index 3f3754f17..52c84878a 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Scripts/KillMe.cs +++ b/Source/Assets/TouchScript/Examples/_misc/Scripts/KillMe.cs @@ -7,9 +7,7 @@ namespace TouchScript.Examples { - /// - /// When enabled this component destroys the GameObject it is attached to in seconds. - /// + /// public class KillMe : MonoBehaviour { public float Delay = 1f; diff --git a/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs b/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs index cae28f1cd..115c549b9 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs +++ b/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs @@ -16,9 +16,7 @@ namespace TouchScript.Examples { - /// - /// This component loads demo scenes in a loop. - /// + /// public class Runner : MonoBehaviour { private static Runner instance; diff --git a/Source/Assets/TouchScript/Examples/_misc/Scripts/ShowMe.cs b/Source/Assets/TouchScript/Examples/_misc/Scripts/ShowMe.cs index f7a60cfae..f4e1260f8 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Scripts/ShowMe.cs +++ b/Source/Assets/TouchScript/Examples/_misc/Scripts/ShowMe.cs @@ -1,6 +1,7 @@ using UnityEngine; using System.Collections; +/// public class ShowMe : MonoBehaviour { IEnumerator Start () diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs index 143703920..e355e991c 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs @@ -14,6 +14,7 @@ namespace TouchScript.Behaviors.Cursors /// Pointer visualizer which shows pointer circles with debug text using Unity UI. /// The script should be placed on an element with RectTransform or a Canvas. A reference prefab is provided in TouchScript package. /// + [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Behaviors_Cursors_CursorManager.htm")] public class CursorManager : MonoBehaviour { #region Public properties diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/MouseCursor.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/MouseCursor.cs index 764942022..290259ac7 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/MouseCursor.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/MouseCursor.cs @@ -6,12 +6,14 @@ using TouchScript.Behaviors.Cursors.UI; using TouchScript.Pointers; using TouchScript.Utils; +using UnityEngine; namespace TouchScript.Behaviors.Cursors { /// /// Cursor for mouse pointers. /// + [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Behaviors_Cursors_MouseCursor.htm")] public class MouseCursor : TextPointerCursor { #region Public properties @@ -27,7 +29,7 @@ public class MouseCursor : TextPointerCursor public TextureSwitch PressedCursor; /// - /// Should the value of be shown on the cursor. + /// Should the value of be shown on the cursor. /// public bool ShowButtons = false; diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/ObjectCursor.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/ObjectCursor.cs index 9a7c0d7d0..63d6f45d8 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/ObjectCursor.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/ObjectCursor.cs @@ -4,12 +4,14 @@ using System.Text; using TouchScript.Pointers; +using UnityEngine; namespace TouchScript.Behaviors.Cursors { /// /// Cursor for object pointers. /// + [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Behaviors_Cursors_ObjectCursor.htm")] public class ObjectCursor : TextPointerCursor { #region Public properties diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PenCursor.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PenCursor.cs index 93fe111d8..9f531d168 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PenCursor.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PenCursor.cs @@ -6,12 +6,14 @@ using TouchScript.Behaviors.Cursors.UI; using TouchScript.Pointers; using TouchScript.Utils; +using UnityEngine; namespace TouchScript.Behaviors.Cursors { /// /// Cursor for pen pointers. /// + [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Behaviors_Cursors_PenCursor.htm")] public class PenCursor : TextPointerCursor { #region Public properties @@ -27,7 +29,7 @@ public class PenCursor : TextPointerCursor public TextureSwitch PressedCursor; /// - /// Should the value of be shown on the cursor. + /// Should the value of be shown on the cursor. /// public bool ShowButtons = false; diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PointerCursor.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PointerCursor.cs index b58b5bcc4..417912115 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PointerCursor.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PointerCursor.cs @@ -116,6 +116,7 @@ protected sealed override uint getPointerHash(IPointer pointer) /// /// Visual cursor implementation used by TouchScript. /// + [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Behaviors_Cursors_PointerCursor.htm")] public class PointerCursor : MonoBehaviour { #region Consts @@ -125,9 +126,24 @@ public class PointerCursor : MonoBehaviour /// public enum CursorState { + /// + /// Not pressed. + /// Released, + + /// + /// Pressed. + /// Pressed, + + /// + /// Over something. + /// Over, + + /// + /// Over and pressed. + /// OverPressed } diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/TouchCursor.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/TouchCursor.cs index 725b1cf91..e6c1ce249 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/TouchCursor.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/TouchCursor.cs @@ -4,12 +4,14 @@ using System.Text; using TouchScript.Pointers; +using UnityEngine; namespace TouchScript.Behaviors.Cursors { /// /// Cursor for touch pointers. /// + [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Behaviors_Cursors_TouchCursor.htm")] public class TouchCursor : TextPointerCursor { #region Public properties diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI/GradientTexture.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI/GradientTexture.cs index 51c62a463..2040a1a66 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI/GradientTexture.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI/GradientTexture.cs @@ -12,6 +12,7 @@ namespace TouchScript.Behaviors.Cursors.UI /// /// Generates a texture with a circle gradient. /// + [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Behaviors_Cursors_UI_GradientTexture.htm")] public class GradientTexture : MonoBehaviour { /// @@ -19,11 +20,34 @@ public class GradientTexture : MonoBehaviour /// public enum Res { + /// + /// 16x16 + /// Pix16 = 16, + + /// + /// 32x32 + /// Pix32 = 32, + + /// + /// 64x64 + /// Pix64 = 64, + + /// + /// 128x128 + /// Pix128 = 128, + + /// + /// 256x256 + /// Pix256 = 256, + + /// + /// 512x512 + /// Pix512 = 512 } diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI/TextureSwitch.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI/TextureSwitch.cs index 50d6e8d4e..6c3d6ab14 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI/TextureSwitch.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/UI/TextureSwitch.cs @@ -9,6 +9,7 @@ namespace TouchScript.Behaviors.Cursors.UI /// /// A helper class to turn on and off without causing allocations. /// + [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Behaviors_Cursors_UI_TextureSwitch.htm")] public class TextureSwitch : MonoBehaviour { diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/UI/OverHelper.cs b/Source/Assets/TouchScript/Scripts/Behaviors/UI/OverHelper.cs index b51108af1..03ed25894 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/UI/OverHelper.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/UI/OverHelper.cs @@ -15,7 +15,7 @@ namespace TouchScript.Behaviors.UI /// This component listens for pointer events and dispatches event when the first touch enters the area of the GameObject it is attached to and event when the last touch leaves it. /// [AddComponentMenu("TouchScript/Behaviors/OverHelper")] - [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Behaviors_OverHelper.htm")] + [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Behaviors_UI_OverHelper.htm")] public class OverHelper : MonoBehaviour { diff --git a/Source/Assets/TouchScript/Scripts/Devices/Display/DisplayDevice.cs b/Source/Assets/TouchScript/Scripts/Devices/Display/DisplayDevice.cs index 30a80f7aa..66b1df59f 100644 --- a/Source/Assets/TouchScript/Scripts/Devices/Display/DisplayDevice.cs +++ b/Source/Assets/TouchScript/Scripts/Devices/Display/DisplayDevice.cs @@ -12,6 +12,7 @@ namespace TouchScript.Devices.Display /// /// A simple display device which inherits from and can be saved in Unity assets. /// + [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Devices_Display_DisplayDevice.htm")] public class DisplayDevice : ScriptableObject, IDisplayDevice { #if UNITY_EDITOR @@ -65,9 +66,15 @@ public virtual Vector2 NativeResolution [SerializeField] protected float dpi = 96; + /// + /// Native device dpi. + /// [SerializeField] protected float nativeDPI = 96; + /// + /// Native device resolution. + /// [SerializeField] protected Vector2 nativeResolution = new Vector2(1920, 1080); diff --git a/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs b/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs index 1c22f167b..91904703d 100644 --- a/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs +++ b/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs @@ -13,6 +13,7 @@ namespace TouchScript.Devices.Display /// /// Display device which tries to guess current DPI if it's not set by platform. /// + [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Devices_Display_GenericDisplayDevice.htm")] public class GenericDisplayDevice : DisplayDevice { private static bool IsLaptop diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs index ec4bf0180..59b285373 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs @@ -22,7 +22,10 @@ public abstract class Gesture : DebuggableMonoBehaviour { #region Constants - [Serializable] + /// + /// Unity event for gesture state changes. + /// + [Serializable] public class GestureEvent : UnityEvent {} /// @@ -437,9 +440,8 @@ protected IGestureManager gestureManager /// protected Transform cachedTransform; -#pragma warning disable CS0414 - - [SerializeField] + /// + [SerializeField] [HideInInspector] protected bool basicEditor = true; @@ -455,8 +457,6 @@ protected IGestureManager gestureManager [HideInInspector] private bool advancedProps; // Used in the custom inspector -#pragma warning restore CS0414 - [SerializeField] private int minPointers = 0; diff --git a/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs index d0c33d839..490d35555 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs @@ -42,6 +42,9 @@ public event EventHandler LongPressed // Needed to overcome iOS AOT limitations private EventHandler longPressedInvoker; + /// + /// Unity event, occurs when gesture is recognized. + /// public GestureEvent OnLongPress = new GestureEvent(); #endregion diff --git a/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs index d25621db5..b1cfef1f1 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs @@ -47,6 +47,9 @@ public event EventHandler Pressed // Needed to overcome iOS AOT limitations private EventHandler pressedInvoker; + /// + /// Unity event, occurs when gesture is recognized. + /// public GestureEvent OnPress = new GestureEvent(); #endregion diff --git a/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs index 65d86d30c..e0bbf9b24 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs @@ -42,6 +42,9 @@ public event EventHandler Released // Needed to overcome iOS AOT limitations private EventHandler releasedInvoker; + /// + /// Unity event, occurs when gesture is recognized. + /// public GestureEvent OnRelease = new GestureEvent(); #endregion diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs index 5dbd831a4..f4790d3b2 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs @@ -42,6 +42,9 @@ public event EventHandler Tapped // Needed to overcome iOS AOT limitations private EventHandler tappedInvoker; + /// + /// Unity event, occurs when gesture is recognized. + /// public GestureEvent OnTap = new GestureEvent(); #endregion @@ -86,24 +89,24 @@ public float DistanceLimit } } - /// - /// Gets or sets the flag if pointers should be treated as a cluster. - /// - /// true if pointers should be treated as a cluster; otherwise, false. - /// - /// At the end of a gesture when pointers are lifted off due to the fact that computers are faster than humans the very last pointer's position will be gesture's after that. This flag is used to combine several pointers which from the point of a user were lifted off simultaneously and set their centroid as gesture's . - /// - public bool CombinePointers + /// + /// Gets or sets the flag if pointers should be treated as a cluster. + /// + /// true if pointers should be treated as a cluster; otherwise, false. + /// + /// At the end of a gesture when pointers are lifted off due to the fact that computers are faster than humans the very last pointer's position will be gesture's after that. This flag is used to combine several pointers which from the point of a user were lifted off simultaneously and set their centroid as gesture's . + /// + public bool CombinePointers { get { return combinePointers; } set { combinePointers = value; } } - /// - /// Gets or sets time interval before gesture is recognized to combine all lifted pointers into a cluster to use its center as . - /// - /// Time in seconds to treat pointers lifted off during this interval as a single gesture. - public float CombinePointersInterval + /// + /// Gets or sets time interval before gesture is recognized to combine all lifted pointers into a cluster to use its center as . + /// + /// Time in seconds to treat pointers lifted off during this interval as a single gesture. + public float CombinePointersInterval { get { return combinePointersInterval; } set { combinePointersInterval = value; } diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/OnePointTrasformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/OnePointTrasformGestureBase.cs index aea307755..40abbf73a 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/OnePointTrasformGestureBase.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/OnePointTrasformGestureBase.cs @@ -273,6 +273,7 @@ protected virtual Vector2 getPointPreviousScreenPosition() return activePointers[0].PreviousPosition; } + /// protected override void updateType() { type = type & ~TransformGesture.TransformType.Translation; diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs index 53d31583f..13acb87bc 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs @@ -67,8 +67,19 @@ public event EventHandler TransformCompleted // Needed to overcome iOS AOT limitations private EventHandler transformStartedInvoker, transformedInvoker, transformCompletedInvoker; + /// + /// Unity event, occurs when the gesture starts. + /// public GestureEvent OnTransformStart = new GestureEvent(); + + /// + /// Unity event, occurs when the gesture is updated. + /// public GestureEvent OnTransform = new GestureEvent(); + + /// + /// Unity event, occurs when the gesture ends. + /// public GestureEvent OnTransformComplete = new GestureEvent(); #endregion @@ -147,6 +158,9 @@ public Vector3 RotationAxis /// protected float screenTransformPixelThresholdSquared; + /// + /// The bit mask of what transform operations happened this frame. + /// protected TransformGesture.TransformType transformMask; /// @@ -185,6 +199,9 @@ public Vector3 RotationAxis /// protected Vector3 targetPosition; + /// + /// The type of the transforms this gesture can dispatch. + /// [SerializeField] protected TransformGesture.TransformType type = TransformGesture.TransformType.Translation | TransformGesture.TransformType.Scaling | TransformGesture.TransformType.Rotation; @@ -322,9 +339,15 @@ protected override void reset() #region Protected methods + /// + /// Updates the type of the gesture. + /// protected virtual void updateType() {} - protected void resetValues() + /// + /// Resets the frame delta values. + /// + protected void resetValues() { deltaPosition = Vector3.zero; deltaRotation = 0f; diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TwoPointTransformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TwoPointTransformGestureBase.cs index 934bb200f..1f7884624 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TwoPointTransformGestureBase.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TwoPointTransformGestureBase.cs @@ -15,6 +15,9 @@ namespace TouchScript.Gestures.TransformGestures.Base { + /// + /// Abstract base classfor two-point transform gestures. + /// public abstract class TwoPointTransformGestureBase : TransformGestureBase { #region Constants diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredPinnedTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredPinnedTransformGesture.cs index 6925bdb4d..863058e5b 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredPinnedTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredPinnedTransformGesture.cs @@ -14,7 +14,7 @@ namespace TouchScript.Gestures.TransformGestures.Clustered /// Should be used for large touch surfaces. /// [AddComponentMenu("TouchScript/Gestures/Clustered/Pinned Transform Gesture (Clustered)")] - [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Gestures_Clustered_ClusteredPinnedTransformGesture.htm")] + [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Gestures_TransformGestures_Clustered_ClusteredPinnedTransformGesture.htm")] public class ClusteredPinnedTransformGesture : PinnedTransformGesture { #region Protected methods diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredScreenTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredScreenTransformGesture.cs index d64a99af6..9f34c1787 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredScreenTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredScreenTransformGesture.cs @@ -14,7 +14,7 @@ namespace TouchScript.Gestures.TransformGestures.Clustered /// Should be used for large touch surfaces. /// [AddComponentMenu("TouchScript/Gestures/Clustered/Screen Transform Gesture (Clustered)")] - [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Gestures_Clustered_ClusteredScreenTransformGesture.htm")] + [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Gestures_TransformGestures_Clustered_ClusteredScreenTransformGesture.htm")] public class ClusteredScreenTransformGesture : ScreenTransformGesture { #region Private variables diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredTransformGesture.cs index cd7c24ad7..cbd15f599 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredTransformGesture.cs @@ -14,7 +14,7 @@ namespace TouchScript.Gestures.TransformGestures.Clustered /// Should be used for large touch surfaces. /// [AddComponentMenu("TouchScript/Gestures/Clustered/Transform Gesture (Clustered)")] - [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Gestures_Clustered_ClusteredTransformGesture.htm")] + [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Gestures_TransformGestures_Clustered_ClusteredTransformGesture.htm")] public class ClusteredTransformGesture : TransformGesture { #region Private variables diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs index 240d369e8..87a6c4bbd 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs @@ -18,7 +18,7 @@ namespace TouchScript.Gestures.TransformGestures /// Recognizes a transform gesture around center of the object, i.e. one finger rotation, scaling or a combination of these. /// [AddComponentMenu("TouchScript/Gestures/Pinned Transform Gesture")] - [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Gestures_PinnedTransformGesture.htm")] + [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Gestures_TransformGestures_PinnedTransformGesture.htm")] public class PinnedTransformGesture : OnePointTrasformGestureBase { #region Constants diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/ScreenTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/ScreenTransformGesture.cs index f4edaf962..d3ffc4c47 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/ScreenTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/ScreenTransformGesture.cs @@ -17,7 +17,7 @@ namespace TouchScript.Gestures.TransformGestures /// Recognizes a transform gesture in screen space, i.e. translation, rotation, scaling or a combination of these. /// [AddComponentMenu("TouchScript/Gestures/Screen Transform Gesture")] - [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Gestures_ScreenTransformGesture.htm")] + [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Gestures_TransformGestures_ScreenTransformGesture.htm")] public class ScreenTransformGesture : TwoPointTransformGestureBase { #region Unity diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs index 483e8cc7e..a52b065ed 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs @@ -1,4 +1,4 @@ -/* +/* * @author Valentin Simonov / http://va.lent.in/ */ @@ -19,7 +19,7 @@ namespace TouchScript.Gestures.TransformGestures /// Recognizes a transform gesture, i.e. translation, rotation, scaling or a combination of these. /// [AddComponentMenu("TouchScript/Gestures/Transform Gesture")] - [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Gestures_TransformGesture.htm")] + [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Gestures_TransformGestures_TransformGesture.htm")] public class TransformGesture : TwoPointTransformGestureBase { #region Constants @@ -200,6 +200,14 @@ protected override void pointersReleased(IList pointers) #region Protected methods + /// + /// Projects the point which was scaled and rotated. + /// + /// The point. + /// Delta rotation. + /// Delta scale. + /// The projection parameters. + /// protected Vector3 projectScaledRotated(Vector2 point, float dR, float dS, ProjectionParams projectionParams) { var center = targetPositionOverridden ? targetPosition : cachedTransform.position; diff --git a/Source/Assets/TouchScript/Scripts/Hit/HitData.cs b/Source/Assets/TouchScript/Scripts/Hit/HitData.cs index 23ad00c00..a8daecfdb 100644 --- a/Source/Assets/TouchScript/Scripts/Hit/HitData.cs +++ b/Source/Assets/TouchScript/Scripts/Hit/HitData.cs @@ -240,6 +240,8 @@ public int SortingOrder /// Initializes a new instance of the struct. /// /// Target Target. + /// Touch layer this hit came from. + /// If the hit is screenspace UI. public HitData(Transform target, TouchLayer layer, bool screenSpace = false) { this.target = target; @@ -258,6 +260,8 @@ public HitData(Transform target, TouchLayer layer, bool screenSpace = false) /// Initializes a new instance of the struct from a 3D raycast. /// /// 3D raycast value. + /// Touch layer this hit came from. + /// If the hit is screenspace UI. public HitData(RaycastHit value, TouchLayer layer, bool screenSpace = false) : this(value.collider.transform, layer, screenSpace) { raycastHit = value; @@ -268,6 +272,8 @@ public HitData(RaycastHit value, TouchLayer layer, bool screenSpace = false) : t /// Initializes a new instance of the struct from a 2D raycast. /// /// 2D raycast value. + /// Touch layer this hit came from. + /// If the hit is screenspace UI. public HitData(RaycastHit2D value, TouchLayer layer, bool screenSpace = false) : this(value.collider.transform, layer, screenSpace) { @@ -279,6 +285,8 @@ public HitData(RaycastHit2D value, TouchLayer layer, bool screenSpace = false) : /// Initializes a new instance of the struct from a UI raycast. /// /// UI raycast value. + /// Touch layer this hit came from. + /// If the hit is screenspace UI. public HitData(RaycastHitUI value, TouchLayer layer, bool screenSpace = false) : this(value.Target, layer, screenSpace) { diff --git a/Source/Assets/TouchScript/Scripts/Hit/HitTest.cs b/Source/Assets/TouchScript/Scripts/Hit/HitTest.cs index 25d8ebcd8..b9092dea7 100644 --- a/Source/Assets/TouchScript/Scripts/Hit/HitTest.cs +++ b/Source/Assets/TouchScript/Scripts/Hit/HitTest.cs @@ -40,6 +40,7 @@ public abstract class HitTest : MonoBehaviour /// /// Determines whether a pointer hit the object. /// + /// Pointer to raycast. /// Data from a raycast. /// if pointer hits the object, if it doesn't, if it doesn't and this pointer must be ignored, Error otherwise. public virtual HitResult IsHit(IPointer pointer, HitData hit) diff --git a/Source/Assets/TouchScript/Scripts/Hit/RaycastHitUI.cs b/Source/Assets/TouchScript/Scripts/Hit/RaycastHitUI.cs index 6bc18a794..970e8a532 100644 --- a/Source/Assets/TouchScript/Scripts/Hit/RaycastHitUI.cs +++ b/Source/Assets/TouchScript/Scripts/Hit/RaycastHitUI.cs @@ -8,9 +8,7 @@ namespace TouchScript.Hit { - /// - /// A structure to hold data while raycasting into UI elements. - /// + /// public struct RaycastHitUI { public Transform Target; diff --git a/Source/Assets/TouchScript/Scripts/ITouchManager.cs b/Source/Assets/TouchScript/Scripts/ITouchManager.cs index 4a8773885..375a859c4 100644 --- a/Source/Assets/TouchScript/Scripts/ITouchManager.cs +++ b/Source/Assets/TouchScript/Scripts/ITouchManager.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using TouchScript.Devices.Display; using TouchScript.InputSources; +using TouchScript.Layers; using TouchScript.Pointers; namespace TouchScript @@ -93,7 +94,7 @@ public interface ITouchManager float DPI { get; } /// - /// Indicates if TouchScript should create a for you if no layers present in a scene. + /// Indicates if TouchScript should create a for you if no layers present in a scene. /// /// true if a CameraLayer should be created on startup; otherwise, false. /// This is usually a desired behavior but sometimes you would want to turn this off if you are using TouchScript only to get pointer input from some device. @@ -165,7 +166,7 @@ public interface ITouchManager /// Cancels a pointer and returns it to the system of need. /// /// Pointer id to cancel. - /// Should the pointer be returned to the system. + /// If the pointer should be redispatched to the system. void CancelPointer(int id, bool shouldReturn); /// diff --git a/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs b/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs index a2dc86a75..2f60e4b6d 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs @@ -2,6 +2,7 @@ * @author Valentin Simonov / http://va.lent.in/ */ +using TouchScript.Core; using TouchScript.Pointers; namespace TouchScript.InputSources @@ -22,7 +23,7 @@ public interface IInputSource : INTERNAL_IInputSource ICoordinatesRemapper CoordinatesRemapper { get; set; } /// - /// This method is called by to synchronously update the input. + /// This method is called by to synchronously update the input. /// bool UpdateInput(); @@ -40,6 +41,9 @@ public interface IInputSource : INTERNAL_IInputSource bool CancelPointer(Pointer pointer, bool shouldReturn); } + /// + /// Internal methods for . DO NOT USE ANY OF THEM! + /// public interface INTERNAL_IInputSource { /// diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs index 674341e08..9410a5d95 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs @@ -263,7 +263,9 @@ public bool CancelPointer(Pointer pointer, bool shouldReturn) return false; } - /// + /// + /// Releases resources. + /// public void Dispose() { if (mousePointer != null) diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs index 340b5cc45..ad7273d25 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs @@ -179,7 +179,9 @@ public bool CancelPointer(Pointer pointer, bool shouldReturn) return false; } - /// + /// + /// Releases resources. + /// public void Dispose() { foreach (var touchState in systemToInternalId) diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs index ce0a51217..c62c43247 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs @@ -290,7 +290,9 @@ public virtual bool CancelPointer(Pointer pointer, bool shouldReturn) return false; } - /// + /// + /// Releases resources. + /// public virtual void Dispose() { foreach (var i in winTouchToInternalId) cancelPointer(i.Value); diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs index 7d7222327..bd6d5d065 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs @@ -38,18 +38,15 @@ public ICoordinatesRemapper CoordinatesRemapper } } - #endregion - - #region Private variables + #endregion -#pragma warning disable CS0414 + #region Private variables - [SerializeField] + /// + [SerializeField] [HideInInspector] protected bool basicEditor = true; -#pragma warning restore CS0414 - private ICoordinatesRemapper coordinatesRemapper; private TouchManagerInstance manager; @@ -179,7 +176,7 @@ protected virtual void updateCoordinatesRemapper(ICoordinatesRemapper remapper) /// Remaps the coordinates using the if it is set. /// /// The position. - /// Remapped position if is set; otherwise. + /// Remapped position if is set; the value of position argument otherwise. protected virtual Vector2 remapCoordinates(Vector2 position) { if (coordinatesRemapper != null) return coordinatesRemapper.Remap(position); diff --git a/Source/Assets/TouchScript/Scripts/LayerManager.cs b/Source/Assets/TouchScript/Scripts/LayerManager.cs index f0d4bff5f..15a489a43 100644 --- a/Source/Assets/TouchScript/Scripts/LayerManager.cs +++ b/Source/Assets/TouchScript/Scripts/LayerManager.cs @@ -10,6 +10,7 @@ namespace TouchScript /// /// Facade for current instance of . /// + [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_LayerManager.htm")] public sealed class LayerManager : MonoBehaviour { /// diff --git a/Source/Assets/TouchScript/Scripts/Layers/ProjectionParams.cs b/Source/Assets/TouchScript/Scripts/Layers/ProjectionParams.cs index 3a68972a2..64ce549eb 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/ProjectionParams.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/ProjectionParams.cs @@ -87,7 +87,7 @@ public class WorldSpaceCanvasProjectionParams : ProjectionParams protected Camera camera; /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// The canvas. public WorldSpaceCanvasProjectionParams(Canvas canvas) diff --git a/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs index e482c3478..59e6bf6e0 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs @@ -20,6 +20,7 @@ namespace TouchScript.Layers /// /// [AddComponentMenu("TouchScript/Layers/Standard Layer")] + [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Layers_StandardLayer.htm")] public class StandardLayer : TouchLayer { #region Public properties diff --git a/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs index 73a19ab44..286cd98c3 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs @@ -20,7 +20,7 @@ namespace TouchScript.Layers /// /// /// In TouchScript it's a layer's job to determine if a pointer on the screen hits anything in Unity's 3d/2d world. - /// keeps a sorted list of all layers in which it queries when a new pointer appears. It's a layer's job to return if this pointer hits an object. Layers can even be used to "hit" objects outside of Unity's 3d world, for example Scaleform integration is implemented this way. + /// keeps a sorted list of all layers in which it queries when a new pointer appears. It's a layer's job to return if this pointer hits an object. Layers can even be used to "hit" objects outside of Unity's 3d world, for example Scaleform integration is implemented this way. /// Layers can be configured in a scene using or from code using API. /// If you want to route pointers and manually control which objects they should "pointer" it's better to create a new layer extending . /// @@ -73,6 +73,9 @@ public virtual Vector3 WorldProjectionNormal /// protected ProjectionParams layerProjectionParams; + /// + /// Layer manager. + /// protected ILayerManager manager; #endregion @@ -100,7 +103,7 @@ public virtual ProjectionParams GetProjectionParams(Pointer pointer) /// /// Pointer. /// Hit result. - /// true, if an object is hit, ; false otherwise. + /// true, if an object is hit, ; false otherwise. public virtual HitResult Hit(IPointer pointer, out HitData hit) { hit = default(HitData); @@ -192,6 +195,12 @@ internal void INTERNAL_CancelPointer(Pointer pointer) #region Protected functions + /// + /// Checks the hit filters. + /// + /// The pointer. + /// HitData for the pointer. + /// protected HitResult checkHitFilters(IPointer pointer, HitData hit) { hit.Target.GetComponents(tmpHitTestList); diff --git a/Source/Assets/TouchScript/Scripts/Pointers/IPointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/IPointer.cs index f7eba21da..a9e223cef 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/IPointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/IPointer.cs @@ -8,6 +8,9 @@ namespace TouchScript.Pointers { + /// + /// Interface for an abstract pointer. + /// public interface IPointer { /// @@ -42,7 +45,7 @@ public interface IPointer Vector2 PreviousPosition { get; } /// - /// Gets or sets pointer flags: + /// Gets or sets pointer flags: /// Note: setting this property doesn't immediately change its value, the value actually changes during the next TouchManager update phase. /// uint Flags { get; } diff --git a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs index 8ce785202..d00db78af 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs @@ -73,9 +73,15 @@ public enum PointerType Object } + /// + /// The state of buttons for a pointer. Combines 3 types of button events: Pressed (holding a button), Down (just pressed this frame) and Up (released this frame). + /// [Flags] public enum PointerButtonState { + /// + /// No button is pressed. + /// Nothing = 0, /// @@ -258,7 +264,7 @@ public HitData GetPressData() } /// - /// Copies values from . + /// Copies values from the target. /// /// The target pointer to copy values from. public virtual void CopyFrom(Pointer target) diff --git a/Source/Assets/TouchScript/Scripts/Pointers/PointerFactory.cs b/Source/Assets/TouchScript/Scripts/Pointers/PointerFactory.cs index 900ebd5db..f90184666 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/PointerFactory.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/PointerFactory.cs @@ -12,7 +12,7 @@ namespace TouchScript.Pointers public static class PointerFactory { /// - /// Creates a pointer of type attached to input source. + /// Creates a pointer of certain type attached to the input source. /// /// Pointer type to create. /// Input source to attach the pointer to. diff --git a/Source/Assets/TouchScript/Scripts/TouchManager.cs b/Source/Assets/TouchScript/Scripts/TouchManager.cs index c82434b4a..98d50e8d7 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManager.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManager.cs @@ -37,7 +37,6 @@ public sealed class TouchManager : DebuggableMonoBehaviour /// /// Event implementation in Unity EventSystem for pointer events. /// - /// [Serializable] public class PointerEvent : UnityEvent> {} diff --git a/Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs b/Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs index 31a71ecc2..5b7cf1f92 100644 --- a/Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs +++ b/Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs @@ -14,10 +14,7 @@ namespace TouchScript.Utils { - /// - /// Object pool implementation used in TouchScript. - /// - /// + /// public class ObjectPool where T : class { public delegate T0 UnityFunc(); From 283e2b6be612bb923878f49c3ae1b55a2d84889f Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Thu, 27 Jul 2017 14:31:09 +0300 Subject: [PATCH 41/58] Fixed Transformer not working with other components modifying object's TRS. --- .../TouchScript/Examples/Photos/Photos.unity | 26 +-- .../Scripts/Behaviors/Transformer.cs | 158 +++++++++++------- .../TransformGestures/TransformGesture.cs | 19 ++- 3 files changed, 115 insertions(+), 88 deletions(-) diff --git a/Source/Assets/TouchScript/Examples/Photos/Photos.unity b/Source/Assets/TouchScript/Examples/Photos/Photos.unity index 225a82457..98d433d84 100644 --- a/Source/Assets/TouchScript/Examples/Photos/Photos.unity +++ b/Source/Assets/TouchScript/Examples/Photos/Photos.unity @@ -957,7 +957,7 @@ MonoBehaviour: enableSmoothing: 1 smoothingFactor: 0.0001 positionThreshold: 0.0001 - rotationThreshold: 0.01 + rotationThreshold: 0.1 scaleThreshold: 0.0001 allowChangingFromOutside: 0 --- !u!114 &238072901 @@ -971,7 +971,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 OnStateChange: m_PersistentCalls: m_Calls: [] @@ -1022,7 +1021,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 OnStateChange: m_PersistentCalls: m_Calls: [] @@ -1602,7 +1600,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 OnStateChange: m_PersistentCalls: m_Calls: [] @@ -1641,7 +1638,7 @@ MonoBehaviour: enableSmoothing: 0 smoothingFactor: 0.0001 positionThreshold: 0.0001 - rotationThreshold: 0.01 + rotationThreshold: 0.1 scaleThreshold: 0.0001 allowChangingFromOutside: 0 --- !u!114 &449324831 @@ -1655,7 +1652,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 OnStateChange: m_PersistentCalls: m_Calls: [] @@ -1859,7 +1855,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 OnStateChange: m_PersistentCalls: m_Calls: [] @@ -1898,7 +1893,7 @@ MonoBehaviour: enableSmoothing: 0 smoothingFactor: 0.0001 positionThreshold: 0.0001 - rotationThreshold: 0.01 + rotationThreshold: 0.1 scaleThreshold: 0.0001 allowChangingFromOutside: 0 --- !u!114 &536919392 @@ -1912,7 +1907,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 OnStateChange: m_PersistentCalls: m_Calls: [] @@ -2825,7 +2819,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 OnStateChange: m_PersistentCalls: m_Calls: [] @@ -2864,7 +2857,7 @@ MonoBehaviour: enableSmoothing: 1 smoothingFactor: 0.0001 positionThreshold: 0.0001 - rotationThreshold: 0.01 + rotationThreshold: 0.1 scaleThreshold: 0.0001 allowChangingFromOutside: 0 --- !u!114 &886654115 @@ -2878,7 +2871,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 OnStateChange: m_PersistentCalls: m_Calls: [] @@ -3370,7 +3362,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.30900002, y: 0} m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: -0.13402176, y: -21.09999} + m_AnchoredPosition: {x: -0.13401794, y: -21.09999} m_SizeDelta: {x: -0.26796, y: 29.8} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1027187499 @@ -4697,7 +4689,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 OnStateChange: m_PersistentCalls: m_Calls: [] @@ -4736,7 +4727,7 @@ MonoBehaviour: enableSmoothing: 0 smoothingFactor: 0.0001 positionThreshold: 0.0001 - rotationThreshold: 0.01 + rotationThreshold: 0.1 scaleThreshold: 0.0001 allowChangingFromOutside: 0 --- !u!114 &1485721906 @@ -4750,7 +4741,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 OnStateChange: m_PersistentCalls: m_Calls: [] @@ -5502,7 +5492,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 OnStateChange: m_PersistentCalls: m_Calls: [] @@ -5541,7 +5530,7 @@ MonoBehaviour: enableSmoothing: 1 smoothingFactor: 0.0001 positionThreshold: 0.0001 - rotationThreshold: 0.01 + rotationThreshold: 0.1 scaleThreshold: 0.0001 allowChangingFromOutside: 0 --- !u!114 &1979821164 @@ -5555,7 +5544,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 OnStateChange: m_PersistentCalls: m_Calls: [] diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs index 970b86cbb..af22125cc 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs @@ -18,13 +18,34 @@ namespace TouchScript.Behaviors [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Behaviors_Transformer.htm")] public class Transformer : MonoBehaviour { + // Here's how it works. + // + // If smoothing is not enabled, the component just gets gesture events in stateChangedHandler(), passes Changed event to manualUpdate() which calls applyValues() to sett updated values. + // The value of transformMask is used to only set values which were changed not to interfere with scripts changing this values. + // + // If smoothing is enabled — targetPosition, targetScale, targetRotation are cached and a lerp from current position to these target positions is applied every frame in update() method. It also checks transformMask to change only needed values. + // If none of the delta values pass the threshold, the component transitions to idle state. #region Consts + /// + /// State for internal Transformer state machine. + /// private enum TransformerState { + /// + /// Nothing is happening. + /// Idle, + + /// + /// The object is under manual control, i.e. user is transforming it. + /// Manual, + + /// + /// The object is under automatic control, i.e. it's being smoothly moved into target position when user lifted all fingers off. + /// Automatic } @@ -53,10 +74,7 @@ public bool EnableSmoothing public float SmoothingFactor { get { return smoothingFactor * 100000f; } - set - { - smoothingFactor = Mathf.Clamp(value / 100000f, 0, 1); - } + set { smoothingFactor = Mathf.Clamp(value / 100000f, 0, 1); } } /// @@ -107,25 +125,25 @@ public bool AllowChangingFromOutside set { allowChangingFromOutside = value; } } - #endregion + #endregion - #region Private variables + #region Private variables - [SerializeField] + [SerializeField] [ToggleLeft] private bool enableSmoothing = false; [SerializeField] - private float smoothingFactor = 1f/100000f; + private float smoothingFactor = 1f / 100000f; [SerializeField] - private float positionThreshold = 0.0001f; + private float positionThreshold = 0.01f; [SerializeField] - private float rotationThreshold = 0.01f; + private float rotationThreshold = 0.1f; [SerializeField] - private float scaleThreshold = 0.0001f; + private float scaleThreshold = 0.01f; [SerializeField] [ToggleLeft] @@ -136,6 +154,7 @@ public bool AllowChangingFromOutside private TransformGestureBase gesture; private Transform cachedTransform; + private TransformGesture.TransformType transformMask; private Vector3 targetPosition, targetScale; private Quaternion targetRotation; @@ -187,6 +206,8 @@ private void stateIdle() if (newLocalScale != transform.localScale) transform.localScale = newLocalScale; transform.rotation = lastRotation = targetRotation; } + + transformMask = TransformGesture.TransformType.None; } private void stateManual() @@ -196,13 +217,14 @@ private void stateManual() targetPosition = lastPosition = cachedTransform.position; targetRotation = lastRotation = cachedTransform.rotation; targetScale = lastScale = cachedTransform.localScale; + transformMask = TransformGesture.TransformType.None; } private void stateAutomatic() { setState(TransformerState.Automatic); - if (!enableSmoothing) stateIdle(); + if (!enableSmoothing || transformMask == TransformGesture.TransformType.None) stateIdle(); } private void setState(TransformerState newState) @@ -221,71 +243,82 @@ private void update() if (!enableSmoothing) return; var fraction = 1 - Mathf.Pow(smoothingFactor, Time.unscaledDeltaTime); + var changed = false; - var scale = transform.localScale; - if (allowChangingFromOutside) - { - // Changed by someone else. - // Need to make sure to check per component here. - if (!Mathf.Approximately(scale.x, lastScale.x)) - targetScale.x = scale.x; - if (!Mathf.Approximately(scale.y, lastScale.y)) - targetScale.y = scale.y; - if (!Mathf.Approximately(scale.z, lastScale.z)) - targetScale.z = scale.z; - } - var newLocalScale = Vector3.Lerp(scale, targetScale, fraction); - // Prevent recalculating colliders when no scale occurs. - if (newLocalScale != scale) + if ((transformMask & TransformGesture.TransformType.Scaling) != 0) { - transform.localScale = newLocalScale; - // Something might have adjusted our scale. - lastScale = transform.localScale; + var scale = transform.localScale; + if (allowChangingFromOutside) + { + // Changed by someone else. + // Need to make sure to check per component here. + if (!Mathf.Approximately(scale.x, lastScale.x)) + targetScale.x = scale.x; + if (!Mathf.Approximately(scale.y, lastScale.y)) + targetScale.y = scale.y; + if (!Mathf.Approximately(scale.z, lastScale.z)) + targetScale.z = scale.z; + } + var newLocalScale = Vector3.Lerp(scale, targetScale, fraction); + // Prevent recalculating colliders when no scale occurs. + if (newLocalScale != scale) + { + transform.localScale = newLocalScale; + // Something might have adjusted our scale. + lastScale = transform.localScale; + } + + if (state == TransformerState.Automatic && !changed && (targetScale - lastScale).sqrMagnitude > scaleThreshold) changed = true; } - if (allowChangingFromOutside) + if ((transformMask & TransformGesture.TransformType.Rotation) != 0) { - // Changed by someone else. - if (transform.rotation != lastRotation) targetRotation = transform.rotation; + if (allowChangingFromOutside) + { + // Changed by someone else. + if (transform.rotation != lastRotation) targetRotation = transform.rotation; + } + transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, fraction); + // Something might have adjusted our rotation. + lastRotation = transform.rotation; + + if (state == TransformerState.Automatic && !changed && Quaternion.Angle(targetRotation, lastRotation) > rotationThreshold) changed = true; } - transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, fraction); - // Something might have adjusted our rotation. - lastRotation = transform.rotation; - var pos = transform.position; - if (allowChangingFromOutside) + if ((transformMask & TransformGesture.TransformType.Translation) != 0) { - // Changed by someone else. - // Need to make sure to check per component here. - if (!Mathf.Approximately(pos.x, lastPosition.x)) - targetPosition.x = pos.x; - if (!Mathf.Approximately(pos.y, lastPosition.y)) - targetPosition.y = pos.y; - if (!Mathf.Approximately(pos.z, lastPosition.z)) - targetPosition.z = pos.z; + var pos = transform.position; + if (allowChangingFromOutside) + { + // Changed by someone else. + // Need to make sure to check per component here. + if (!Mathf.Approximately(pos.x, lastPosition.x)) + targetPosition.x = pos.x; + if (!Mathf.Approximately(pos.y, lastPosition.y)) + targetPosition.y = pos.y; + if (!Mathf.Approximately(pos.z, lastPosition.z)) + targetPosition.z = pos.z; + } + transform.position = Vector3.Lerp(pos, targetPosition, fraction); + // Something might have adjusted our position (most likely Unity UI). + lastPosition = transform.position; + + if (state == TransformerState.Automatic && !changed && (targetPosition - lastPosition).sqrMagnitude > positionThreshold) changed = true; } - transform.position = Vector3.Lerp(pos, targetPosition, fraction); - // Something might have adjusted our position (most likely Unity UI). - lastPosition = transform.position; - if (state == TransformerState.Automatic) - { - var dP = (targetPosition - lastPosition).sqrMagnitude; - var dS = (targetScale - lastScale).sqrMagnitude; - var dR = Quaternion.Angle(targetRotation, lastRotation); - if (dP < positionThreshold && dR < rotationThreshold && dS < scaleThreshold) stateIdle(); - } + if (state == TransformerState.Automatic && !changed) stateIdle(); } private void manualUpdate() { - if (state != TransformerState.Manual) stateManual(); + if (state != TransformerState.Manual) stateManual(); var mask = gesture.TransformMask; if ((mask & TransformGesture.TransformType.Scaling) != 0) targetScale *= gesture.DeltaScale; if ((mask & TransformGesture.TransformType.Rotation) != 0) targetRotation = Quaternion.AngleAxis(gesture.DeltaRotation, gesture.RotationAxis) * targetRotation; if ((mask & TransformGesture.TransformType.Translation) != 0) targetPosition += gesture.DeltaPosition; + transformMask |= mask; gesture.OverrideTargetPosition(targetPosition); @@ -294,9 +327,10 @@ private void manualUpdate() private void applyValues() { - cachedTransform.localScale = targetScale; - cachedTransform.rotation = targetRotation; - cachedTransform.position = targetPosition; + if ((transformMask & TransformGesture.TransformType.Scaling) != 0) cachedTransform.localScale = targetScale; + if ((transformMask & TransformGesture.TransformType.Rotation) != 0) cachedTransform.rotation = targetRotation; + if ((transformMask & TransformGesture.TransformType.Translation) != 0) cachedTransform.position = targetPosition; + transformMask = TransformGesture.TransformType.None; } #endregion @@ -318,8 +352,8 @@ private void stateChangedHandler(object sender, GestureStateChangeEventArgs gest stateAutomatic(); break; case Gesture.GestureState.Failed: - if (gestureStateChangeEventArgs.PreviousState == Gesture.GestureState.Possible) - stateAutomatic(); + case Gesture.GestureState.Idle: + if (gestureStateChangeEventArgs.PreviousState == Gesture.GestureState.Possible) stateAutomatic(); break; } } diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs index a52b065ed..20deccbad 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs @@ -30,6 +30,11 @@ public class TransformGesture : TwoPointTransformGestureBase [Flags] public enum TransformType { + /// + /// No transform. + /// + None = 0, + /// /// Translation. /// @@ -128,8 +133,8 @@ public Vector3 LocalDeltaPosition #region Private variables - [SerializeField] - private bool projectionProps; // Used in the custom inspector + [SerializeField] + private bool projectionProps; // Used in the custom inspector [SerializeField] private ProjectionType projection = ProjectionType.Layer; @@ -162,11 +167,11 @@ protected override void OnEnable() updateProjectionPlane(); } - [ContextMenu("Basic Editor")] - private void switchToBasicEditor() - { - basicEditor = true; - } + [ContextMenu("Basic Editor")] + private void switchToBasicEditor() + { + basicEditor = true; + } #endregion From 89e846e1008fa9cea6f2b04f3a6619b8823bc59c Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sat, 29 Jul 2017 11:08:53 +0300 Subject: [PATCH 42/58] Fixed issues with Time.timeScale = 0. --- .../Examples/Portal/Scripts/Planet.cs | 4 +- .../Examples/Portal/Scripts/Rotator.cs | 2 +- .../Scripts/Debugging/GL/GLDebug.cs | 5 +- .../Scripts/Gestures/FlickGesture.cs | 14 +- .../Scripts/Gestures/TapGesture.cs | 130 +++++++++--------- .../Scripts/Utils/TimedSequence.cs | 2 +- 6 files changed, 78 insertions(+), 79 deletions(-) diff --git a/Source/Assets/TouchScript/Examples/Portal/Scripts/Planet.cs b/Source/Assets/TouchScript/Examples/Portal/Scripts/Planet.cs index 6be31661c..b2e04a0ba 100644 --- a/Source/Assets/TouchScript/Examples/Portal/Scripts/Planet.cs +++ b/Source/Assets/TouchScript/Examples/Portal/Scripts/Planet.cs @@ -49,7 +49,7 @@ private void Update() { case PlanetStatus.Free: transform.RotateAround(transform.parent.position, Vector3.up, - Speed*Time.deltaTime/transform.localPosition.sqrMagnitude); + Speed * Time.unscaledDeltaTime / transform.localPosition.sqrMagnitude); break; case PlanetStatus.Manual: break; @@ -60,7 +60,7 @@ private void Update() break; } - transform.Rotate(0, 0, Time.deltaTime*RotationSpeed); + transform.Rotate(0, 0, Time.unscaledDeltaTime * RotationSpeed); } void pressedhandler(object sender, System.EventArgs e) diff --git a/Source/Assets/TouchScript/Examples/Portal/Scripts/Rotator.cs b/Source/Assets/TouchScript/Examples/Portal/Scripts/Rotator.cs index 6c43ca4ee..4b5f86ca0 100644 --- a/Source/Assets/TouchScript/Examples/Portal/Scripts/Rotator.cs +++ b/Source/Assets/TouchScript/Examples/Portal/Scripts/Rotator.cs @@ -13,7 +13,7 @@ public class Rotator : MonoBehaviour void Update() { - transform.localRotation *= Quaternion.Euler(0, 0, Time.deltaTime*RotationSpeed); + transform.localRotation *= Quaternion.Euler(0, 0, Time.unscaledDeltaTime * RotationSpeed); } } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Debugging/GL/GLDebug.cs b/Source/Assets/TouchScript/Scripts/Debugging/GL/GLDebug.cs index 4a0fdedce..59a07e2ee 100644 --- a/Source/Assets/TouchScript/Scripts/Debugging/GL/GLDebug.cs +++ b/Source/Assets/TouchScript/Scripts/Debugging/GL/GLDebug.cs @@ -3,8 +3,7 @@ * Based on http://pastebin.com/69QP1s45 */ - -#if TOUCHSCRIPT_DEBUG + #if TOUCHSCRIPT_DEBUG using System.Collections; using System.Collections.Generic; @@ -603,7 +602,7 @@ public float Draw() { Lines[i].Draw(); } - return Duration - Time.deltaTime; + return Duration - Time.unscaledDeltaTime; } } diff --git a/Source/Assets/TouchScript/Scripts/Gestures/FlickGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/FlickGesture.cs index ec70b3d05..ec0fdddf7 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/FlickGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/FlickGesture.cs @@ -149,11 +149,11 @@ protected void LateUpdate() deltaSequence.Add(ScreenPosition - PreviousScreenPosition); } - [ContextMenu("Basic Editor")] - private void switchToBasicEditor() - { - basicEditor = true; - } + [ContextMenu("Basic Editor")] + private void switchToBasicEditor() + { + basicEditor = true; + } #endregion @@ -209,7 +209,7 @@ protected override void pointersReleased(IList pointers) deltaSequence.Add(ScreenPosition - PreviousScreenPosition); float lastTime; - var deltas = deltaSequence.FindElementsLaterThan(Time.time - FlickTime, out lastTime); + var deltas = deltaSequence.FindElementsLaterThan(Time.unscaledTime - FlickTime, out lastTime); var totalMovement = Vector2.zero; var count = deltas.Count; for (var i = 0; i < count; i++) totalMovement += deltas[i]; @@ -231,7 +231,7 @@ protected override void pointersReleased(IList pointers) else { ScreenFlickVector = totalMovement; - ScreenFlickTime = Time.time - lastTime; + ScreenFlickTime = Time.unscaledTime - lastTime; setState(GestureState.Recognized); } } diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs index f4790d3b2..02ca964fc 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs @@ -45,7 +45,7 @@ public event EventHandler Tapped /// /// Unity event, occurs when gesture is recognized. /// - public GestureEvent OnTap = new GestureEvent(); + public GestureEvent OnTap = new GestureEvent(); #endregion @@ -97,20 +97,20 @@ public float DistanceLimit /// At the end of a gesture when pointers are lifted off due to the fact that computers are faster than humans the very last pointer's position will be gesture's after that. This flag is used to combine several pointers which from the point of a user were lifted off simultaneously and set their centroid as gesture's . /// public bool CombinePointers - { - get { return combinePointers; } - set { combinePointers = value; } - } + { + get { return combinePointers; } + set { combinePointers = value; } + } /// /// Gets or sets time interval before gesture is recognized to combine all lifted pointers into a cluster to use its center as . /// /// Time in seconds to treat pointers lifted off during this interval as a single gesture. public float CombinePointersInterval - { - get { return combinePointersInterval; } - set { combinePointersInterval = value; } - } + { + get { return combinePointersInterval; } + set { combinePointersInterval = value; } + } #endregion @@ -127,12 +127,12 @@ public float CombinePointersInterval [NullToggle(NullFloatValue = float.PositiveInfinity)] private float distanceLimit = float.PositiveInfinity; - [SerializeField] - [ToggleLeft] - private bool combinePointers = false; + [SerializeField] + [ToggleLeft] + private bool combinePointers = false; - [SerializeField] - private float combinePointersInterval = .3f; + [SerializeField] + private float combinePointersInterval = .3f; private float distanceLimitInPixelsSquared; @@ -146,18 +146,18 @@ public float CombinePointersInterval #endregion - #region Public methods + #region Public methods - /// - public override bool ShouldReceivePointer(Pointer pointer) - { - if (!base.ShouldReceivePointer(pointer)) return false; - // Ignore redispatched pointers — they come from 2+ pointer gestures when one is left with 1 pointer. - // In this state it means that the user doesn't have an intention to tap the object. - return (pointer.Flags & Pointer.FLAG_RETURNED) == 0; - } + /// + public override bool ShouldReceivePointer(Pointer pointer) + { + if (!base.ShouldReceivePointer(pointer)) return false; + // Ignore redispatched pointers — they come from 2+ pointer gestures when one is left with 1 pointer. + // In this state it means that the user doesn't have an intention to tap the object. + return (pointer.Flags & Pointer.FLAG_RETURNED) == 0; + } - #endregion + #endregion #region Unity methods @@ -170,10 +170,10 @@ protected override void OnEnable() } [ContextMenu("Basic Editor")] - private void switchToBasicEditor() - { - basicEditor = true; - } + private void switchToBasicEditor() + { + basicEditor = true; + } #endregion @@ -246,43 +246,43 @@ protected override void pointersReleased(IList pointers) { base.pointersReleased(pointers); - if (combinePointers) - { + if (combinePointers) + { var count = pointers.Count; - for (var i = 0; i < count; i++) pointerSequence.Add(pointers[i]); - - if (NumPointers == 0) - { - // Checking which points were removed in clusterExistenceTime seconds to set their centroid as cached screen position - var cluster = pointerSequence.FindElementsLaterThan(Time.time - combinePointersInterval, shouldCachePointerPosition); - cachedScreenPosition = ClusterUtils.Get2DCenterPosition(cluster); - cachedPreviousScreenPosition = ClusterUtils.GetPrevious2DCenterPosition(cluster); - } - } - else - { - if (NumPointers == 0) - { - if (!isActive) - { - setState(GestureState.Failed); - return; - } - - // pointers outside of gesture target are ignored in shouldCachePointerPosition() - // if all pointers are outside ScreenPosition will be invalid - if (TouchManager.IsInvalidPosition(ScreenPosition)) - { - setState(GestureState.Failed); - } - else - { - tapsDone++; - isActive = false; - if (tapsDone >= numberOfTapsRequired) setState(GestureState.Recognized); - } - } - } + for (var i = 0; i < count; i++) pointerSequence.Add(pointers[i]); + + if (NumPointers == 0) + { + // Checking which points were removed in clusterExistenceTime seconds to set their centroid as cached screen position + var cluster = pointerSequence.FindElementsLaterThan(Time.unscaledTime - combinePointersInterval, shouldCachePointerPosition); + cachedScreenPosition = ClusterUtils.Get2DCenterPosition(cluster); + cachedPreviousScreenPosition = ClusterUtils.GetPrevious2DCenterPosition(cluster); + } + } + else + { + if (NumPointers == 0) + { + if (!isActive) + { + setState(GestureState.Failed); + return; + } + + // pointers outside of gesture target are ignored in shouldCachePointerPosition() + // if all pointers are outside ScreenPosition will be invalid + if (TouchManager.IsInvalidPosition(ScreenPosition)) + { + setState(GestureState.Failed); + } + else + { + tapsDone++; + isActive = false; + if (tapsDone >= numberOfTapsRequired) setState(GestureState.Recognized); + } + } + } } /// @@ -293,7 +293,7 @@ protected override void onRecognized() StopCoroutine("wait"); if (tappedInvoker != null) tappedInvoker.InvokeHandleExceptions(this, EventArgs.Empty); if (UseSendMessage && SendMessageTarget != null) SendMessageTarget.SendMessage(TAP_MESSAGE, this, SendMessageOptions.DontRequireReceiver); - if (UseUnityEvents) OnTap.Invoke(this); + if (UseUnityEvents) OnTap.Invoke(this); } /// diff --git a/Source/Assets/TouchScript/Scripts/Utils/TimedSequence.cs b/Source/Assets/TouchScript/Scripts/Utils/TimedSequence.cs index aaf95c7ec..09e036c41 100644 --- a/Source/Assets/TouchScript/Scripts/Utils/TimedSequence.cs +++ b/Source/Assets/TouchScript/Scripts/Utils/TimedSequence.cs @@ -15,7 +15,7 @@ internal sealed class TimedSequence public void Add(T element) { - Add(element, Time.time); + Add(element, Time.unscaledTime); } public void Add(T element, float time) From 713a1741421aa45703830ba8cc4c5673f5ba3904 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sat, 29 Jul 2017 14:08:53 +0300 Subject: [PATCH 43/58] Added icons to scripts. --- .../TouchScript Component Icon.dds | Bin 0 -> 21972 bytes .../TouchScript Component Icon.dds.meta | 14 ++++++++++++++ .../Behaviors/Cursors/CursorManager.cs.meta | 2 +- .../Behaviors/Cursors/MouseCursor.cs.meta | 2 +- .../Behaviors/Cursors/ObjectCursor.cs.meta | 2 +- .../Scripts/Behaviors/Cursors/PenCursor.cs.meta | 2 +- .../Behaviors/Cursors/PointerCursor.cs.meta | 2 +- .../Behaviors/Cursors/TouchCursor.cs.meta | 2 +- .../Scripts/Behaviors/Transformer.cs.meta | 2 +- .../Scripts/Gestures/FlickGesture.cs.meta | 2 +- .../Scripts/Gestures/LongPressGesture.cs.meta | 2 +- .../Scripts/Gestures/MetaGesture.cs.meta | 2 +- .../Scripts/Gestures/PressGesture.cs.meta | 2 +- .../Scripts/Gestures/ReleaseGesture.cs.meta | 2 +- .../Scripts/Gestures/TapGesture.cs.meta | 2 +- .../ClusteredPinnedTransformGesture.cs.meta | 2 +- .../ClusteredScreenTransformGesture.cs.meta | 2 +- .../Clustered/ClusteredTransformGesture.cs.meta | 2 +- .../PinnedTransformGesture.cs.meta | 2 +- .../ScreenTransformGesture.cs.meta | 2 +- .../TransformGestures/TransformGesture.cs.meta | 2 +- .../TouchScript/Scripts/Hit/Untouchable.cs.meta | 2 +- .../Scripts/InputSources/StandardInput.cs.meta | 2 +- .../Scripts/Layers/FullscreenLayer.cs.meta | 2 +- .../Scripts/Layers/StandardLayer.cs.meta | 2 +- .../Layers/UI/TouchScriptInputModule.cs.meta | 2 +- .../TouchScript/Scripts/TouchManager.cs.meta | 2 +- 27 files changed, 39 insertions(+), 25 deletions(-) create mode 100644 Source/Assets/TouchScript/Editor/EditorResources/TouchScript Component Icon.dds create mode 100644 Source/Assets/TouchScript/Editor/EditorResources/TouchScript Component Icon.dds.meta diff --git a/Source/Assets/TouchScript/Editor/EditorResources/TouchScript Component Icon.dds b/Source/Assets/TouchScript/Editor/EditorResources/TouchScript Component Icon.dds new file mode 100644 index 0000000000000000000000000000000000000000..f08af8af8ca3faeb23223665473dde0a92fac67d GIT binary patch literal 21972 zcmeHMTaMK*4DG-N{4qj_7sl*gigX+o{Cu z_V)67S(Y!)AC^}q-&$NzrNmXZ%@ldZ%h5WxWjLE2iY&nJN|j)^Yg1n zTh;;VfOWt+U>&dySO+iH2iJ;%;Co~XNY{)rS*9~pmluk&&f<@oIj7(``c*1pd0{=#a3Zm=2Qr(1aiO z)Jo%j+V>FOYNy->C(NIDLpT2JUEh1z{D*n|Pk9aon!oW!2mZ<~@52G-k1iPh1OFZj zJohg1pMd|NeK7vR{oTjBSswBpwE0gnf7}mE?t_Wu4&IQ)zrpu_&40S*eslk;`T6Hz zhmO3n$h~|yeiq(Vr**(OU>&dySO=^F)&c9lyd6068&t4)g>3B8Lf1Ix0rKiI*jh_q ztpC0009IRTut2^Q3k7t>M@fK}dQcP2ddOb*;0FnAjL+xr+ap7Lg>8cm#ety?__e@C zPMr&o{tSxXW2stnT+JRFe9C)1!~-UYFHRJP_!7Cnr(DJO6jy=^AK;6=!PEMBKpX8N zdv`su5J%bTR0oVakJNyeI#A_(5q#-`VpYCv#9#1bl>^^BCB{d#`KiKhj130GHCz;5 z`jG9xLEHsf*6H|CL%}7r+OiJRc0k`-kHqSjn)k2vjqP=A-Xq38pYCwg*)gMYe8&Bs z Date: Sat, 29 Jul 2017 14:34:16 +0300 Subject: [PATCH 44/58] Show version in TouchManager editor. --- Source/Assets/TouchScript/Editor/EditorUI/GUIElements.cs | 6 ++++++ Source/Assets/TouchScript/Editor/TouchManagerEditor.cs | 2 ++ 2 files changed, 8 insertions(+) diff --git a/Source/Assets/TouchScript/Editor/EditorUI/GUIElements.cs b/Source/Assets/TouchScript/Editor/EditorUI/GUIElements.cs index a5d4dc3a0..02f40ce2d 100644 --- a/Source/Assets/TouchScript/Editor/EditorUI/GUIElements.cs +++ b/Source/Assets/TouchScript/Editor/EditorUI/GUIElements.cs @@ -18,6 +18,7 @@ internal static class GUIElements public static GUIStyle HeaderCheckbox; public static GUIStyle HeaderFoldout; public static GUIStyle SmallText; + public static GUIStyle SmallTextRight; public static GUIStyle SmallButton; public static Texture2D PaneOptionsIcon; @@ -60,6 +61,11 @@ static GUIElements() alignment = TextAnchor.UpperLeft, }; + SmallTextRight = new GUIStyle("miniLabel") + { + alignment = TextAnchor.UpperRight, + }; + SmallButton = new GUIStyle("Button") { fontSize = SmallText.fontSize, diff --git a/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs b/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs index ed020e552..a9326d228 100644 --- a/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs +++ b/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs @@ -121,6 +121,8 @@ public override void OnInspectorGUI() drawDebug(); } + GUILayout.Label("v. " + TouchManager.VERSION + (string.IsNullOrEmpty(TouchManager.VERSION_SUFFIX) ? "" : " " + TouchManager.VERSION_SUFFIX), GUIElements.SmallTextRight); + serializedObject.ApplyModifiedProperties(); } From 0c368b51cc76af64446152c8b2de3c93cb50c242 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sat, 29 Jul 2017 18:49:16 +0300 Subject: [PATCH 45/58] Updated scenes. --- Source/ProjectSettings/EditorBuildSettings.asset | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Source/ProjectSettings/EditorBuildSettings.asset b/Source/ProjectSettings/EditorBuildSettings.asset index bad151e91..860f98dca 100644 --- a/Source/ProjectSettings/EditorBuildSettings.asset +++ b/Source/ProjectSettings/EditorBuildSettings.asset @@ -7,21 +7,31 @@ EditorBuildSettings: m_Scenes: - enabled: 1 path: Assets/TouchScript/Examples/Examples.unity + guid: 7cba6bf72365a4167930fec2f6f39b74 - enabled: 1 path: Assets/TouchScript/Examples/Taps/Taps.unity + guid: 5013fa58cea314376b273bd8905581f4 - enabled: 1 path: Assets/TouchScript/Examples/Camera/Camera.unity + guid: 9bc4a96ba8ead427ab54f883160abc15 - enabled: 1 path: Assets/TouchScript/Examples/Photos/Photos.unity + guid: e43bdd4f3bf144b74b4726208781dd66 - enabled: 1 path: Assets/TouchScript/Examples/Checkers/Checkers.unity + guid: 6ba58961df0a14cad91763f92bda13b9 - enabled: 1 path: Assets/TouchScript/Examples/Portal/Portal.unity + guid: 20ddca9320eeb4eb28b7ce5fcb289923 - enabled: 1 path: Assets/TouchScript/Examples/RawInput/RawInput.unity + guid: 9ee061879a6b743808a9f9056a52d885 - enabled: 1 path: Assets/TouchScript/Examples/Colors/Colors.unity + guid: c56b29ea5ec5a4713b65552d4a8bd9ac - enabled: 1 path: Assets/TouchScript/Examples/Cube/Cube.unity + guid: 179bea80bb29f49ab9d5761fc9d3738b - enabled: 1 path: Assets/TouchScript/Examples/Multiuser/Multiuser.unity + guid: 3b34d0a4b336446dd98f5f9951fe6480 From 04aa00e3e543d282f910536ec4e4b8eaa81eb69b Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 30 Jul 2017 01:21:07 +0300 Subject: [PATCH 46/58] Optimized UI events processing. Updates are no longer processed if not over a UI element, or not pressed a UI element. --- .../Layers/UI/TouchScriptInputModule.cs | 58 ++++++++++++++++--- 1 file changed, 49 insertions(+), 9 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs index 2a05f3710..0c43bf398 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs @@ -10,6 +10,8 @@ using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; +using Pointer = TouchScript.Pointers.Pointer; +using UnityEngine.Profiling; namespace TouchScript.Layers.UI { @@ -62,7 +64,7 @@ public static TouchScriptInputModule Instance private static TouchScriptInputModule instance; private static FieldInfo raycastersProp; private static PropertyInfo canvasProp; - private static Dictionary raycasterCanvasCache = new Dictionary(); + private static Dictionary raycasterCanvasCache = new Dictionary(10); private int refCount = 0; private UIStandardInputModule ui; @@ -218,11 +220,7 @@ private void disable() #endregion - #region Event handlers - - #endregion - - #region Copypasted code from UI + #region Copy-pasted code from UI /// /// Basically, copied code from UI Input Module which handles all UI pointer processing logic. @@ -232,9 +230,13 @@ private class UIStandardInputModule { protected TouchScriptInputModule input; + private CustomSampler uiSampler; + public UIStandardInputModule(TouchScriptInputModule input) { this.input = input; + + uiSampler = CustomSampler.Create("[TouchScript] Update UI"); } #region Unchanged from PointerInputModule @@ -243,7 +245,7 @@ public UIStandardInputModule(TouchScriptInputModule input) private Vector2 m_LastMoveVector; private float m_PrevActionTime; - private Dictionary m_PointerData = new Dictionary(); + private Dictionary m_PointerData = new Dictionary(10); public bool IsPointerOverGameObject(int pointerId) { @@ -429,15 +431,24 @@ private void convertRaycast(RaycastHitUI old, ref RaycastResult current) public virtual void ProcessUpdated(object sender, PointerEventArgs pointerEventArgs) { + uiSampler.Begin(); + var pointers = pointerEventArgs.Pointers; var raycast = new RaycastResult(); var count = pointers.Count; for (var i = 0; i < count; i++) { var pointer = pointers[i]; + // Don't update the pointer if it is pressed not over an UI element + if ((pointer.Buttons & Pointer.PointerButtonState.AnyButtonPressed) > 0) + { + var press = pointer.GetPressData(); + if (press.Type != HitData.HitType.UI) continue; + } var over = pointer.GetOverData(); - if (over.Type != HitData.HitType.UI && over.Type != HitData.HitType.ScreenSpace) continue; + // Don't update the pointer if it is not over an UI element + if (over.Type != HitData.HitType.UI) continue; PointerEventData data; GetPointerData(pointer.Id, out data, true); @@ -487,10 +498,14 @@ public virtual void ProcessUpdated(object sender, PointerEventArgs pointerEventA ExecuteEvents.ExecuteHierarchy(scrollHandler, data, ExecuteEvents.scrollHandler); } } + + uiSampler.End(); } public virtual void ProcessPressed(object sender, PointerEventArgs pointerEventArgs) { + uiSampler.Begin(); + var pointers = pointerEventArgs.Pointers; var count = pointers.Count; for (var i = 0; i < count; i++) @@ -498,7 +513,8 @@ public virtual void ProcessPressed(object sender, PointerEventArgs pointerEventA var pointer = pointers[i]; var over = pointer.GetOverData(); - if (over.Type != HitData.HitType.UI && over.Type != HitData.HitType.ScreenSpace) continue; + // Don't update the pointer if it is not over an UI element + if (over.Type != HitData.HitType.UI) continue; PointerEventData data; GetPointerData(pointer.Id, out data, true); @@ -560,15 +576,23 @@ public virtual void ProcessPressed(object sender, PointerEventArgs pointerEventA if (data.pointerDrag != null) ExecuteEvents.Execute(data.pointerDrag, data, ExecuteEvents.initializePotentialDrag); } + + uiSampler.End(); } public virtual void ProcessReleased(object sender, PointerEventArgs pointerEventArgs) { + uiSampler.Begin(); + var pointers = pointerEventArgs.Pointers; var count = pointers.Count; for (var i = 0; i < count; i++) { var pointer = pointers[i]; + var press = pointer.GetPressData(); + // Don't update the pointer if it is was not pressed over an UI element + if (press.Type != HitData.HitType.UI) continue; + var over = pointer.GetOverData(); PointerEventData data; @@ -611,15 +635,20 @@ public virtual void ProcessReleased(object sender, PointerEventArgs pointerEvent input.HandlePointerExitAndEnter(data, currentOverGo); } } + + uiSampler.End(); } public virtual void ProcessCancelled(object sender, PointerEventArgs pointerEventArgs) { + uiSampler.Begin(); + var pointers = pointerEventArgs.Pointers; var count = pointers.Count; for (var i = 0; i < count; i++) { var pointer = pointers[i]; + var over = pointer.GetOverData(); PointerEventData data; @@ -648,21 +677,32 @@ public virtual void ProcessCancelled(object sender, PointerEventArgs pointerEven ExecuteEvents.ExecuteHierarchy(data.pointerEnter, data, ExecuteEvents.pointerExitHandler); data.pointerEnter = null; } + + uiSampler.End(); } public virtual void ProcessRemoved(object sender, PointerEventArgs pointerEventArgs) { + uiSampler.Begin(); + var pointers = pointerEventArgs.Pointers; var count = pointers.Count; for (var i = 0; i < count; i++) { var pointer = pointers[i]; + + var over = pointer.GetOverData(); + // Don't update the pointer if it is not over an UI element + if (over.Type != HitData.HitType.UI) continue; + PointerEventData data; GetPointerData(pointer.Id, out data, true); if (data.pointerEnter) ExecuteEvents.ExecuteHierarchy(data.pointerEnter, data, ExecuteEvents.pointerExitHandler); RemovePointerData(pointer.Id); } + + uiSampler.End(); } #endregion From 8f02827f102bb5e8bdd4011f613e7ec8e3b2b240 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 30 Jul 2017 01:26:24 +0300 Subject: [PATCH 47/58] Optimized a few small things, added profiling samplers. --- .../TouchScript/Examples/Taps/Taps.unity | 9 +- .../TUIO/Scripts/InputSources/TuioInput.cs | 2 +- .../Behaviors/Cursors/CursorManager.cs | 29 +++++ .../Scripts/Core/GestureManagerInstance.cs | 31 ++++- .../Scripts/Core/TouchManagerInstance.cs | 109 ++++++++++++------ .../Scripts/Gestures/FlickGesture.cs | 24 ++++ .../Scripts/Gestures/LongPressGesture.cs | 23 ++++ .../Scripts/Gestures/MetaGesture.cs | 31 +++++ .../Scripts/Gestures/PressGesture.cs | 19 ++- .../Scripts/Gestures/ReleaseGesture.cs | 21 ++++ .../Scripts/Gestures/TapGesture.cs | 26 +++++ .../PinnedTransformGesture.cs | 28 ++++- .../ScreenTransformGesture.cs | 41 ++++++- .../TransformGestures/TransformGesture.cs | 29 ++++- .../Assets/TouchScript/Scripts/Hit/HitData.cs | 8 +- .../InputHandlers/TouchHandler.cs | 11 +- .../InputHandlers/WindowsPointerHandlers.cs | 2 +- .../TouchScript/Scripts/TouchManager.cs | 2 +- 18 files changed, 386 insertions(+), 59 deletions(-) diff --git a/Source/Assets/TouchScript/Examples/Taps/Taps.unity b/Source/Assets/TouchScript/Examples/Taps/Taps.unity index 15ffc54b7..f5c2aacd0 100644 --- a/Source/Assets/TouchScript/Examples/Taps/Taps.unity +++ b/Source/Assets/TouchScript/Examples/Taps/Taps.unity @@ -517,13 +517,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 7a878a6ff128243dfb1d89ca0273f059, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 OnStateChange: m_PersistentCalls: m_Calls: [] m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - basicEditor: 1 + basicEditor: 0 generalProps: 0 limitsProps: 0 advancedProps: 0 @@ -542,7 +541,7 @@ MonoBehaviour: m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null numberOfTapsRequired: 2 - timeLimit: Infinity + timeLimit: 1 distanceLimit: Infinity combinePointers: 0 combinePointersInterval: 0.3 @@ -1768,6 +1767,10 @@ Prefab: propertyPath: useDPI value: 1 objectReference: {fileID: 0} + - target: {fileID: 100000, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} m_IsPrefabParent: 0 diff --git a/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs b/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs index f40eb3b36..dcf62db52 100644 --- a/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs +++ b/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs @@ -93,7 +93,7 @@ public InputType SupportedInputs private ObjectProcessor objectProcessor; private BlobProcessor blobProcessor; - private Dictionary cursorToInternalId = new Dictionary(); + private Dictionary cursorToInternalId = new Dictionary(10); private Dictionary blobToInternalId = new Dictionary(); private Dictionary objectToInternalId = new Dictionary(); private int screenWidth; diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs index e355e991c..bd6c4581c 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs @@ -7,6 +7,7 @@ using TouchScript.Pointers; using TouchScript.Utils.Attributes; using UnityEngine; +using UnityEngine.Profiling; namespace TouchScript.Behaviors.Cursors { @@ -132,12 +133,18 @@ public uint CursorPixelSize private ObjectPool objectPool; private Dictionary cursors = new Dictionary(10); + private CustomSampler cursorSampler; + #endregion #region Unity methods private void Awake() { + cursorSampler = CustomSampler.Create("[TouchScript] Update Cursors"); + + cursorSampler.Begin(); + mousePool = new ObjectPool(2, instantiateMouseProxy, null, clearProxy); touchPool = new ObjectPool(10, instantiateTouchProxy, null, clearProxy); penPool = new ObjectPool(2, instantiatePenProxy, null, clearProxy); @@ -151,6 +158,8 @@ private void Awake() Debug.LogError("CursorManager must be on an UI element!"); enabled = false; } + + cursorSampler.End(); } private void OnEnable() @@ -219,6 +228,8 @@ private void updateCursorSize() private void pointersAddedHandler(object sender, PointerEventArgs e) { + cursorSampler.Begin(); + updateCursorSize(); var count = e.Pointers.Count; @@ -251,10 +262,14 @@ private void pointersAddedHandler(object sender, PointerEventArgs e) cursor.Init(rect, pointer); cursors.Add(pointer.Id, cursor); } + + cursorSampler.End(); } private void pointersRemovedHandler(object sender, PointerEventArgs e) { + cursorSampler.Begin(); + var count = e.Pointers.Count; for (var i = 0; i < count; i++) { @@ -279,10 +294,14 @@ private void pointersRemovedHandler(object sender, PointerEventArgs e) break; } } + + cursorSampler.End(); } private void pointersPressedHandler(object sender, PointerEventArgs e) { + cursorSampler.Begin(); + var count = e.Pointers.Count; for (var i = 0; i < count; i++) { @@ -291,10 +310,14 @@ private void pointersPressedHandler(object sender, PointerEventArgs e) if (!cursors.TryGetValue(pointer.Id, out cursor)) continue; cursor.SetState(pointer, PointerCursor.CursorState.Pressed); } + + cursorSampler.End(); } private void PointersUpdatedHandler(object sender, PointerEventArgs e) { + cursorSampler.Begin(); + var count = e.Pointers.Count; for (var i = 0; i < count; i++) { @@ -303,10 +326,14 @@ private void PointersUpdatedHandler(object sender, PointerEventArgs e) if (!cursors.TryGetValue(pointer.Id, out cursor)) continue; cursor.UpdatePointer(pointer); } + + cursorSampler.End(); } private void pointersReleasedHandler(object sender, PointerEventArgs e) { + cursorSampler.Begin(); + var count = e.Pointers.Count; for (var i = 0; i < count; i++) { @@ -315,6 +342,8 @@ private void pointersReleasedHandler(object sender, PointerEventArgs e) if (!cursors.TryGetValue(pointer.Id, out cursor)) continue; cursor.SetState(pointer, PointerCursor.CursorState.Released); } + + cursorSampler.End(); } private void pointersCancelledHandler(object sender, PointerEventArgs e) diff --git a/Source/Assets/TouchScript/Scripts/Core/GestureManagerInstance.cs b/Source/Assets/TouchScript/Scripts/Core/GestureManagerInstance.cs index 44557b306..2af106d64 100644 --- a/Source/Assets/TouchScript/Scripts/Core/GestureManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/Core/GestureManagerInstance.cs @@ -8,6 +8,7 @@ using TouchScript.Utils; using TouchScript.Pointers; using UnityEngine; +using UnityEngine.Profiling; namespace TouchScript.Core { @@ -56,7 +57,9 @@ public static IGestureManager Instance // Upcoming changes private List gesturesToReset = new List(20); - private Dictionary> pointerToGestures = new Dictionary>(); + private Dictionary> pointerToGestures = new Dictionary>(10); + + private CustomSampler gestureSampler; #endregion @@ -69,8 +72,8 @@ public static IGestureManager Instance private Dictionary> pointersToDispatchForGesture = new Dictionary>(10); private List activeGesturesThisUpdate = new List(20); - private Dictionary> hierarchyEndingWithCache = new Dictionary>(); - private Dictionary> hierarchyBeginningWithCache = new Dictionary>(); + private Dictionary> hierarchyEndingWithCache = new Dictionary>(4); + private Dictionary> hierarchyBeginningWithCache = new Dictionary>(4); #endregion @@ -107,6 +110,8 @@ private void Awake() gestureListPool.WarmUp(20); pointerListPool.WarmUp(20); transformListPool.WarmUp(1); + + gestureSampler = CustomSampler.Create("[TouchScript] Update Gestures"); } private void OnEnable() @@ -219,6 +224,8 @@ internal Gesture.GestureState INTERNAL_GestureChangeState(Gesture gesture, Gestu private void updatePressed(IList pointers) { + gestureSampler.Begin(); + var activeTargets = transformListPool.Get(); var gesturesInHierarchy = gestureListPool.Get(); var startedGestures = gestureListPool.Get(); @@ -368,10 +375,14 @@ private void updatePressed(IList pointers) pointersOnTarget.Clear(); activeGesturesThisUpdate.Clear(); pointersToDispatchForGesture.Clear(); + + gestureSampler.End(); } private void updateUpdated(IList pointers) { + gestureSampler.Begin(); + sortPointersForActiveGestures(pointers); var count = activeGesturesThisUpdate.Count; @@ -388,10 +399,14 @@ private void updateUpdated(IList pointers) activeGesturesThisUpdate.Clear(); pointersToDispatchForGesture.Clear(); + + gestureSampler.End(); } private void updateReleased(IList pointers) { + gestureSampler.Begin(); + sortPointersForActiveGestures(pointers); var count = activeGesturesThisUpdate.Count; @@ -409,10 +424,14 @@ private void updateReleased(IList pointers) removePointers(pointers); activeGesturesThisUpdate.Clear(); pointersToDispatchForGesture.Clear(); + + gestureSampler.End(); } private void updateCancelled(IList pointers) { + gestureSampler.Begin(); + sortPointersForActiveGestures(pointers); var count = activeGesturesThisUpdate.Count; @@ -430,6 +449,8 @@ private void updateCancelled(IList pointers) removePointers(pointers); activeGesturesThisUpdate.Clear(); pointersToDispatchForGesture.Clear(); + + gestureSampler.End(); } private void sortPointersForActiveGestures(IList pointers) @@ -499,8 +520,8 @@ private void resetGestures() private void clearFrameCaches() { - foreach (var list in hierarchyEndingWithCache.Values) gestureListPool.Release(list); - foreach (var list in hierarchyBeginningWithCache.Values) gestureListPool.Release(list); + foreach (var kv in hierarchyEndingWithCache) gestureListPool.Release(kv.Value); + foreach (var kv in hierarchyBeginningWithCache) gestureListPool.Release(kv.Value); hierarchyEndingWithCache.Clear(); hierarchyBeginningWithCache.Clear(); } diff --git a/Source/Assets/TouchScript/Scripts/Core/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/Core/TouchManagerInstance.cs index a998d0cce..84e766ff0 100644 --- a/Source/Assets/TouchScript/Scripts/Core/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/Core/TouchManagerInstance.cs @@ -246,6 +246,9 @@ public IList PressedPointers private int nextPointerId = 0; private object pointerLock = new object(); + // Cache delegates + private Func _layerAddPointer, _layerUpdatePointer, _layerRemovePointer, _layerCancelPointer; + #endregion #region Temporary variables @@ -261,8 +264,7 @@ public IList PressedPointers private IPointerLogger pLogger; #endif - private CustomSampler samplerUpdateInputs; - private CustomSampler samplerUpdatePointers; + private CustomSampler samplerUpdateInputs, samplerUpdateAdded, samplerUpdatePressed, samplerUpdateUpdated, samplerUpdateReleased, samplerUpdateRemoved, samplerUpdateCancelled; #endregion @@ -350,10 +352,9 @@ internal void INTERNAL_UpdatePointer(int id) if (!idToPointer.TryGetValue(id, out pointer)) { // This pointer was added this frame - pointer = pointersAdded.Find((t) => t.Id == id); - // No pointer with such id - if (pointer == null) + if (!wasPointerAddedThisFrame(id, out pointer)) { + // No pointer with such id #if TOUCHSCRIPT_DEBUG if (DebugMode) Debug.LogWarning("TouchScript > Pointer with id [" + id + "] is requested to MOVE to but no pointer with such id found."); #endif @@ -373,10 +374,9 @@ internal void INTERNAL_PressPointer(int id) if (!idToPointer.TryGetValue(id, out pointer)) { // This pointer was added this frame - pointer = pointersAdded.Find((t) => t.Id == id); - // No pointer with such id - if (pointer == null) - { + if (!wasPointerAddedThisFrame(id, out pointer)) + { + // No pointer with such id #if TOUCHSCRIPT_DEBUG if (DebugMode) Debug.LogWarning("TouchScript > Pointer with id [" + id + @@ -405,11 +405,10 @@ internal void INTERNAL_ReleasePointer(int id) Pointer pointer; if (!idToPointer.TryGetValue(id, out pointer)) { - // This pointer was added this frame - pointer = pointersAdded.Find((t) => t.Id == id); - // No pointer with such id - if (pointer == null) - { + // This pointer was added this frame + if (!wasPointerAddedThisFrame(id, out pointer)) + { + // No pointer with such id #if TOUCHSCRIPT_DEBUG if (DebugMode) Debug.LogWarning("TouchScript > Pointer with id [" + id + @@ -438,11 +437,10 @@ internal void INTERNAL_RemovePointer(int id) Pointer pointer; if (!idToPointer.TryGetValue(id, out pointer)) { - // This pointer was added this frame - pointer = pointersAdded.Find((t) => t.Id == id); - // No pointer with such id - if (pointer == null) - { + // This pointer was added this frame + if (!wasPointerAddedThisFrame(id, out pointer)) + { + // No pointer with such id #if TOUCHSCRIPT_DEBUG if (DebugMode) Debug.LogWarning("TouchScript > Pointer with id [" + id + @@ -471,11 +469,10 @@ internal void INTERNAL_CancelPointer(int id) Pointer pointer; if (!idToPointer.TryGetValue(id, out pointer)) { - // This pointer was added this frame - pointer = pointersAdded.Find((t) => t.Id == id); - // No pointer with such id - if (pointer == null) - { + // This pointer was added this frame + if (!wasPointerAddedThisFrame(id, out pointer)) + { + // No pointer with such id #if TOUCHSCRIPT_DEBUG if (DebugMode) Debug.LogWarning("TouchScript > Pointer with id [" + id + @@ -533,8 +530,18 @@ private void Awake() pointerListPool.WarmUp(2); intListPool.WarmUp(3); - samplerUpdateInputs = CustomSampler.Create("TouchScript.UpdateInputs"); - samplerUpdatePointers = CustomSampler.Create("TouchScript.UpdatePointers"); + _layerAddPointer = layerAddPointer; + _layerUpdatePointer = layerUpdatePointer; + _layerRemovePointer = layerRemovePointer; + _layerCancelPointer = layerCancelPointer; + + samplerUpdateInputs = CustomSampler.Create("[TouchScript] Update Inputs"); + samplerUpdateAdded = CustomSampler.Create("[TouchScript] Added Pointers"); + samplerUpdatePressed = CustomSampler.Create("[TouchScript] Press Pointers"); + samplerUpdateUpdated = CustomSampler.Create("[TouchScript] Update Pointers"); + samplerUpdateReleased = CustomSampler.Create("[TouchScript] Release Pointers"); + samplerUpdateRemoved = CustomSampler.Create("[TouchScript] Remove Pointers"); + samplerUpdateCancelled = CustomSampler.Create("[TouchScript] Cancel Pointers"); } #if UNITY_5_4_OR_NEWER @@ -625,6 +632,8 @@ private void updateInputs() private void updateAdded(List pointers) { + samplerUpdateAdded.Begin(); + var addedCount = pointers.Count; var list = pointerListPool.Get(); for (var i = 0; i < addedCount; i++) @@ -639,7 +648,7 @@ private void updateAdded(List pointers) #endif tmpPointer = pointer; - layerManager.ForEach(layerAddPointer); + layerManager.ForEach(_layerAddPointer); tmpPointer = null; #if TOUCHSCRIPT_DEBUG @@ -650,6 +659,8 @@ private void updateAdded(List pointers) if (pointersAddedInvoker != null) pointersAddedInvoker.InvokeHandleExceptions(this, PointerEventArgs.GetCachedEventArgs(list)); pointerListPool.Release(list); + + samplerUpdateAdded.End(); } private bool layerAddPointer(TouchLayer layer) @@ -660,6 +671,8 @@ private bool layerAddPointer(TouchLayer layer) private void updateUpdated(List pointers) { + samplerUpdateUpdated.Begin(); + var updatedCount = pointers.Count; var list = pointerListPool.Get(); for (var i = 0; i < updatedCount; i++) @@ -686,7 +699,7 @@ private void updateUpdated(List pointers) else { tmpPointer = pointer; - layerManager.ForEach(layerUpdatePointer); + layerManager.ForEach(_layerUpdatePointer); tmpPointer = null; } @@ -698,6 +711,8 @@ private void updateUpdated(List pointers) if (pointersUpdatedInvoker != null) pointersUpdatedInvoker.InvokeHandleExceptions(this, PointerEventArgs.GetCachedEventArgs(list)); pointerListPool.Release(list); + + samplerUpdateUpdated.End(); } private bool layerUpdatePointer(TouchLayer layer) @@ -708,6 +723,8 @@ private bool layerUpdatePointer(TouchLayer layer) private void updatePressed(List pointers) { + samplerUpdatePressed.Begin(); + var pressedCount = pointers.Count; var list = pointerListPool.Get(); for (var i = 0; i < pressedCount; i++) @@ -745,10 +762,14 @@ private void updatePressed(List pointers) if (pointersPressedInvoker != null) pointersPressedInvoker.InvokeHandleExceptions(this, PointerEventArgs.GetCachedEventArgs(list)); pointerListPool.Release(list); + + samplerUpdatePressed.End(); } private void updateReleased(List pointers) { + samplerUpdateReleased.Begin(); + var releasedCount = pointers.Count; var list = pointerListPool.Get(); for (var i = 0; i < releasedCount; i++) @@ -787,10 +808,14 @@ private void updateReleased(List pointers) pointer.INTERNAL_ClearPressData(); } pointerListPool.Release(list); + + samplerUpdateReleased.End(); } private void updateRemoved(List pointers) { + samplerUpdateRemoved.Begin(); + var removedCount = pointers.Count; var list = pointerListPool.Get(); for (var i = 0; i < removedCount; i++) @@ -814,7 +839,7 @@ private void updateRemoved(List pointers) #endif tmpPointer = pointer; - layerManager.ForEach(layerRemovePointer); + layerManager.ForEach(_layerRemovePointer); tmpPointer = null; #if TOUCHSCRIPT_DEBUG @@ -832,6 +857,8 @@ private void updateRemoved(List pointers) pointer.InputSource.INTERNAL_DiscardPointer(pointer); } pointerListPool.Release(list); + + samplerUpdateRemoved.End(); } private bool layerRemovePointer(TouchLayer layer) @@ -842,6 +869,8 @@ private bool layerRemovePointer(TouchLayer layer) private void updateCancelled(List pointers) { + samplerUpdateCancelled.Begin(); + var cancelledCount = pointers.Count; var list = pointerListPool.Get(); for (var i = 0; i < cancelledCount; i++) @@ -867,7 +896,7 @@ private void updateCancelled(List pointers) #endif tmpPointer = pointer; - layerManager.ForEach(layerCancelPointer); + layerManager.ForEach(_layerCancelPointer); tmpPointer = null; #if TOUCHSCRIPT_DEBUG @@ -884,6 +913,8 @@ private void updateCancelled(List pointers) pointer.InputSource.INTERNAL_DiscardPointer(pointer); } pointerListPool.Release(list); + + samplerUpdateCancelled.End(); } private bool layerCancelPointer(TouchLayer layer) @@ -903,8 +934,6 @@ private void sendFrameStartedToPointers() private void updatePointers() { - samplerUpdatePointers.Begin(); - IsInsidePointerFrame = true; if (frameStartedInvoker != null) frameStartedInvoker.InvokeHandleExceptions(this, EventArgs.Empty); @@ -995,10 +1024,22 @@ private void updatePointers() if (frameFinishedInvoker != null) frameFinishedInvoker.InvokeHandleExceptions(this, EventArgs.Empty); IsInsidePointerFrame = false; - - samplerUpdatePointers.End(); } + private bool wasPointerAddedThisFrame(int id, out Pointer pointer) + { + pointer = null; + foreach (var p in pointersAdded) + { + if (p.Id == id) + { + pointer = p; + return true; + } + } + return false; + } + #if TOUCHSCRIPT_DEBUG private Vector2 debugPointerSize; diff --git a/Source/Assets/TouchScript/Scripts/Gestures/FlickGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/FlickGesture.cs index ec0fdddf7..a288d6b42 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/FlickGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/FlickGesture.cs @@ -7,6 +7,7 @@ using TouchScript.Utils; using TouchScript.Pointers; using UnityEngine; +using UnityEngine.Profiling; namespace TouchScript.Gestures { @@ -137,10 +138,20 @@ public GestureDirection Direction private bool isActive = false; private TimedSequence deltaSequence = new TimedSequence(); + private CustomSampler gestureSampler; + #endregion #region Unity methods + /// + protected override void Awake() + { + base.Awake(); + + gestureSampler = CustomSampler.Create("[TouchScript] Flick Gesture"); + } + /// protected void LateUpdate() { @@ -162,6 +173,8 @@ private void switchToBasicEditor() /// protected override void pointersPressed(IList pointers) { + gestureSampler.Begin(); + base.pointersPressed(pointers); if (pointersNumState == PointersNumState.PassedMaxThreshold || @@ -175,11 +188,15 @@ protected override void pointersPressed(IList pointers) if (isActive) setState(GestureState.Failed); else isActive = true; } + + gestureSampler.End(); } /// protected override void pointersUpdated(IList pointers) { + gestureSampler.Begin(); + base.pointersUpdated(pointers); if (isActive || !moving) @@ -191,11 +208,15 @@ protected override void pointersUpdated(IList pointers) moving = true; } } + + gestureSampler.End(); } /// protected override void pointersReleased(IList pointers) { + gestureSampler.Begin(); + base.pointersReleased(pointers); if (NumPointers == 0) @@ -203,6 +224,7 @@ protected override void pointersReleased(IList pointers) if (!isActive || !moving) { setState(GestureState.Failed); + gestureSampler.End(); return; } @@ -235,6 +257,8 @@ protected override void pointersReleased(IList pointers) setState(GestureState.Recognized); } } + + gestureSampler.End(); } /// diff --git a/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs index 490d35555..d8608d756 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs @@ -9,6 +9,7 @@ using TouchScript.Utils.Attributes; using TouchScript.Pointers; using UnityEngine; +using UnityEngine.Profiling; namespace TouchScript.Gestures { @@ -90,10 +91,20 @@ public float DistanceLimit private Vector2 totalMovement; + private CustomSampler gestureSampler; + #endregion #region Unity methods + /// + protected override void Awake() + { + base.Awake(); + + gestureSampler = CustomSampler.Create("[TouchScript] Long Press Gesture"); + } + /// protected override void OnEnable() { @@ -115,6 +126,8 @@ private void switchToBasicEditor() /// protected override void pointersPressed(IList pointers) { + gestureSampler.Begin(); + base.pointersPressed(pointers); if (pointersNumState == PointersNumState.PassedMaxThreshold || @@ -127,11 +140,15 @@ protected override void pointersPressed(IList pointers) setState(GestureState.Possible); StartCoroutine("wait"); } + + gestureSampler.End(); } /// protected override void pointersUpdated(IList pointers) { + gestureSampler.Begin(); + base.pointersUpdated(pointers); if (distanceLimit < float.PositiveInfinity) @@ -139,17 +156,23 @@ protected override void pointersUpdated(IList pointers) totalMovement += ScreenPosition - PreviousScreenPosition; if (totalMovement.sqrMagnitude > distanceLimitInPixelsSquared) setState(GestureState.Failed); } + + gestureSampler.End(); } /// protected override void pointersReleased(IList pointers) { + gestureSampler.Begin(); + base.pointersReleased(pointers); if (pointersNumState == PointersNumState.PassedMinThreshold) { setState(GestureState.Failed); } + + gestureSampler.End(); } /// diff --git a/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs index c8e2c8bfb..d004291fb 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs @@ -7,6 +7,7 @@ using TouchScript.Utils; using TouchScript.Pointers; using UnityEngine; +using UnityEngine.Profiling; namespace TouchScript.Gestures { @@ -87,8 +88,22 @@ public event EventHandler PointerCancelled #endregion + #region Private variables + + private CustomSampler gestureSampler; + + #endregion + #region Unity + /// + protected override void Awake() + { + base.Awake(); + + gestureSampler = CustomSampler.Create("[TouchScript] Meta Gesture"); + } + [ContextMenu("Basic Editor")] private void switchToBasicEditor() { @@ -102,6 +117,8 @@ private void switchToBasicEditor() /// protected override void pointersPressed(IList pointers) { + gestureSampler.Begin(); + base.pointersPressed(pointers); if (State == GestureState.Idle) setState(GestureState.Began); @@ -116,11 +133,15 @@ protected override void pointersPressed(IList pointers) { for (var i = 0; i < length; i++) SendMessageTarget.SendMessage(POINTER_PRESSED_MESSAGE, pointers[i], SendMessageOptions.DontRequireReceiver); } + + gestureSampler.End(); } /// protected override void pointersUpdated(IList pointers) { + gestureSampler.Begin(); + base.pointersUpdated(pointers); if (State == GestureState.Began || State == GestureState.Changed) setState(GestureState.Changed); @@ -135,11 +156,15 @@ protected override void pointersUpdated(IList pointers) { for (var i = 0; i < length; i++) SendMessageTarget.SendMessage(POINTER_MOVED_MESSAGE, pointers[i], SendMessageOptions.DontRequireReceiver); } + + gestureSampler.End(); } /// protected override void pointersReleased(IList pointers) { + gestureSampler.Begin(); + base.pointersReleased(pointers); if ((State == GestureState.Began || State == GestureState.Changed) && NumPointers == 0) setState(GestureState.Ended); @@ -154,11 +179,15 @@ protected override void pointersReleased(IList pointers) { for (var i = 0; i < length; i++) SendMessageTarget.SendMessage(POINTER_RELEASED_MESSAGE, pointers[i], SendMessageOptions.DontRequireReceiver); } + + gestureSampler.End(); } /// protected override void pointersCancelled(IList pointers) { + gestureSampler.Begin(); + base.pointersCancelled(pointers); var length = pointers.Count; @@ -171,6 +200,8 @@ protected override void pointersCancelled(IList pointers) { for (var i = 0; i < length; i++) SendMessageTarget.SendMessage(POINTER_CANCELLED_MESSAGE, pointers[i], SendMessageOptions.DontRequireReceiver); } + + gestureSampler.End(); } #endregion diff --git a/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs index b1cfef1f1..a5d5b0e72 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs @@ -8,6 +8,7 @@ using TouchScript.Utils.Attributes; using TouchScript.Pointers; using UnityEngine; +using UnityEngine.Profiling; namespace TouchScript.Gestures { @@ -74,14 +75,24 @@ public bool IgnoreChildren [ToggleLeft] private bool ignoreChildren = false; + private CustomSampler gestureSampler; + #endregion #region Unity + /// + protected override void Awake() + { + base.Awake(); + + gestureSampler = CustomSampler.Create("[TouchScript] Press Gesture"); + } + [ContextMenu("Basic Editor")] private void switchToBasicEditor() { - basicEditor = true; + basicEditor = true; } #endregion @@ -115,18 +126,24 @@ public override bool CanBePreventedByGesture(Gesture gesture) /// protected override void pointersPressed(IList pointers) { + gestureSampler.Begin(); + base.pointersPressed(pointers); if (pointersNumState == PointersNumState.PassedMinThreshold) { setState(GestureState.Recognized); + gestureSampler.End(); return; } if (pointersNumState == PointersNumState.PassedMinMaxThreshold) { setState(GestureState.Failed); + gestureSampler.End(); return; } + + gestureSampler.End(); } /// diff --git a/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs index e0bbf9b24..5df1c813a 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs @@ -8,6 +8,7 @@ using TouchScript.Utils.Attributes; using TouchScript.Pointers; using UnityEngine; +using UnityEngine.Profiling; namespace TouchScript.Gestures { @@ -69,10 +70,20 @@ public bool IgnoreChildren [ToggleLeft] private bool ignoreChildren = false; + private CustomSampler gestureSampler; + #endregion #region Unity + /// + protected override void Awake() + { + base.Awake(); + + gestureSampler = CustomSampler.Create("[TouchScript] Release Gesture"); + } + [ContextMenu("Basic Editor")] private void switchToBasicEditor() { @@ -110,26 +121,36 @@ public override bool CanBePreventedByGesture(Gesture gesture) /// protected override void pointersPressed(IList pointers) { + gestureSampler.Begin(); + base.pointersPressed(pointers); if (pointersNumState == PointersNumState.PassedMinThreshold) { if (State == GestureState.Idle) setState(GestureState.Possible); + gestureSampler.End(); return; } if (pointersNumState == PointersNumState.PassedMinMaxThreshold) { setState(GestureState.Failed); + gestureSampler.End(); return; } + + gestureSampler.End(); } /// protected override void pointersReleased(IList pointers) { + gestureSampler.Begin(); + base.pointersReleased(pointers); if (pointersNumState == PointersNumState.PassedMinThreshold) setState(GestureState.Recognized); + + gestureSampler.End(); } /// diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs index 02ca964fc..b7474f004 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs @@ -9,6 +9,7 @@ using TouchScript.Utils.Attributes; using TouchScript.Pointers; using UnityEngine; +using UnityEngine.Profiling; namespace TouchScript.Gestures { @@ -144,6 +145,8 @@ public float CombinePointersInterval private Vector2 totalMovement; private TimedSequence pointerSequence = new TimedSequence(); + private CustomSampler gestureSampler; + #endregion #region Public methods @@ -161,6 +164,14 @@ public override bool ShouldReceivePointer(Pointer pointer) #region Unity methods + /// + protected override void Awake() + { + base.Awake(); + + gestureSampler = CustomSampler.Create("[TouchScript] Tap Gesture"); + } + /// protected override void OnEnable() { @@ -182,12 +193,15 @@ private void switchToBasicEditor() /// protected override void pointersPressed(IList pointers) { + gestureSampler.Begin(); + base.pointersPressed(pointers); if (pointersNumState == PointersNumState.PassedMaxThreshold || pointersNumState == PointersNumState.PassedMinMaxThreshold) { setState(GestureState.Failed); + gestureSampler.End(); return; } @@ -212,6 +226,7 @@ protected override void pointersPressed(IList pointers) if ((pointers[0].Position - startPosition).sqrMagnitude > distanceLimitInPixelsSquared) { setState(GestureState.Failed); + gestureSampler.End(); return; } } @@ -227,11 +242,15 @@ protected override void pointersPressed(IList pointers) isActive = true; } } + + gestureSampler.End(); } /// protected override void pointersUpdated(IList pointers) { + gestureSampler.Begin(); + base.pointersUpdated(pointers); if (distanceLimit < float.PositiveInfinity) @@ -239,11 +258,15 @@ protected override void pointersUpdated(IList pointers) totalMovement += pointers[0].Position - pointers[0].PreviousPosition; if (totalMovement.sqrMagnitude > distanceLimitInPixelsSquared) setState(GestureState.Failed); } + + gestureSampler.End(); } /// protected override void pointersReleased(IList pointers) { + gestureSampler.Begin(); + base.pointersReleased(pointers); if (combinePointers) @@ -266,6 +289,7 @@ protected override void pointersReleased(IList pointers) if (!isActive) { setState(GestureState.Failed); + gestureSampler.End(); return; } @@ -283,6 +307,8 @@ protected override void pointersReleased(IList pointers) } } } + + gestureSampler.End(); } /// diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs index 87a6c4bbd..567de42f0 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs @@ -7,6 +7,8 @@ using TouchScript.Layers; using TouchScript.Utils.Geom; using TouchScript.Pointers; +using UnityEngine.Profiling; + #if TOUCHSCRIPT_DEBUG using TouchScript.Debugging.GL; #endif @@ -87,6 +89,8 @@ public Plane TransformPlane private TouchLayer projectionLayer; private Plane transformPlane; + private CustomSampler gestureSampler; + #endregion #region Public methods @@ -99,7 +103,9 @@ public Plane TransformPlane protected override void Awake() { base.Awake(); + transformPlane = new Plane(); + gestureSampler = CustomSampler.Create("[TouchScript] Pinned Transform Gesture"); } /// @@ -123,6 +129,8 @@ private void switchToBasicEditor() /// protected override void pointersPressed(IList pointers) { + gestureSampler.Begin(); + base.pointersPressed(pointers); if (NumPointers == pointers.Count) @@ -134,19 +142,35 @@ protected override void pointersPressed(IList pointers) drawDebug(activePointers[0].ProjectionParams.ProjectFrom(cachedTransform.position), activePointers[0].Position); #endif } + + gestureSampler.End(); } -#if TOUCHSCRIPT_DEBUG + /// + protected override void pointersUpdated(IList pointers) + { + gestureSampler.Begin(); + + base.pointersUpdated(pointers); + + gestureSampler.End(); + } + /// protected override void pointersReleased(IList pointers) { + gestureSampler.Begin(); + base.pointersReleased(pointers); +#if TOUCHSCRIPT_DEBUG if (NumPointers == 0) clearDebug(); else drawDebug(activePointers[0].ProjectionParams.ProjectFrom(cachedTransform.position), activePointers[0].Position); - } #endif + gestureSampler.End(); + } + #endregion #region Protected methods diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/ScreenTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/ScreenTransformGesture.cs index d3ffc4c47..391c12d05 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/ScreenTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/ScreenTransformGesture.cs @@ -6,10 +6,9 @@ using TouchScript.Layers; using TouchScript.Utils.Geom; using UnityEngine; -#if TOUCHSCRIPT_DEBUG +using UnityEngine.Profiling; using System.Collections.Generic; using TouchScript.Pointers; -#endif namespace TouchScript.Gestures.TransformGestures { @@ -20,8 +19,23 @@ namespace TouchScript.Gestures.TransformGestures [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Gestures_TransformGestures_ScreenTransformGesture.htm")] public class ScreenTransformGesture : TwoPointTransformGestureBase { + + #region Private variables + + private CustomSampler gestureSampler; + + #endregion + #region Unity + /// + protected override void Awake() + { + base.Awake(); + + gestureSampler = CustomSampler.Create("[TouchScript] Screen Transform Gesture"); + } + [ContextMenu("Basic Editor")] private void switchToBasicEditor() { @@ -32,17 +46,36 @@ private void switchToBasicEditor() #region Gesture callbacks -#if TOUCHSCRIPT_DEBUG + /// + protected override void pointersPressed(IList pointers) + { + gestureSampler.Begin(); + + base.pointersPressed(pointers); + + gestureSampler.End(); + } + + /// + protected override void pointersUpdated(IList pointers) + { + gestureSampler.Begin(); + + base.pointersUpdated(pointers); + + gestureSampler.End(); + } /// protected override void pointersReleased(IList pointers) { base.pointersReleased(pointers); +#if TOUCHSCRIPT_DEBUG if (getNumPoints() == 0) clearDebug(); else drawDebugDelayed(getNumPoints()); - } #endif + } #endregion diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs index 20deccbad..708459bd8 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs @@ -8,6 +8,8 @@ using TouchScript.Layers; using TouchScript.Utils; using TouchScript.Pointers; +using UnityEngine.Profiling; + #if TOUCHSCRIPT_DEBUG using TouchScript.Debugging.GL; #endif @@ -145,6 +147,8 @@ public Vector3 LocalDeltaPosition private TouchLayer projectionLayer; private Plane transformPlane; + private CustomSampler gestureSampler; + #endregion #region Public methods @@ -157,13 +161,16 @@ public Vector3 LocalDeltaPosition protected override void Awake() { base.Awake(); + transformPlane = new Plane(); + gestureSampler = CustomSampler.Create("[TouchScript] Transform Gesture"); } /// protected override void OnEnable() { base.OnEnable(); + updateProjectionPlane(); } @@ -180,6 +187,8 @@ private void switchToBasicEditor() /// protected override void pointersPressed(IList pointers) { + gestureSampler.Begin(); + base.pointersPressed(pointers); if (NumPointers == pointers.Count) @@ -187,20 +196,36 @@ protected override void pointersPressed(IList pointers) projectionLayer = activePointers[0].GetPressData().Layer; updateProjectionPlane(); } + + gestureSampler.End(); } -#if TOUCHSCRIPT_DEBUG + /// + protected override void pointersUpdated(IList pointers) + { + gestureSampler.Begin(); + + base.pointersUpdated(pointers); + + gestureSampler.End(); + } /// protected override void pointersReleased(IList pointers) { + gestureSampler.Begin(); + base.pointersReleased(pointers); +#if TOUCHSCRIPT_DEBUG if (getNumPoints() == 0) clearDebug(); else drawDebugDelayed(getNumPoints()); - } #endif + gestureSampler.End(); + } + + #endregion #region Protected methods diff --git a/Source/Assets/TouchScript/Scripts/Hit/HitData.cs b/Source/Assets/TouchScript/Scripts/Hit/HitData.cs index a8daecfdb..a94e36171 100644 --- a/Source/Assets/TouchScript/Scripts/Hit/HitData.cs +++ b/Source/Assets/TouchScript/Scripts/Hit/HitData.cs @@ -27,9 +27,9 @@ public enum HitType Unknown, /// - /// Screen space UI hit. + /// Nothing hit, but some object grabbed the pointer. /// - ScreenSpace, + Screen, /// /// 3D hit. @@ -42,7 +42,7 @@ public enum HitType World2D, /// - /// World space UI hit. + /// UI hit. /// UI } @@ -253,7 +253,7 @@ public HitData(Transform target, TouchLayer layer, bool screenSpace = false) raycastHit = default(RaycastHit); raycastHit2D = default(RaycastHit2D); raycastHitUI = default(RaycastHitUI); - type = HitType.ScreenSpace; + type = HitType.Screen; } /// diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs index ad7273d25..a9d5b3bff 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs @@ -8,6 +8,7 @@ using TouchScript.Pointers; using TouchScript.Utils; using UnityEngine; +using UnityEngine.Profiling; namespace TouchScript.InputSources.InputHandlers { @@ -43,9 +44,11 @@ public bool HasPointers private ObjectPool touchPool; // Unity fingerId -> TouchScript touch info - private Dictionary systemToInternalId = new Dictionary(); + private Dictionary systemToInternalId = new Dictionary(10); private int pointersNum; + private CustomSampler updateSampler; + #endregion /// @@ -68,6 +71,8 @@ public TouchHandler(PointerDelegate addPointer, PointerDelegate updatePointer, P touchPool = new ObjectPool(10, () => new TouchPointer(this), null, resetPointer); touchPool.Name = "Touch"; + + updateSampler = CustomSampler.Create("[TouchScript] Update touch"); } #region Public methods @@ -75,6 +80,8 @@ public TouchHandler(PointerDelegate addPointer, PointerDelegate updatePointer, P /// public bool UpdateInput() { + updateSampler.Begin(); + for (var i = 0; i < Input.touchCount; ++i) { var t = Input.GetTouch(i); @@ -148,6 +155,8 @@ public bool UpdateInput() } } + updateSampler.End(); + return Input.touchCount > 0; } diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs index c62c43247..d8485ca56 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs @@ -208,7 +208,7 @@ public abstract class WindowsPointerHandler : IInputSource, IDisposable protected IntPtr hMainWindow; protected ushort pressAndHoldAtomID; - protected Dictionary winTouchToInternalId = new Dictionary(); + protected Dictionary winTouchToInternalId = new Dictionary(10); protected ObjectPool touchPool; protected ObjectPool mousePool; diff --git a/Source/Assets/TouchScript/Scripts/TouchManager.cs b/Source/Assets/TouchScript/Scripts/TouchManager.cs index 98d50e8d7..9ab43569c 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManager.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManager.cs @@ -362,7 +362,7 @@ public override bool DebugMode /// true if position is invalid; otherwise, false. public static bool IsInvalidPosition(Vector2 position) { - return position.Equals(INVALID_POSITION); + return position.x == INVALID_POSITION.x && position.y == INVALID_POSITION.y; } #endregion From a8c4836062953847dbb785e5a1b870ad63f7623b Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 30 Jul 2017 14:32:25 +0300 Subject: [PATCH 48/58] Updated TouchScript icon to look better in Pro skin. --- .../TouchScript Component Icon.dds | Bin 21972 -> 21972 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Source/Assets/TouchScript/Editor/EditorResources/TouchScript Component Icon.dds b/Source/Assets/TouchScript/Editor/EditorResources/TouchScript Component Icon.dds index f08af8af8ca3faeb23223665473dde0a92fac67d..82ead2ebe1c7333a785ab7bbc43cf4dd294152a8 100644 GIT binary patch literal 21972 zcmeHMTW;Ji3{;wr_OCfYF3>xqzyd`-0u;z~dXrqM_t}c7$DnA6mL1uaT^iNuMRGVp zDc&@<+uQT+5W?4|PvIr@)WQROgz!1GA3tAzeY@S>9>QZ0FfOA-fySlnsvz|=N{2JbnLTD!S8z3tcXsEBCbO{40J}S#tgr_x~!zR(M>h{&>HY`W5_>KG6@o5~81_5^t<4naNTESDcFy-X`m%x`LkpdTIWs zlc7UX{uOveDb{b5>R*x1f5G3-VH5ra-ufaNo^$m#^0_L1sAcktM(RHFs_jd0u#RN5 z>XrHfO6AA$Quk|l!w&Hat`*czj42uzw-Y)OYiei zd#`^t_a9ed*L%=W{hdD)_}A}p4mzwqRB-+qz7IOC`!4lA0sl>PaQ@xB_fc=zZ}M}{ z>wlX1<2*Du2PdjKc%ygz4ZaU}{ZDuAv-8jDm+r#{=7@Wi{-b=Q|5&!&uExpu=S#^*vS0FUd?oo zKjnuu1n2(zo=>m~+(v&IM5l31V;+S01BbRpd+CokVsL-9m;6f~6u;zO^5N^;A904B gn-#}~KZPm!VPnSMj8Wm+#DBm+O=V9Q{%oMYUl%*6_y7O^ delta 658 zcma)2y-NaN81MSP#H{lx?o#yRi~@@Up|%j@)XOkB90G?5f(%?6{0EwY-{2ZF8YtZ8 zD1jhCgF{e*;3C-2*k;eYo^m=w2gmQ@`Fx*lmFrfy`d}5`YaWaad7PzGNcIW}`5!cr zPVgSTiS0SvWV#pNk;plyjyL0tKmCC_I+OQ*-PVWh&XQ$O9>dMfoNk%T$4d`{7R4QK zcqHaebUY`}!UBd{uPi>V`|Ccu1$rzt!`(3qgX5aMg?|M0A&GRv@Z>1FrXJ64%IuhW zOa2N{Q;9BoiKODCzld5=L_)dcMu;hXa&D%qgxZOnVxLswM^z=Bx*%>tTH#Sk-7y|Y zml;+xCtlJe#^Z{Bqs%qq&#DXc4D)qay|x)Vz4t_KZ4u+i8~Sw$aOm2*ZRjp-8whLA{VK FbH67O`F{Wa From e5af79b54ca693a315e1a667867a63e128a7d16d Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 30 Jul 2017 14:49:25 +0300 Subject: [PATCH 49/58] Upped version. --- Source/Assets/TouchScript/Scripts/TouchManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Assets/TouchScript/Scripts/TouchManager.cs b/Source/Assets/TouchScript/Scripts/TouchManager.cs index 9ab43569c..2d4338d8a 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManager.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManager.cs @@ -163,7 +163,7 @@ public enum MessageName /// /// TouchScript version suffix. /// - public static readonly string VERSION_SUFFIX = "alpha"; + public static readonly string VERSION_SUFFIX = ""; #endregion From 33b1bd547b0b0b4dcaf1113ee4f2773ab4cda058 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 30 Jul 2017 15:38:32 +0300 Subject: [PATCH 50/58] Updated Asset Store Tools. --- .../Editor/AssetStoreTools.dll | Bin 97280 -> 98304 bytes .../Editor/AssetStoreTools.dll.meta | 30 +- .../Editor/AssetStoreToolsExtra.dll | Bin 4096 -> 4608 bytes .../Editor/AssetStoreToolsExtra.dll.meta | 30 +- .../Editor/DroidSansMono.ttf.meta | 4 +- .../AssetStoreTools/Editor/icon.png.meta | 6 +- .../ProjectSettings/ProjectSettings.asset | 344 +++++++++++++----- AssetStore/ProjectSettings/ProjectVersion.txt | 3 +- .../ProjectSettings/UnityAdsSettings.asset | 11 - .../UnityConnectSettings.asset | Bin 295 -> 4216 bytes 10 files changed, 303 insertions(+), 125 deletions(-) delete mode 100644 AssetStore/ProjectSettings/UnityAdsSettings.asset diff --git a/AssetStore/Assets/AssetStoreTools/Editor/AssetStoreTools.dll b/AssetStore/Assets/AssetStoreTools/Editor/AssetStoreTools.dll index 5b74582181f318ed4b317470513c9ed7cc274efb..052cf908e56b624adaf226af585402fde4919cd7 100644 GIT binary patch delta 42819 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�W=YX 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 CNO1@N delta 41939 zcmb@v2YeLO_6L4vW_Nb8*_6$0b^{4X2q77g00}h>DWXy=fT%Q)2#>A{6R;4H4WbAF zN*n}1P{0BxDu@Mr7En-p@)Q&c3Ig_my~6Y1|9j4z-7Ki@z2E=;j~~z8?>Xn5d+xb) z?i3mu^~PVFOXdex>la)s?7t%-xpktV3o)bV&JR4dn~D&*5Y4b|Qi_$UtjCo?WtR26 za&y{8j|=hWdqO~g|BgJqwL!hYrM$QGSi%TJRTQgVVrNCOW+&z=4r^^O25~ZMf^Q}#xLNB@ElCHgL z9S#N0ZVz!qCYf@WH#p!|F&If{TFA&oVsQCDh#Y1UNm#Y28Iz{pk>-G^Rh7{)k+Cz) zNq9^~h4Q$yGNT~z324=>0x{-TuVl2%j^+v)d0-}L8TAXP?adS?BD>K_Zqcgje$>DZ zLqYbzcmS||5xLP5Iv&l|Wi35Thn6*}McW7)cBQ!*{LnYAg{o0a#c~r+A28>FmmB&HdNfq~?jLcZ4N>LRx~+3W>@z1R*LRLk{CSacj$Totu1J_xG;u+!ds971|G4pGS7=_gL{cCNBv>MPgOOHu_wWi4KknH(4F<@Y>p!I zOS7Xcrm1x)fQw4tv}SCj!l^?+Ec~Uq=!oBzs6*{ju;S4j^+%wrYxPITyk18?0sW-@ z_h=bGr*Q*HDMIEX?$qdNzS^g)lbIR)s0iax828jZ2Ab$HSEGC_jCsf7GPfY@u+zJc zc5+%zcDURp^=G2?lXc?;Yjjqw(%y<>4Uv5yDJ@Ah6OA1$1)<``PEJdX?@&}r?sRAf zJxvK3Ww2RbeuJWzqeeO86mzsFhg@ThBg!EM!5N@armh`t9^FwSbApmIm&YDne3c?)F%_u6j|3{sB0}6(&MGN zw1x=N+%{mpvpfV@n$viaki(q@uW4+Dp8^K^?^b@!u$cL|In71Al5=T$>bym2T{)r^ zJgF23%tKEjUy;AmfgvD7Hri9wjAy``(b>8vH@Ey*BpdrsM`%0~wDvi|eUWN78>GE2 za8k!$)@!#DpIFQ{c32PQW|jRDOph9V6+hl`nh(=d<28UpG?B3v3H5UW5V?UB;WF`4&h630>j0t*ct+v>X8;Gs5pcRFQ}b5+1M~ zZXJw}Smh~E4ZjNov(Sr~3ConUqK4l_k~(xNfsr9vBLL={1Tl?=vGF{Fyn39@y8?pB z?#OVOz+8>I#tV>o^zcq0BAyDGUi9!TutMP%LBlVB6dAig%_m5EB2osHKpHb2N3(m~ zlwIa_{~@=Dz@YEFUaQRI=+y-_dYQmQQvaSujmo*IZ4W5A;Eo>|&aq$)zRfwETN z1xKqrh!Q;II?_C5J-T@VSvdr@9G~W0z~&PaG8)Iaxr^izs6vEQV>FVr?<1L5i#f^T z)w!`T@6ptPX)8j_O%orrHqUv~-aHfeb+>sG=6p_{9zFtY0rcO%Z{;p5&WDm%75)^M zwYgz|t&iH|bwwlS6}+C;AhgY`U&KiYU?-C#s__rxCtPXNSXKE|t!j|d>#9H_2v;Dq z7$H{L2F;_;T^D}EvhuH0Ua^we8trJ&QX9`e*Db0v#sP3uco@>~%SL``NMoEex@}u! zk9B?9lH%sFK0~R&93%WWmwtvpILC-GS{f6q_u5__LBH0ELXFsSI2^_#fIwp}q|H@H zcIV(3y7miX_Q+vXOJmgQHa9~<<#FgXpF&!*)6E@%#;7~4LrA=nEKf#Br0<8q`^1=H zGd#7oTCWwfIC~~={omk8Ltl`D@RzXVlH*ZNMh^>sgpUyu^T})|*M0>M{+c+t*$q;6 zLiii2Lt!^%r1iJL-1v&hD$*#@D?JFJY`e<=&BMr;X}1WEjdg892DR6^wi(>Zxg)M? z+k(5e4O*J36VZ0Ywxr~aI40t^>hE{`dtetN2SbT9Ji;o>2QN=5>#*)}w1Xuna#3$V+_@t=9^NM8M9rM62S@w}~sK@?MZfjp2p zP%My!y#j^Ot`=LNpTVAi1xod3;a`xhpi!*LbUj9~qeu(?YDL=RE61&yi(6XHwo7gM zKj#^F0v78r<2cG``qG1o&qKtR!4bje{y#V(!&HwM(;$~ET z5tL=og@_0`x6EOq7FyUrvJ#RRP9$Z+rHKWxc%4$XeyVwwb#=)Z1~Hq>yPDBy=B+~| zEylYcPAtb#Be23J0C@B|8Y(JH6`l$Y1m@YPm?&scgo+0$mHTMgroMok1?Vp7ulI0A4&Q4%-oCiqi?%kV z(PnMTrKJ7RDcYV6#ihG#ZA@1V?7EL}CZ{ao3z-R*v2jKGt%ITb!@9Xcum!t;NsJ7? za*EC~9Xcf40w+BUeIVAuiPoaX*ljIJjb6n51F=5kB9;~kEb}PN?>mG`e8Hw% z;bd!JY34*~6<6I5D%J-tu=h;Ek3Z3uSnEdudy@cR{HEjgPylxPNoJl84N7kLl4h}O zpEnRl2nV5J+yu5i*%fYL%NN74FFCy0N-oPB5+XTfZ&@XG1#L&9;XuHblE6DUX{8)~ zih#70>Z)Taso~YAr!*X^LtRd*BsyOU(1sbuiOA z%o5;86PLe?}xhE@m{StH;SW*xO#8ztW==ysvrmK?mvige3KDWGx-LFiz_ z$g>{o)+O=;4FR4HMIFVmq8o>p)8_SlY>;qfO1N7;7zS0fZV>&{4JYekP@GW(*$gzBQctst%5zOHTn(;F z=Ze8?)o_m(4xfRf*(n_ZXae$wOJb5>xMwV_)=_ccUSNcKQ%{q|%pu4Z?n5}LVU<;6 zC}&y&Dq7;O2VM+AzC-zN-4h7ta*9b*d4_Ru6jh_iT2zs*6kA&=T4(nqQvq4GIxM-e zbE%vR_qD#QC=6kDpx0xubEvfjC8tu-ILqo#8Ok{u*(FB z<0{J|{h+gG5?sSY1P}65=ogqbl7?(BV4e_*8u~*Q`(~`>dhGzDje#IDrXX`8iT)@* z_Y}GL9T{DQ+(kmz$Cg%RRjAE4be~G>=7b9C%gOp?aEuxdzGw^>%dLy5x<<&K@?xsb zEg7&xeRyvMavA5LoS^v)G0&$WiHYmt3y>}{lUjg12+6~9tgfUlmFy%l27n?Pd z3&FHc0*62lf#hQIjXw&&?_iE;i43Gx)WQ5PmZsCMG8nAFU^cJHgv$TqwQ&_nCP%J} zb2@Tb4RKwbAi6+_{#0WPvd}35F3c$zZoB8X6H-?VwO ze;LxyA4g@LQ!<@eD8D7QJWy*wJ_b+;S(dF^uvKC$bWwM5Qx)Y9D`TNbG{V8pSkV)%O^56QXO@2xxkY zk)%Hg#JnFZ&)0r9MX-*XkzPeyHflZ%QO06imE&qYPl(-pj7uTI1th??y^YZXjLSgn zX1TyB?b$s-{+PRwwIK|rgPh+OL(F%mlVRw1Z06;ZwLN?^zlVem`x>r59^O~nPjTOX zan?vI=F{~mPBef1Gc&ZW;ocQNf8m+tr2YVzSVH4raa35ZYbZU)oLJpjY%j z$c(YgexhMyL{wuv3>ixh&7j?0H>2DJ#Mx00h;CtRKmthF(q<{Tfh8$5s3~s?lYC` zqH)nfa@6q%jD=_u%r}Qf4o}Wl;frNt9O{KDE%8729DysRJH7QkIxWX@d0W^wCZdjs zac;DzY90_S9u^^wUYSL{$ys3wD!@m15(mQ7kAPEzS??=qZkp1HGBFvIBg+{y;=+@t zi1K7$Ty;$b@aS^Sp%_!F>^}V?N-LcG$ejeu&D0b0<^{r@ePnTJ_%##|osj&c9=_KF z(?YADU4Z%j!d8x)-Dv#IAWQhGy$%iBcqMw7*|nABJoD1-Q{h#hI;o_ecFOh|R(Ln_&*;-xlUr{%vVq!M~Yi9sg#T zH}G#O^A`TiHdk1`oLR0sYL)g~s)Vgweb2pk8hJAfK59&RY|+bu9Og^V=84$chg7I}x_s20F69h~9T2)Kx!R(a4{75@awJ$!obp5x z(y6L$%z#tUcLW4}&#UNsL}i_U4OOtjL@DY<~0F;lYtL$Ne^_y&g^5Y>2! zO5q8E*9`O_z2aGDnQgMI#pkqu<@M)uM`aJ6lYa4kx6jjVT|FwH*3}X{slSc_c;Ys~ zuq_9zYW%&qSZhGP;^LWbeG;9D(=`ejaV9dG7oaM-`8QDGDykZ924Aq&^y{G9XuZ}i zec0&}%M_?an~GYB)}HbasEt9(T%x%Va<9t%Rg_RDWZHNf-tbAOaW(X?+pq4Q7l|!= z7*kmS+eXogCJb)0mc6Js{xGq<_GjhepuleG%wA)t&^pY?j_@^z#uT(|PdFN_c%sgA zc2S*^PObD8{oA0@$peZbsYaW<@Z! zVuO^^ado&+hGhvpeR|Bwv`m<0$Cw)B((TcGq~ADX1s3Q zxE@6(C4`I{@#}Z+Hp%aFg|CCyulpPkzdPtpC?5@bKDRGnB|YF#Hy1*q9z?2nd>->5 z6duNvqo*>5R6XV%V!*hkk`_as2lt>zT*1g`8{wO(KAbwxV}Aredd{p^6hfAA;PEHcz+rrplwS&^zWM5nT#s@0rMh-enb^-#)Scxc(aIMRnJL zwt*S?>ov@{36egLU^1j+J&DyiQVlNzwv&sHtSBQbDO${;tD)6PjvLNET-pB&Z2a`{ z*3k@u9bvXW^E+mmm~uT?K!@wmR%V9Xz1;l*Tkj;a$tPprrUk zsPP^Rlj}>AUW1Nc3`UBg<>8A7lqk#@c~<0tbUd4M+Xa=Km%)I!6GSejyqUMhqHzTb z*frP3;}uICRNbFv7j#!#@zNbxy+}n>?5Uk_?aiouE!IxGJ_48R$qmbvu4dX* zA%1wKb>ko-QrgC@rzWd48CW}IUNByN{Q~! zFt3|A_G4ODu*uAuP&B^-ahb;oY>Rd^tm+|M`}8S!+9B4G5GD*AxPYB*G!pU3ltiBSbUd!KZ>XVcu}%yv$>IF&)ALJB zH#E<>h%~RfsI#9mKE1T8Cu>op=j{ z8==7P)nMW7izg{NtfWf{3&_4Iy`7HmRYDvG~YSv5>h0Ik^ALB&J8t!x;lj_sh<##dO=# z6Q*MkEb_SC57S~^$pK@`{-k2g(H!CTQB9rC$K>|HB`!l@{jE!fmquiDmqy#oqt`Bn zp+wacto;<(>TiR@5x$+uaTtdwUg*$XF%Sj@P=`kJj*{LoifSFv@Cq_eo&pVAKduDu z=%Mg8Py)OIu=3;Pn|PLYL}_Oj^YN;Uz{f0j%L8OVWebTo-#Z2i@(Cu@xWfvMXzkia zbEsIT?c{-Z)6fi5P+>epx4&MomA5R$EgCO^H5@xfvX)oyp}Zea`au1rW@-BITJ8m*d{o4gH!nds$=yW*)qb0$W2WT-vf#4 zrXgh3L&H3-sO5VhDkw)Y#>$Gz6P}7r7d!)JUz`aya_@tBPZiizL z2gvVo`?~TmG#-(0%P^B)@(~&LqV}@h$Su(OU$~ zVB18Sdcxm><3_?K&tqh z5$>LLh96KEU;o*doUFLH*_khZWyf&I7I4Xqq2tL+yJNVTJBDlk*CNbJ_T6gR?3Xb! z3FR%hgC$5iZaimf+et9)w!XYHtB_jVEn7WNmYFD99i7T!>n37QbQqnbY_JB7u8EwF zVAz9++Ramb3o4*<>=WZ!56?&aS!_8Rt}sUeMJdETwTa4=KDfgV0>~#aB%cGUS583}r9E1uIF3GsEi+a~It27$+zp+VAX zzH8V5#ajeG}{>;pr*XJHnxJvCnfelG6Z!GKqu~SxUr}4D70{{ z6r%emC+IB?Yqh| z=&w+}I1m5p@%0fhMTKFBqsKzgWS*h{8qdrQIX~0vMGe|P?1vOhhz2D!E&Lcf^{86- zas1XtR*`Rx`g`cd`~`mK%~!RdVf?rruVD3ekcL`EKc=e#mUCY0o**MEs@+D(yGTnW z?`%%4K~kHED;cGtFFaPwL>MrhM21NHT2iYc8Ze#$hwpW(W@c1FDun7+$802)_aP(F z7X!!Oo|z3W9cRgS8q7+p%(yhz+Xxxo+%ld4H~cIJs}{M!&nY+q_PYI!Aa-ErN>~Sc z&XstAf?{KKh6{2vr!d>hp2Xy9)AVNMnNiIOoWhCnb4a4rQA|U_c=h({39|Zf`lHZb zj@qt>R-W=CXsdM;ILX3LU1I~Q``BFf4){{kq4s0zvayr&!SJ#6dF$1&*)>#=xK6Xd zzRkh+JOD0*c%AVAs4Kh^G}^&2lB23d6FLNs8>%2}NhUYki=z3wsrEPPym5IEZW0ok zgHg%76lfXDU9dTWVB>wr(m*69Df}Y1oW@p4r^7%o1Rgi6C#zWcgn8FrSn=p~ZoT#; z*l462$QHrnD6;uW-E=0-#>}%i#LKFKpKPXH*Zy=&8N7 zkkeno1{7oWJK86i-@!fOR|KPxBn=x@?e zyTLN6D0LN5#;?|nzqRtcj3nZn+j~Tw=k1=ojel6*{4HG>YB|TR?l2Xy@T(wd-Tf#e zh`(Cq;gUDT3)#Hati9tqM&h#2oOXH^;)P;nUSl)Fg9nX0!+QxE7^-$Q#?me70hQFYHrI>1s6B2iq8+2m6w8=Y zFg8eLYjx0iG9WVq!>L>vaRT9lSlT|G`S!Vbs)N+!)0uE0bd1wolrFt(ZJCrCNg^XB zb+m>&4M_w*Q^;pSJ#iJo`SU{bJ82xFCxu7P#R!B!zOt(xTtN z|1N&R9+-9Yra=YHd*IOX|1n7-&c+W~dnUI`qd@54Lr^G?Cf~PyoqVn`&pK;LM;sB) zoYF^s4MU`Mfc4Cj?7VrHJnS1{+u+^3go`wJUR+$tYX64Xji;#*j;hU-YCWcQ%Y7S3 zwT=vhKO&z$1~GpElLsVLMyy0@SfX?FYy!VTamJ zVrl46*)hHBfJ_chS*f1NR;L$YHZQ^rA~tdg&tDpG3hIdHw?4e%l83@QXi5x!y7JTo zvPv0Og98z7CYHky{t!+Ti7Qolj!d`jOW78+@J4AbN#IIY3`bdx;1H?VztRPk?Y4B) zqs2~xI;;+V3cFrB;l*PpVPzs75#x8y;`0%&*h;&yFw%jdM+YbxUPLQn;4e)Sy->yo zs-l)A4AM!|D>{IOtIk$HJViSzvcPe~vjXLAR+6vC4Av16H$7VY2U|hgRs_a)se+lH zkqb10G9}P+(|^cBmm_v*99YhigFKUlQXT9{bOobGtaDV-C9ks*GZ6_418k#&WT>jq z#zqm&SV^q>n1Wzj*o?^`YS@vo(OW~}(JH;*=xjIq8MP(O?a8bJmDa$hxCl5jkP=3>}L!xX0ZJJ<%x1F#|UAzJ_kT7op7fC8)T5Id&X{`b@gyhS6 z?(zj>-EBN%otRd@cRJR!%}jI2m-whI>)K|SD_~(=+g4z2h7hKa|)FD$Mz zzCdmKPWC2Nl6}{-`3{I*M>$vtJbc*{y|Ql+yRh^*t-GeXMo+_`mpszuyRMwyyqju9 zTLjcBi)u#W0CA%3E33918uB*n7NnpS8#LxK#4uk1#eC*4&yMg$Jf{=3q_h!F#m<^q z&}@HF$HI2O8CbXF~(mn^9x zfp_{0%QEUhQg&nftjaQq24vmTDW^=$MP!o)t(?8vlNx8BZiWn;rcQx$9tQ506lesP z)7H$|(dU^c3%9^Vt!^92$y?pH9g`3pq&Y<=s9j29w00o!K17`!r@`yd zp&Sh^nbB!W8TR94YaVV?Krnp_mWeoDR6uFltJ zj+ha$A*=IewW;ql{tvau#B*5zO^7j=-+esbVeJBI?bVst-@tOBD_G4gEkE5Q>)oqc z7UHB+J`|13GBp*>bdV`0uU9t3AjY#YuW6h8#_1MNhgr=kqpz99b0FU<_moe<^r>er zqRww~&@F_Xw~|GclcD9<69cMHsi zPj}E#W@Q%q04~ml+^ml`bj+Nt#AqQ$wOl1ItozI=?bZ>JQwBS?gRG$(YFtTsf{=X< z6UT;GSxKwW8ku-@Y9Yc`W9^$2Dp&zy)L~$wfIp3ZCj@Dhi1QoLTW4omC3Pw7rLmk2 zank>sX^(%gn?tz%KseXJy8g#m#Tq)B zp2og*cELz04H1<^+3`hOsV+8Z8IO2Dj)p`xX>BwnW0>%DLnv-PuA84)CuV0|%s~mp z3HTLkotI9T(*;lMEwK6BpS2$3=d1ETi25CfzG{4LO|7q1F1I$;cPRP+^+&Ui;O0r% zI#suIegt2mwT5nVkHPO)OKIp*^b^=p8@C=@v5flg&~Srgu4sPivW9HsEUTfR(}2qn z4Qa~FoA_~n2R1z1?`hx97IRYl*e1M8*_Y{n;Bz}G)`EX8qaD!0!gp^a1@ei-Afda({$bZ z1Tk`C&uKr5&b9scT7`jYF;7)b)D#cUFcTl8FdD$LA$@cLvse^*(y;miCe-4n$YcCM zrSSvad=zU8gOeE-Me7Ek*^?smFG>wY%9hZXn>qGW%qP}yIWgDoMlEd4Z;F+AU3%o- zFjW6CRc<9r#A%x|PqRiL@jHx@_>oUe&ml*)0NT0GzwGz=nn;3$9QS=>h{(3A5A`B! zg+GRd&ly~tfkj9$eupX^<b~u85z%n(9G-( zSsDAGlnbr$>+|T0P7j|X?G6T~|4nJWZp5xpFQ79ngCE(OKx5p9ELfjSLliIP3{X(yc$gD~LOwbV7!& z^|4jT+er&^!;-IrH%N5{{BXV^4jgm^sW6jZ=|5r+cJ_j&M& zd?g(;m^ZL6)@SUS5@ZlhygUvEUFu zRW?6ezXtlXKI`21C1bJw#FGdVhp0PJQxB&hV0i9z4`tiJZe0M17Y8x?(8cvyJVc}8 zk<6>{L$fbd(0$OQ{>Fb{KMas_)_e1NmrtRNfb(nAORGN)Jy{ISTyYmnuf@@a$H4Zy zxZzF6_~ngji669vF38Pq0cnAZpB`=rfS1asESFu_@Lu6e>-GihBGYhf?BD@d|2pLE zIx5MCppI(YUL@snuRNR8{S#QNBeifAOwt?@eQt0nIg1l;tmM|D zoYdbU2iJh$Xv@V{smc{r@0-#itzgch+VKcy15F)S{{}Ltbwp88UW(vPc~GJ2RK6Uk ze}@!mbD&+1UV!O1my+*t@+{PVbT8i9F}mIx1rSHy=)#>wRFWL=iD%nE5p%Pz0YfW# z3uOa%=F8|xdy8WRb}3fbLVwOvuw5~W;I;`+nq;9kUr+^EW8u`Es4cdtrZKDtsYW6#cCP;B5b=Bq=7=_SH40^rgmq6%p zuS7v!>$QcU*7c|@9u~P2Kj;_~FT-Yy1S=3WEZ3qo<1gf}@lGE3!_=x+TIiNL7i0mv`qlIWMO2bT;J*W3i4sO;Z9v<$KW)=3Z14J5n+VttE?s-u6&1I)Ee?KU$A0 z>J_;TxiRXf{p^(y^Fy>f=Rzpo9iSTCJSlWWdpKxxBqOCnFsM8RzT1Xxb|K)=4OsNn zdnXc{jr-iE3wW{CVM>h{jVOcGG>^Cf4EnSEz|9P-`%{r!t)ot7vpbW~EB$zm&`;Ca z6XY$4%|>X(FYa`G#vzi~?M7(s#JowdzFk}t=|WYZcF{SQe2>eV4|CzJkeu#(H}Log zPuV=wis0B29yORA?hZzQxh$^c(LE{GoTdXiGpR;!vx7>Hb0It$xPU#R2acpDJRHoP zJ>fl*{W3|W%- zBvCxsgsl*!srSj)xiCSCpxq{v2SbiB9U2R>hlYUooz_cB0*UM4FrRzj8J|01DKemJhE)uG^?~&1LBPF#;+B!Lr_H3SG$6KdrzI;tPyDz~L{=5txDn_L@HVnV57BtaODk zKTTz)!|kjdx0Wio)|Iyw;Jc2u-P#4|e{lM{TZ1FcgF`qelOKO72EbiB`$QiXbU5!a zgXw6dj*#Hp4qF0;d23)_HsX2{Z~lR(bswVihF&1y6;_Q^>BBt;`M{CJub+pDtxZ^oTC zFY(05)Vfcph|Abt%7IVx+_khv?#Q^-&&2)Ir_q|yrO%{Gzx|ayXy;$^eQB}CE_ zE@gLPGPUk=nBWf*sddB+mstyM>w)hf?O5iw6T)qZT>tZss?n^3y;=*5LQtOTZO9gtc%yXy(B7z*&;$@vraShg}$&M`h z3)e{gSFXj&>d3V&;Oi-_!5_Fr3gK?hjk$Ki@>5;=mhz3X-dX+^u95t& zT#J|0lWX0{wQ_bXCR6Ls$86W=Qv_<=_rPi$DTFKHTvNWaZeG?2aocix`Xxy;4PY5; zC5kYDXL85?0XeWkvTw_){8T{m9ear-{xmj6!iIU#aU( zE*t^EoJGcUehNUX`w{61thd6f$K7?6AC{oc4(WUmm}pz8=m`y%c{fyGt26T8tEKB# zap0$5PJLN&^%MF1k=OJ}*Q*x?7t*Q^S~8#69m>->>X2=sqN| z0EmC#e{6KcTKw-onjW*I4Q4O=k6`kL^H6(%()c+bs0q64A|2gMS!fB%ooS*) zLQX=OID=_lrWZ4v4w@{kg^n)PCu~a4#h!$#TxsI%NWz!M;PLdrmwwYcnVvLpwr7-E z7gvDe5p|wI6nwjfT)Z37Wbu*b1avYJ$(2b=UrIcTJMWoZ;+zAji}7A^cM5ZEV!Dy( zi(b+^%sK;;$mYbP2&v9WqHK30kzWshripFL`G7ede2_CubV#NGE@3(WR2L6}uZz!; z$-+tIpOHd3i0oVwhJX!(fd_?AcTQw;Ef7=ue7U0mZMzZQTd zi?p=mPLIe-D+Fg<8fAV59349Vk{W(8(GL^__^E)|Oz(u$BOdlsuAShdiP!zTlrI%( zP}Cl2JUbB}o$CUHB9bf?1*n)O0Ce$ffWn@hUI=k}rcF%uf$HM(baL)nroX0N<67@Q>U*!1O1CpvS=-w7;zfL?@a8W43_zUoFd0YZGlGMbCqR6i^K}d z=XcptMHf~r#MY?UnPR+uu0XRd%gQj)=P0RSh>gxdRZ_+H7R#MZm^@oF0-3gKfN%pf z0@bLU1?EXuv4D2L{zcG4{nxW_V9fiUYvL>UWj7VmJK%2~J+ zi0XSL&}wC=ILOWnV%bXZF{80I`jqQCmC?Q8M|M;;;r-$_u@*(nfK0%#e{=EIvF3w9 zfzzoXGN0jQp(_+93#dljCPFM+4fLRRk`EwL#bz4~VA=DW?@2LG5xJ@2pFr)^9by>E z-UeE&JTER&sG0C-7S#6@fdfty_&uXNqLxuYB$HI%60;O)wR9k-cu!o9&z9p#9Ozp0 zJu#nAsf`w$f|fAqVat{>8e*f{73zr5e5+VC&X%oV+00C|KNWG$DMmLiy2)1E#OMwi zZB{fmx)F#ReU#Djj1G#&8NJWwu-L}vCq_raQ;gEGDBlO-X+|Bh(Ed*Gp?H?zU>1HP zwlkW*=wtCbqk2Z4h@Fh?Wb~PMkc#GBUQy9Y=5XIEjOIiKmU?9nv!FrCD7CesF{H)hu->f+Yy z>p|}YM-iK|Z%kCgbJ>d$bv-kuN?hF7CTCIN#f|Nlc4Ar$s)zwO+dzjgy)uXLUY)Z& z(I>Ja;+I5C_;d5o^II{k7Ww#OSGK6~Dxz&JsSe2LiFBvjbG&U%(X40vrA)UnrM!b1 zm$n`ax&{>Ev%KJJ=7sok$GVceZ^)`{~;cuHZl%bUASxhf!Qw7chP@lLO z9G|$eje_;?eojBr#)f+6!c)b;h$6hYF8-m^3#tU=E^rph` zse>EeDjJOq*9S${C;G*wpo;jRXk#k2lf@5$wk$pen~@I1TT+AEC_(XSNj@6O**?*y zh?MpRk2FdgLu{???LV_Gf{Ad3$Qs8SO`>VwRrQJ_Nz4_F14$w5MX8W4f1> zK4kg>Q>{Y|b`Mz{@jrZ+LYgXu#|p9j^&n`K{v9x9`r z5&66fVYhp4i%ws|L>s2XOgl0y2UWzmoyhB9oxVr<@=m{inw_YY*D+n$X-g{H>YU_9 zEjyFuMNCI^rYeo=90GqP(?+HXJLiIPYlOueRZ?2rnYvrH7=?Y#s4g|2mv>nW&SXx{ z?lRurMtHjBV|fiQEdbR;*RIrWD!ZGi#oT!IsGSf7sS>+S4N6Iaql8)VOc|M}` zbop5r_x}JL+;{*qC_XMHo8RF5entG7X<7xPTQM~%w!*@aim%gKi{i=$BdM)L|H`33 z0PZFeE2p4y)m2iLxvg?kP!ac6Qs$>B$?Lt9*JIKs$R8UV+;~?N4a@cAPebP+q!sZ( z)efZJsG>F1n_C6CFy~JEa}lq%-iXohZtHWrQO?4gr@$}6Ob}^iJqOk+7zLVGQ1CX= zM+~ARP>QBcvNWDQr|^T*G;b_y)|Yvy7)=!SSm&p*K860;ZZ~4mTbQ#oUCR>X2#Y5A zRvZD9s^|A0--q|e*&5z>KsjqkVxCw+S2$vx`37fEq&#+i^Wn~ z_F4|1RW^Dbn#JO2MsvhBISRggFs(#d(Q-dew30WqJm+7D?Zs|pzKFYq!rNZ_)}B;$ zim&ib5R{4h4icRZ+1@fyVxyKyzPFR;!stb@1YaZ!Z^}Gtptp-CFD3mZ_xa*dZ#OZN z(LDEO>g7P=Y!uKZ0L@@DM_it(i0)!o8ReTN!q#h>+C|>ZU8|If-*Cw*#3#xJj9{G6 zPq}lv<-)L$zjckM6s3%oiMFj5d#gk_4&Y!bBLh9Hijvs#EEA=zAA>B4&ToA{>k&gE zT0i6MA$oDXCJ~IdU-I@8jW{|LVwrfc^(WpwVke^}ajf+(-m}E)a*{QPP@a+0PYkM% zsBPY;qyb_+qh;dEylF}2iw!oKo_BT9An}on8uAt-4Hd&GWxj{<)+db=k5)^xJuk98 z=~9u4i*xEo32oLYmx&UIxK5XeE{t{x(|w#m(e$Wn=(dhV6@CVF#muyMr@Wy z)Z}+h9wX=jG30g_nl)m!jT-VtC)bEgHd>TFHUfA=Libvjxm+ymB{Oc#p9=J-jsBT` zb@EuTJ%$>R$BAEiv!?qn@{Jc+eI)umf4+0PC}FhB?QHvoIzd$1vdp#zvc3oFw^#7oB}=z4Ptw3O+h z7o#SzydWjT6pz~IiGr+@8G>#_kkLH_`6*Y4du(*Hpd{rQk=tL&elF;eGE1zoQ9@yL z%52eVfRyDH_DyLJ@7SoK@Z6L}F(WdNgv-P^g_oyXCwALt7|;zOi%x$a3l}z|%oj6a zXlcqKvBySB3OA%I5#KUu63-MK&~6hST_E%AFWjcwCQ1fL^hM#)l-tA-8=Zt~g%E=y zBy18+<9NynG4w*IT59-HSBn{pnnbmcow`O`W1|O*lGJ;|b{oB6bWgokbh()F(JU|{ z^*%8}B5?rg&I4k@B`g!iu_JqcU*U+(7Y_*cFuEWYb9ksdfNvm@svKMoh!RFkqDS#I zLi>!ip%Zm{(y{+iI2v~i~{!$9uxF15}8S1G;xANbeHBav3;UMJsD+8l4xkh8pxK~ zXiUdl%HyJXvXouXaV^lfHj2!F>f>S>!zOV{#|wN0;kAqQpi$a5v;RvC2k+B2ax!9I;{B zJVk65=T4IuuYl@yG0H}B7)`ZN6Qk{n=82Pdu?6|2Q@(lPzS28=+r^j}(#r1A3EmxI zn~mN_zURd|Hu|YFa@hC0_?BUlXjS%^?*)-RlQK4m?m#=mG)8iT-zBb*$o)&%2AnB1 zN+evk`?5b$awpaAMmSl5;)>#qz z#Hu=p(ijbzE%VX1i|iA_8W{2s-^oi20v*zC?=p|kh4_Utd4KcKlkQ^g#iZP7l zxgYJ^$N#37Xrt#DO|#LPjIOcKwSisAo1)Q1hdZxT-i(O(HvCKl6iaLr&<8r-6sv6X z4OHI}_t@yS&I6rqiOn`j=(0h)Ew)J{{J5j^w&*fP;7>aGwkT(`3>(EM{`Vo>+Kfyh^4sSPjbenH@Cv6s;@F}nMxz&GL@8%^y#Ht? zB!+ebPKuo|v^yY_$Zs}0k$gf^755@(^hEM&0f*8hhTaOel)f=^Fp!`Owb6CX8j+~X zkD)%QSJ@Op1D#3AUPdp9+Z?-;WaWr0yUnpzPgc4_ZlMC3#NqB!wNzz4qh;>R%BX-( zIT%Cf>1oPmF*G*dSALD5tn`55SVC4P-?Tuw5{RKT=|LqohKkZdN@)z0rDrJBOK3C4 z8OzgKD1BqXv(j5CgJNh%dZsdp5smvAk)=$GL#>nQgx{^1OaxTkNCIZ4Y_kGF+6hFg8Bb72ouF@!x zSf(CRS}RLzl#%g^BTu>AM%OvN2m01V<30P8Hp-|w*d{Mj`O0iYGBWu}BcTYUkG{p* z(({$gEF`o&y+FxdMH%Ga5*F1BoR#kTZz$~Z<%Vsyp!^kQW@qj};= z+}iJ;?6wi@UOOo6)$9y!UOOmz))0!!L4hO;tR*-{TvJg4)P+%#du7F9Z%1Viqh;>< zP<%&al#QNYG*Ke4r{ah7j>-%h{ggXZ>!j>iM>dxUf9v_q&dNa>B~-Qwc2WA>L$Y}h zgvJbZRVGR(T2$ePRSDe7LeYVd_dY^!wCaRbuKa4F;Z2SR5l#ME#@<(}$X>(H}>;1-4kp2AIkj<{u^!KZM~doHup3GI>? zufDoEglG5StlePet2u@H%yXF+^$Sgi@#?G34^50AcoCXnBN{ zdPHbi43YQkw-@#&@2`&Ijt^aHBWZ0`O!kv{*f%?d>Z`8^;qk;c?^kcnY&APXcQ|Ey z>Z@-I&5I!_@6GLn5sJ$#@!Zg@$}|qN9RHSb4Wqf@`Rdz4mNGw1wp3YS%U-SS7h0-p zz$I&R4|JQdnbBNv0J7VZcj9Erlq0t6;|PSy6z@aL8J8;oMsvk6$d)Uk;$*ig<80Xv zkln6qd$>8@3S~Q^x#C3izR(KAvAJ2cQt>jHE0iAlLMxTNFf<78`; zZMJMIN}zA(VXL_T_Y76>AgCsu1a*k#K_x#*ceBo`aePXv;@ueM&n*1sT%SbP#CL4s zlUQ04KOyZ9N!jE?0n-wunwg3lx`r93F51`$3Yz8Dz^kpgI@tvQ?!MWHjoKOlP(s&K3DYS2Eqfl#0Zi15j1$XO4`}A815$ zDj=mQP~0T}b=dWmwU?AyRKaZzvAoP_{!X zpy^8y@uU3S&Z()$+?n|C9gw1~hyz{7G!0!%97b9Ze;mN^x&D}5+YQ^*Xz!6t^KdsZ z1OfOmt#nUKRYb*KQqrH;{d7vRry}GWDhrmJ^>`sc6%VlfdQdE5^rMO`F_uhg;_=fs zf2Ju-OAD0N#Ll=}r%O+bB1z@>r0sC;Oc9dG7;I*aq!Ia3 zUO_RC!?-z3cV8)UGbcVBmC6qL4qG@1s)=Kq>t9UeM4nYic8-9mLhAg+oHE(}rHRQ^ zq_m3ZA7}od)g+z6le%05=&Q)+fXtVjmuPf&lN6I4(|Ap)q$;9P?*H*(=?c;RW{Bnq z)t(QU({iG7#0nrM{)7Dp!WH%9bk)b$ccTBzmH64BIsM;Up-5mE`>W#RBt!JS6)%VD zlW~qAWsby~Opp8(jho1uV}MS_`qIAaTT^;am8SPl#rMLS zfQP}7aZf#0oDf_0?%AV7DwKy^pQsheHrKz@-U=PE3|3xosoHSmBiAmaxA@tWpzXwG zZc{-=D!E#X5_A`8y~S}y2{@l>U9>&oC#{#ZUlhChD*Hue_ZaPSy1OHuG6w~-8(6O+TNyG}JIYjQh<55hPhUrcnw)q5;o9vP;Ftp^YJ>xB^;di< zIoBITe@4MQ5(mMpOA;@EwVz#M9sO5||Z%mx-$mhs8lxGqf9fQ@M5^n<4yfruD zC&{~38Ln1)cPTZXOC8fWeJ!UG)Rcr3jyarOz}cGAlis@=O{zDEXltgOK^LfllQxL8 z>a?W09UGayQ3c;}zEKz%?@86RsP`ppaXhI$lJulwg|ahghhvAjH|ZtE%W(Cdpx-3z zQeIZ+uIUby;y7IS9h@%g_HTmR-lw)neh;)A=mE7Vc?Wd*C8LqmtCEi(?l&Ztfi7Z7 zty07NdAM?G#PtcHuq1gcB6UY{y5l?b@#JHmyOTHIouoy{-y_?>Ai;+I!yF{tbj`?nNE)c(ha~xmh+onv{2I||C1;R+X z-FdCn33P#|O1l%%v(oNSkBfm!N9y;2GfjWcc~lHZ>jC~q{RwB}s2InfO20#`(59vB zfYNpPREVePFTzlL+8gR3o(ifl3i~S6Jmy+p487^}i3MqgoPD_;ECT0CXKVGgv;*24 zZByEJ%5m{`?I&0p@7ShXE4GrO;_qp{J84ik^lP>4aCA{bP8=oGp{ zeUTW0Cx{nlpQP~=m9}5`T=_k1J~AibrTPV0s-O6|{$0unt+Ri$=q-}9{mLAz+@FEG zz5Us`qCBm))z@l6{3ZHE1iwZcRVMhm=v%afeno85EdN?%qZXkSJ(p|HTdeo@)OTo) z`QLL4RX){jP)2c$mvRqZ%8o8&M|Wu3q4P2uT_pOz(Q(kfP@l^BQ#nH8V3YXY`osD- z<+#5Nl&UlX^H*PGHuRI!>+x;rC*JZ!v_M#2%CprtB@qw$jpOuj5enR|6MYeDrf`f)KfaF4o0n~IxQTQs_rMRnY( z&t~6_YpVlq=`9pr#CZr2-5B^3V6*a-eq7rX_)+gK-U$4zzpNb!I9#)NUYo7-aVEO@ z^PErJBZ%~GFuFikH`k9&DM@>+!PaltG2JcGm?P~3~Km8nJ-iFMp*xyyk)9J&I-km;Q zTZQ;_(eB}OVH2+in|O7&hhx8rqqT~o_#Iklrt3THaC*c=6YveLom_#Pg6t%STV0<- z9K9VBoMSBLjelouvFjMGcx4Wn?Ww~qbq$9THRxvv!IdzyOuY++n zN59}!*Kh|l{c*Lof19hfc6o5S>$o~4_>v35E4Ux@y5J7gCvFMS7@Vdbbww2A_TVws z0&!1pK3Z@o7jsuXEiT8u5yG$sKRT%Kcz*(Rj4_3N* zD}j*PJ;`ya>nnA-qcD{0?yZ!DpriE;1@L8Ra-EjrEcXKKqEH+69PP3Y4U{WGUphaE zh#Nx1?m3Pvq3-TSq1p{gByA`jMx%QVa$!Cbg`tD);f_~aN8L@1H$zh~O?(pi0uDuf4tks48Ikc%1UwYz0S-CcTe;WOFJX%Vw`xyl2~P6S$Fv1# z4Ia-Y+Ky=%^W9>q7?OZDqs1klGsGy+YeWs+C)z2-gYFi0fqo=j2mMSO20ex^_qy>4 zz~4ZB6q7*>g)EdPWT8|c3tf~*O+uRJ3PG}1rG%lBs*+MbC8Z3Nl(N(s&|Gy9r1>hD zGt?%~YS!$P|(+`VM69n19pY3o{mqd3lV_w4S>?5lUDSG$t%uCxL~ z03$HwVX!e42H6kHe5nh$*z$SobNou9D)@) zr#q-iRdSrEI2FgSbD;u$gy08f94EFyl*;$_EDn{NiuwBQzyI$3yZ^uco>_K!4=5ZB zlT2C=HY;q161_rU$s+nmg~wc4zG0NAJeMtsT!?%q3ZRjcdG{D#rT2v1Mx@WUyFY| zej@%-{FOLM%t#za985f%__xI2#7l_{ zST*gVFk`RJTpMNVLxtKbqODoPpQh*qioQwFTNFK@=zR*`pTjMNPi}SK`r>@5ws}4^ z9ln~npSo}(J}I7~@H&Oc&jNe!jw0rR_W}F)4&VUq2kz&CaN-1J zF@^s{KEzI9*El)ysWYie!qe)x)syvR-|y(jV8K($^aqV~25zd8_$(^JO#cPx+hpv%x<~Z;AcQ-+d$BIJ366 z(*ys-p9dc*U;4Y*{8F{c!(?E|1+m=1SbT9Txdg6iTy)!i1r}h6CGkN;JuF`ji%*5& zbewqPhv_W*lqKG(f-DYLh54%35?o6mcP*O%6VAb}hx?1LpT(Brx&c=+t`!iv5!Xsw zt8lg8x(OFf!NzZVRl$lg@atJ~V8^+v6&L+^SztM(dL=b0X`qsZD(P0FZJO?D@an!R zz5C30Uh}Xy9~s7ueEj+|#*v@DJ<0u>_T~%O{<&*DbL6M*zHE+s@ApqcR^;>9LVgX{ zZ2PXho{^1z7^>Nr9m-|8vuss%>#psrb#VJ_nc)GvNPi^q(JIZiX(-oMII?l#$J~2M zrqDZ5d-0#9-PkwK1A&`zneBPDt}mZQW?i<>JJ{2*r#m}T=o=guIdkzhzU=Vb+2N66 zfBMmprzbzwXRRE}<+9y{6}jBX-o9MVaCU%oyDU^-H)jhQ2L}r`x2;*_JYLU}b$``0 zuawQRp6pO|peH-f-IvXeeZ|XH1)Tp7T({O{_pa&BY|n1a_G2go6uu<*20fTB4AXd8 zhKC2oy5sy${zS{3p~2z8Et&2e5NF%^a@qBn{_NO`^?X41u7VX7jomPpJ0VlijO}zb zT*o&$S6#;s3%eILNCn&~U5mv%&-wOkyw=f|@jD`=`~SYgzYXythuD&L{-+6oFE;Th zO*@d^izv~D1B)_M^ ze$+9y^7@A7wHS->V4B6P(zv4ipq|%+Rr(51d={jKxAGaq|CXiWdR%sL+3qGC zI^$fHerhmHmQD%bOEXzIr>DVt%k(fNdjo5({!6?2&TPIw0kiTRM)b1sTM}naP~UC?&ftx+m*f7O}^kJ2mKWVMMbas1L#Fq_CH(pBPN4} zG~F00*9Zaz&H)klL&KK+v{#q*;UK2ne%Ae`YK&U;(E!6VJtj+|njobB&b}T@*f`nB zvd5hVdbqRx6sPGI9uM?i$0g0h8YFPGxMjbGxxkdz=b*$rrec5yrpXu=P!?k(=h7s1 z!Ev&DSwfYe&v2NUhS@O)d%`)F<#YY71u%xVEc=}FHlED-;T$2DFcb=rROukJVX|z| z)IdjnT$YY%Fx|suT7&hYF<$XYu#{h_LYhJRPFgvx`O;iV`7lKSPC@gT5-E@KFWY$C z%tmMw63XWGew=qe4tp?!ZBimjml?tbPWEHY>1}*L<06{g@=}BG6lsN)$gwF4Z4S~x zk>%^1CENMT&$eh4Kh~*qm-DqlCpFdx}>nQgdeH2Po{(xWFF00?VQ-b>t+wh>9X{q&w#og!Y?VRNbnks zpl~frjM7uG-08?1pIHT)gCpEY0|nxFXMK+23yscQIlcga=kU9moIOQ?8a&|Wh;7;9n$W1J@e&|;Y9;r6VG|4pHG?IK?AcxWcH-Ao4m+%R5J4`=~Aa*fL9mS zRI+WD4cP(JUJYR=9dRp*Du{Fl4IR*>^r~q<&C}A3ULvY!5va1s%Zh6PF8A^(Nr|;1 zD)yrSS^5>J)IP%~N_d29mv&a#8H$(TaF{rDC*%%Ws}+b#U8YR~{txSPgqhb`EmA%u z>kk^pVeqi538&$eJ|LteWjQO$eO9?2Hqc}{`n6UovLkHhR*`y8U7GL*( zp%eS(njWUkz7Jm)72i#oh8Nq#xG;6Y8xq14h94`@SvkbxQ>Ggh)+MsEDruI<1y54O z$qn(DMo#I}@c)ueLmILUJIF|7beud_T|c4&YAcQlwi_;Onk-V<1?%$tf6W zIyUK)CrB~r>$3DDc+kXynBx%!wh<`uy#jCZjfZG+7rS^PU*s&@#pkX$gFQh7XVXQj zS@;3P_tKZihiu#g=tw(xSkRRHb%ToHPDJ)9aT0UBwToX9p<6a`ltb>?aW3q_E#U_2 zG1Lt%wR4mX;a&@yC42^Pj1~p-77`AxZz1u18r|qb`pBT9B0VRmUO&gJl zCJ(h%yEPFIJ}JclcUwXIEB6ak*>y;_EjYu2n066O`=|pqgDTD+@5V;b=_GdZX^kCN zT^&07+V0nAP?H3|Rg4LNdlh#d-m;rd<&Dli?8cFfW;LF`nQv9gjcqsMIB3qi>LH9xb2jeb nQ}HPY`_|`kA0B({(UyOoa@VPBOglSv{~mrf9}}PBANc+P9RVJF diff --git a/AssetStore/Assets/AssetStoreTools/Editor/AssetStoreTools.dll.meta b/AssetStore/Assets/AssetStoreTools/Editor/AssetStoreTools.dll.meta index 919f28fc7..c3b7c6a02 100644 --- a/AssetStore/Assets/AssetStoreTools/Editor/AssetStoreTools.dll.meta +++ b/AssetStore/Assets/AssetStoreTools/Editor/AssetStoreTools.dll.meta @@ -1,14 +1,34 @@ fileFormatVersion: 2 -guid: 11188de2b6632fa4486c470af4b55fa0 +guid: 46975cd389724d0499db55591d961a35 +timeCreated: 1499691956 +licenseType: Store PluginImporter: - serializedVersion: 1 + serializedVersion: 2 iconMap: {} executionOrder: {} isPreloaded: 0 + isOverridable: 0 platformData: - Any: - enabled: 1 - settings: {} + data: + first: + Any: + second: + enabled: 0 + settings: {} + data: + first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + data: + first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU userData: assetBundleName: assetBundleVariant: diff --git a/AssetStore/Assets/AssetStoreTools/Editor/AssetStoreToolsExtra.dll b/AssetStore/Assets/AssetStoreTools/Editor/AssetStoreToolsExtra.dll index a28d4889ec568df0e106da91d9d6876e15ec5c30..2b1615ccac6facb738f2bb29df405093eb929728 100644 GIT binary patch delta 1497 zcma)6U1%It7(I7(XLfh88MBj3+SqK|G*vf=1fxaLfXHszCMj7<^H*x6y2(z{rMo+E zW}>d8*;KH!l8R+0{y~LWr07dPsSou*L8K3Yk)ki66v0+}Qb8&r#B;|jRPez&?7ion z?|kQe_ZxOr(kt6uJ=MPb*!%%B#&sCoO+o|ov*&-%zlf1e^QZeSi+&OJFN^y{i~qfN z#f)zSK8XOLkr>_TFDtLtn8Q%$g3SYTPv@==tq&$}ir%zMgfdYEbeH8Z!Fiv)$Enh_dZvj>T!~6Y ztvNPK7S0vMGjRrn$Rg8B6tfM^JAT>N*ofJ85w?aC;bf*ol8nRo^>$9Oxi1lpWD<|xPGYJx5Xj)*==kBb+Di8sjT_>@r{ z-v*jxR;A&lqRJ}pxU7-I$)^R2ivM}ItG=qta{EVGhHi-0g56(@-9h0omh6_XlenVP z`ED13-3{@za;|aL_h_qNjkCa)!Tg<~U>9Q8Or`^eSY|xHalC~s=*4AhLl&)~ALDgA zAck-N2gPG31fl|-7duhHsu;yHxG3_pxFjaonsqUYeYh!}U}J8Hr^ttt1)M;?VpIQ+ zlE>M=VF2&oT^wV{Z=wy|2(PgIe~leM$&&Kd)Sco-|CYL3pD4NB(}S3*xt>)S7_rM` zYu+o_Rd-<2s#;EI9@%0M)3rqllS@^vRIwx;D^!bR3!|1Nce@?C(qQtIcf>A^R}b5_ zEhnwR4NGKQ*Yc)3+p(r?yX+!Ym>)j+T)`>2BX(u6;Fab|<&syM@q$IV-(mL;%oSV< z7P(? J9~k;?>fbfU3Yh=^ delta 884 zcmYjOOK1~O6g_V;pUg`#&5UX5htwHUbQp7T$Nngfvr( zV~PL?Fhgz#;5;wW8PRf-cj_$VbJZnv9u2#s&0~5Sr~I5rtQ#g^2c^K($SyipzBi;KreMx zpqPQBg>H3R--;wo)$UalVu$(M{8Un1~s7y><1VbX|mc}f< zLcD4NJa`q7rS+UuUPuLpNt>eq2Dae<$xRb);4aco@f0tJdrK_GS2`_3sgR?EHNdv; zkpdMhQeU8sxw0msYZ&5q$3(Z%Q2fERQ25IZ5*f}n!zFB5>AC%BOR-DZIYaX zdO8`>l7tO3>2mT{V1PPvFoRk&m60aQVI`XJ5=peF->T~v01QU}XI8*vUJ=%+}Y4BA<`?l3W=c7?_P@lc(pY0u}qLZ;y7 zyu-eq&5M%Oy|s*WjEx@8dYw6Mu;BH1r^mc}0ZRx}n7uiFxKrE;zY)`V zMojUn_{kIfGMHgVs-b`-6+;EHl1YU?X3&qakPS(;VL2Kk$J)!8 zC~h#sI2{Jv<*`qgqpoqFVLbSLl@rwgP0jDH&Ip&#hZe=)HDjDJ1o$S#h6!G$AIygN z9*i9TS5c>j%vU&24`$pT=(o6r&Svh*^tWKVxlw;BxQe3wwu~EUKDW8Xe719>>$=Y= z0?*w69z(09<|F!iXU6M=^$s!D^Jx^;i(S<7X%yDW8{Fr$g8zG<&kfIo|AESh_5zwQ zbAw)Siojm&<4EV3-$(2lTB?)o;{iYu+@QCdBCy_r+?VMb0_T?Md{Q~lVMW(@s(%FB z)I9&541>quMc7N8wQPe+`af7~dj(|U> zxi9nQ3^=!c{W+^~##4XJftz|fevd!7Y;c_CK!Xl^`^7n)djT*8FZyvG1mK0XZ4ALYJGpFc#U`b}^ZMSbjp<^~OMfB@r&-#dOgb`YV>qyMaz#w;D->(>E#5btw8od z(RN(vhwW8c1k&}rh}2BxdZE2+MfsZ*pYp8Ensn_br-`S!R>yrI9(eQ83S}?QB2!L& zSlhFnb%Zn5vE-s3cCoryKbo<+V%Fh&%5y^Bb^7(32r4FaZW9Q=no^DTcn9;IFqxOh_DD&%Nj6KKC3Y zM<70N+&tRB!Ylw;LyZzRgtcFF?P?tmLLJZZ#xx`WEQwQ$`KD8fSD0}`p&CscfcBD> zcgyyo=3B`uguvoY{bc&;# Date: Sun, 30 Jul 2017 18:43:47 +0300 Subject: [PATCH 51/58] Update README.md --- README.md | 87 +++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 55 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index 8ef8b21f2..6b84dc97b 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,60 @@ ![](https://raw.github.com/wiki/TouchScript/TouchScript/images/dvfu.jpg) -## TouchScript — multitouch library for Unity - -**TouchScript** is a multitouch library for Unity. Inspired by iOS, **TouchScript** makes handling complex gesture interactions on any touch surface much easier. - -> Warning! [Please read before upgrading](https://github.com/TouchScript/TouchScript/wiki/Upgrading). -> Please ask all questions on [the Forum](http://touchprefab.com/index.php). - -## Features -- **Supports many touch input methods starting from smartphones to giant touch surfaces: Windows 7/8 touch, mobile (iOS, Android, Windows Store/Windows Phone), TUIO, mouse.** -- **Abstracts touch and gesture logic from input methods and platforms. Your touch-related code will be the same everywhere.** -- **Manages simultaneous gesture recognition within scene hierarchy.** -- **Is infinitely extensible. You can add custom input methods, gestures and hit test logic in a matter of minutes.** -- Comes with many commonly used gestures. -- Supports all available platforms. -- Doesn't require Unity Pro. -- Highly efficient and optimized. -- Has very easy and intuitive API. -- Uses events in C# and SendMessage in UnityScript. -- Has PlayMaker actions. -- Takes into account DPI differences between a large touch surface and an iPad. -- Comes with many examples, is heavily documented with step-by-step tutorials. -- Groups touch points into clusters on big touch surfaces. -- Easy to test multitouch gestures without actual multitouch device using built-in second touch simulator (activated with ALT+CLICK), [TUIOPad on iOS](https://itunes.apple.com/us/app/tuiopad/id412446962) or [TUIODroid on Android](https://play.google.com/store/apps/details?id=tuioDroid.impl&hl=en"). [Read more](Testing-multitouch-on-a-PC). -- **It's free and open-source. Licensed under MIT license.** - -Developed by Valentin Simonov at [Interactive Lab](http://interactivelab.ru). - -## Documentation -Please refer to [Wiki](https://github.com/TouchScript/TouchScript/wiki) for up-to-date documentation and tutorials. -If you have questions please read the [FAQ](https://github.com/TouchScript/TouchScript/wiki/FAQ) first. After that search [the Forum](http://touchprefab.com/index.php). -If you are sure that you found a bug post an [issue](https://github.com/TouchScript/TouchScript/issues). -API documentation is available [here](http://touchscript.github.io/docs/index.html). +## TouchScript — multi-touch library for Unity + +When working on a project for mobile devices or PCs with touch input you will soon require basic gestures like tap, pan, pinch and zoom — they are not hard to implement manually using Unity API or using a package from Asset Store. The hard part is to make these gestures work together, e.g. to have a button with a tap gesture placed on a zoomable window. This is where you will need **TouchScript** — it makes handling complex gesture interactions on any touch surface an effortless job. + +## Why TouchScript? +- TouchScript abstracts touch and gesture logic from input methods and platforms. Your touch-related code will be the same everywhere. +- TouchScript supports many touch input methods starting from smartphones to giant touch surfaces: mouse, Windows 7/8 touch, mobile (iOS, Android, Windows Store/Windows Phone), TUIO. +- TouchScript includes common gesture implementations: press, release, tap, long press, flick, pinch/scale/rotate. +- TouchScript allows you to write your own gestures and custom pointer input logic. +- TouchScript manages gestures in transform hierarchy and makes sure that the most relevant gesture will receive touch input. +- TouchScript comes with many examples and is extensively documented. +- TouchScript makes it easy to test multi-touch gestures without an actual multi-touch device using built-in second touch simulator (activated with Alt + click), [TUIOPad on iOS](https://itunes.apple.com/us/app/tuiopad/id412446962) or [TUIODroid on Android](https://play.google.com/store/apps/details?id=tuioDroid.impl&hl=en"). [Read more](Testing-multitouch-on-a-PC). +- It's free and open-source. Licensed under MIT license. + +Developed by Valentin Simonov. + +## Getting started +### Downloading the package +To use **TouchScript** in your project you either need to +* download the [latest release from Github](https://github.com/TouchScript/TouchScript/releases), +* or get it from [Asset Store](https://www.assetstore.unity3d.com/en/#!/content/7394), +* or clone the [repository](https://github.com/TouchScript/TouchScript) and use the source ([more info on how to do it](https://github.com/TouchScript/TouchScript/wiki/How-to-Contribute)). + +### Your first TouchScript project +To test how TouchScript works, create an empty scene and drag two prefabs from `TouchScript/Prefabs` folder to the scene: `TouchManager` and `Cursors`. Press Play and click or touch (if your PC supports touch input) the Game View — you will see colored circles, pointer cursors. + +> Note: to simulate a second pointer you can hold Alt and click anywhere within the Game View. + +You can make any GameObject react to touch input — just attach one of the scripts called Gestures to it. TouchScript ships with a few built-in Gestures which you can find in `Component/TouchScript/Gestures` menu. It is also possible to write your own gestures. + +To test how built-in Gestures work, create an empty cube in the scene and attach a `TransformGesture` to it either from `Component` menu or `Add Component` button. Make the cube large enough to be able to touch it with two fingers. Attach another component called `Transformer` to the cube — this component listens to events from `TransformGesture` and applies translation, rotation and scaling to the GameObject. + +Press Play. Note how you can drag the object with one touch and scale or rotate it with two touches. Don't forget that you can use Alt + click to simulate a second pointer ([read more more about testing multi-touch gestures](https://github.com/TouchScript/TouchScript/wiki/Testing-multitouch-on-a-PC)). + +### Examples +TouchScript comes with many examples in `TouchScript/Examples` folder. Open `Examples.unity` scene and read description for every example to find out what it is about. Some of the features demonstrated in the example scenes are also described [here](https://github.com/TouchScript/TouchScript/wiki/Examples). + +### What to read next +- [What is a Gesture and how to work with it.](https://github.com/TouchScript/TouchScript/wiki/Gestures) +- [What is an Input Source and why it is needed.](https://github.com/TouchScript/TouchScript/wiki/Input-Sources) +- [What is a Layer and why it is needed.](https://github.com/TouchScript/TouchScript/wiki/Layers) +- [Some info on how TouchScript works internally.](https://github.com/TouchScript/TouchScript/wiki/Main-Ideas-Behind-TouchScript) +- [How you can help.](https://github.com/TouchScript/TouchScript/wiki/How-to-Contribute) + +## Need help? +> If you have a problem using TouchScript or running examples please check the [FAQ](FAQ) before submitting issues. + + - [FAQ](FAQ) +_Some of the questions have been already asked multiple times. Check if yours is in the list._ + - [Documentation](http://touchscript.github.io/docs/) +_Complete up-to-date generated docs with all public API annotated._ + - [Official Forum](http://touchprefab.com/index.php) +_Want to ask a question about TouchScript? Use the official Forum._ + - [Issues](https://github.com/TouchScript/TouchScript/issues) +_Found a bug? Got a feature request? Feel free to post it in Issues._ ## Consulting and contract work If you require custom functionality for your project or consulting services please contact me at **v@lent.in**. From 6ae7a00461f1172294e5cec22507256f29874d78 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 1 Aug 2017 14:57:30 +0300 Subject: [PATCH 52/58] Added some UNITY_5_6_OR_NEWER defines to work in 5.5. --- .../Behaviors/Cursors/CursorManager.cs | 27 +++++++++++++- .../Scripts/Core/GestureManagerInstance.cs | 20 +++++++++++ .../Scripts/Core/TouchManagerInstance.cs | 35 +++++++++++++++++-- .../Devices/Display/GenericDisplayDevice.cs | 4 +++ .../Scripts/Gestures/FlickGesture.cs | 18 ++++++++++ .../Scripts/Gestures/LongPressGesture.cs | 16 +++++++++ .../Scripts/Gestures/MetaGesture.cs | 20 +++++++++++ .../Scripts/Gestures/PressGesture.cs | 12 +++++++ .../Scripts/Gestures/ReleaseGesture.cs | 16 +++++++++ .../Scripts/Gestures/TapGesture.cs | 22 ++++++++++++ .../PinnedTransformGesture.cs | 15 +++++++- .../ScreenTransformGesture.cs | 14 ++++++++ .../TransformGestures/TransformGesture.cs | 14 ++++++++ .../InputHandlers/TouchHandler.cs | 8 +++++ .../Layers/UI/TouchScriptInputModule.cs | 24 +++++++++++++ 15 files changed, 260 insertions(+), 5 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs index bd6c4581c..d901bf4e8 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/CursorManager.cs @@ -133,7 +133,9 @@ public uint CursorPixelSize private ObjectPool objectPool; private Dictionary cursors = new Dictionary(10); +#if UNITY_5_6_OR_NEWER private CustomSampler cursorSampler; +#endif #endregion @@ -141,9 +143,10 @@ public uint CursorPixelSize private void Awake() { +#if UNITY_5_6_OR_NEWER cursorSampler = CustomSampler.Create("[TouchScript] Update Cursors"); - cursorSampler.Begin(); +#endif mousePool = new ObjectPool(2, instantiateMouseProxy, null, clearProxy); touchPool = new ObjectPool(10, instantiateTouchProxy, null, clearProxy); @@ -159,7 +162,9 @@ private void Awake() enabled = false; } +#if UNITY_5_6_OR_NEWER cursorSampler.End(); +#endif } private void OnEnable() @@ -228,7 +233,9 @@ private void updateCursorSize() private void pointersAddedHandler(object sender, PointerEventArgs e) { +#if UNITY_5_6_OR_NEWER cursorSampler.Begin(); +#endif updateCursorSize(); @@ -263,12 +270,16 @@ private void pointersAddedHandler(object sender, PointerEventArgs e) cursors.Add(pointer.Id, cursor); } +#if UNITY_5_6_OR_NEWER cursorSampler.End(); +#endif } private void pointersRemovedHandler(object sender, PointerEventArgs e) { +#if UNITY_5_6_OR_NEWER cursorSampler.Begin(); +#endif var count = e.Pointers.Count; for (var i = 0; i < count; i++) @@ -295,12 +306,16 @@ private void pointersRemovedHandler(object sender, PointerEventArgs e) } } +#if UNITY_5_6_OR_NEWER cursorSampler.End(); +#endif } private void pointersPressedHandler(object sender, PointerEventArgs e) { +#if UNITY_5_6_OR_NEWER cursorSampler.Begin(); +#endif var count = e.Pointers.Count; for (var i = 0; i < count; i++) @@ -311,12 +326,16 @@ private void pointersPressedHandler(object sender, PointerEventArgs e) cursor.SetState(pointer, PointerCursor.CursorState.Pressed); } +#if UNITY_5_6_OR_NEWER cursorSampler.End(); +#endif } private void PointersUpdatedHandler(object sender, PointerEventArgs e) { +#if UNITY_5_6_OR_NEWER cursorSampler.Begin(); +#endif var count = e.Pointers.Count; for (var i = 0; i < count; i++) @@ -327,12 +346,16 @@ private void PointersUpdatedHandler(object sender, PointerEventArgs e) cursor.UpdatePointer(pointer); } +#if UNITY_5_6_OR_NEWER cursorSampler.End(); +#endif } private void pointersReleasedHandler(object sender, PointerEventArgs e) { +#if UNITY_5_6_OR_NEWER cursorSampler.Begin(); +#endif var count = e.Pointers.Count; for (var i = 0; i < count; i++) @@ -343,7 +366,9 @@ private void pointersReleasedHandler(object sender, PointerEventArgs e) cursor.SetState(pointer, PointerCursor.CursorState.Released); } +#if UNITY_5_6_OR_NEWER cursorSampler.End(); +#endif } private void pointersCancelledHandler(object sender, PointerEventArgs e) diff --git a/Source/Assets/TouchScript/Scripts/Core/GestureManagerInstance.cs b/Source/Assets/TouchScript/Scripts/Core/GestureManagerInstance.cs index 2af106d64..5bbaad504 100644 --- a/Source/Assets/TouchScript/Scripts/Core/GestureManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/Core/GestureManagerInstance.cs @@ -59,7 +59,9 @@ public static IGestureManager Instance private List gesturesToReset = new List(20); private Dictionary> pointerToGestures = new Dictionary>(10); +#if UNITY_5_6_OR_NEWER private CustomSampler gestureSampler; +#endif #endregion @@ -111,7 +113,9 @@ private void Awake() pointerListPool.WarmUp(20); transformListPool.WarmUp(1); +#if UNITY_5_6_OR_NEWER gestureSampler = CustomSampler.Create("[TouchScript] Update Gestures"); +#endif } private void OnEnable() @@ -224,7 +228,9 @@ internal Gesture.GestureState INTERNAL_GestureChangeState(Gesture gesture, Gestu private void updatePressed(IList pointers) { +#if UNITY_5_6_OR_NEWER gestureSampler.Begin(); +#endif var activeTargets = transformListPool.Get(); var gesturesInHierarchy = gestureListPool.Get(); @@ -376,12 +382,16 @@ private void updatePressed(IList pointers) activeGesturesThisUpdate.Clear(); pointersToDispatchForGesture.Clear(); +#if UNITY_5_6_OR_NEWER gestureSampler.End(); +#endif } private void updateUpdated(IList pointers) { +#if UNITY_5_6_OR_NEWER gestureSampler.Begin(); +#endif sortPointersForActiveGestures(pointers); @@ -400,12 +410,16 @@ private void updateUpdated(IList pointers) activeGesturesThisUpdate.Clear(); pointersToDispatchForGesture.Clear(); +#if UNITY_5_6_OR_NEWER gestureSampler.End(); +#endif } private void updateReleased(IList pointers) { +#if UNITY_5_6_OR_NEWER gestureSampler.Begin(); +#endif sortPointersForActiveGestures(pointers); @@ -425,12 +439,16 @@ private void updateReleased(IList pointers) activeGesturesThisUpdate.Clear(); pointersToDispatchForGesture.Clear(); +#if UNITY_5_6_OR_NEWER gestureSampler.End(); +#endif } private void updateCancelled(IList pointers) { +#if UNITY_5_6_OR_NEWER gestureSampler.Begin(); +#endif sortPointersForActiveGestures(pointers); @@ -450,7 +468,9 @@ private void updateCancelled(IList pointers) activeGesturesThisUpdate.Clear(); pointersToDispatchForGesture.Clear(); +#if UNITY_5_6_OR_NEWER gestureSampler.End(); +#endif } private void sortPointersForActiveGestures(IList pointers) diff --git a/Source/Assets/TouchScript/Scripts/Core/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/Core/TouchManagerInstance.cs index 84e766ff0..fee118951 100644 --- a/Source/Assets/TouchScript/Scripts/Core/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/Core/TouchManagerInstance.cs @@ -264,7 +264,9 @@ public IList PressedPointers private IPointerLogger pLogger; #endif +#if UNITY_5_6_OR_NEWER private CustomSampler samplerUpdateInputs, samplerUpdateAdded, samplerUpdatePressed, samplerUpdateUpdated, samplerUpdateReleased, samplerUpdateRemoved, samplerUpdateCancelled; +#endif #endregion @@ -535,6 +537,7 @@ private void Awake() _layerRemovePointer = layerRemovePointer; _layerCancelPointer = layerCancelPointer; +#if UNITY_5_6_OR_NEWER samplerUpdateInputs = CustomSampler.Create("[TouchScript] Update Inputs"); samplerUpdateAdded = CustomSampler.Create("[TouchScript] Added Pointers"); samplerUpdatePressed = CustomSampler.Create("[TouchScript] Press Pointers"); @@ -542,6 +545,7 @@ private void Awake() samplerUpdateReleased = CustomSampler.Create("[TouchScript] Release Pointers"); samplerUpdateRemoved = CustomSampler.Create("[TouchScript] Remove Pointers"); samplerUpdateCancelled = CustomSampler.Create("[TouchScript] Cancel Pointers"); +#endif } #if UNITY_5_4_OR_NEWER @@ -625,14 +629,20 @@ private void createInput() private void updateInputs() { +#if UNITY_5_6_OR_NEWER samplerUpdateInputs.Begin(); +#endif for (var i = 0; i < inputCount; i++) inputs[i].UpdateInput(); +#if UNITY_5_6_OR_NEWER samplerUpdateInputs.End(); +#endif } private void updateAdded(List pointers) { +#if UNITY_5_6_OR_NEWER samplerUpdateAdded.Begin(); +#endif var addedCount = pointers.Count; var list = pointerListPool.Get(); @@ -660,7 +670,9 @@ private void updateAdded(List pointers) pointersAddedInvoker.InvokeHandleExceptions(this, PointerEventArgs.GetCachedEventArgs(list)); pointerListPool.Release(list); +#if UNITY_5_6_OR_NEWER samplerUpdateAdded.End(); +#endif } private bool layerAddPointer(TouchLayer layer) @@ -671,7 +683,9 @@ private bool layerAddPointer(TouchLayer layer) private void updateUpdated(List pointers) { +#if UNITY_5_6_OR_NEWER samplerUpdateUpdated.Begin(); +#endif var updatedCount = pointers.Count; var list = pointerListPool.Get(); @@ -712,7 +726,9 @@ private void updateUpdated(List pointers) pointersUpdatedInvoker.InvokeHandleExceptions(this, PointerEventArgs.GetCachedEventArgs(list)); pointerListPool.Release(list); +#if UNITY_5_6_OR_NEWER samplerUpdateUpdated.End(); +#endif } private bool layerUpdatePointer(TouchLayer layer) @@ -723,7 +739,9 @@ private bool layerUpdatePointer(TouchLayer layer) private void updatePressed(List pointers) { +#if UNITY_5_6_OR_NEWER samplerUpdatePressed.Begin(); +#endif var pressedCount = pointers.Count; var list = pointerListPool.Get(); @@ -752,9 +770,6 @@ private void updatePressed(List pointers) #if TOUCHSCRIPT_DEBUG pLogger.Log(pointer, PointerEvent.Pressed); -#endif - -#if TOUCHSCRIPT_DEBUG if (DebugMode) addDebugFigureForPointer(pointer); #endif } @@ -763,12 +778,16 @@ private void updatePressed(List pointers) pointersPressedInvoker.InvokeHandleExceptions(this, PointerEventArgs.GetCachedEventArgs(list)); pointerListPool.Release(list); +#if UNITY_5_6_OR_NEWER samplerUpdatePressed.End(); +#endif } private void updateReleased(List pointers) { +#if UNITY_5_6_OR_NEWER samplerUpdateReleased.Begin(); +#endif var releasedCount = pointers.Count; var list = pointerListPool.Get(); @@ -809,12 +828,16 @@ private void updateReleased(List pointers) } pointerListPool.Release(list); +#if UNITY_5_6_OR_NEWER samplerUpdateReleased.End(); +#endif } private void updateRemoved(List pointers) { +#if UNITY_5_6_OR_NEWER samplerUpdateRemoved.Begin(); +#endif var removedCount = pointers.Count; var list = pointerListPool.Get(); @@ -858,7 +881,9 @@ private void updateRemoved(List pointers) } pointerListPool.Release(list); +#if UNITY_5_6_OR_NEWER samplerUpdateRemoved.End(); +#endif } private bool layerRemovePointer(TouchLayer layer) @@ -869,7 +894,9 @@ private bool layerRemovePointer(TouchLayer layer) private void updateCancelled(List pointers) { +#if UNITY_5_6_OR_NEWER samplerUpdateCancelled.Begin(); +#endif var cancelledCount = pointers.Count; var list = pointerListPool.Get(); @@ -914,7 +941,9 @@ private void updateCancelled(List pointers) } pointerListPool.Release(list); +#if UNITY_5_6_OR_NEWER samplerUpdateCancelled.End(); +#endif } private bool layerCancelPointer(TouchLayer layer) diff --git a/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs b/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs index 91904703d..892dd2397 100644 --- a/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs +++ b/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs @@ -103,7 +103,9 @@ private void updateNativeResulotion() break; // Probably TVs case RuntimePlatform.SamsungTVPlayer: +#if UNITY_5_6_OR_NEWER case RuntimePlatform.Switch: +#endif case RuntimePlatform.WiiU: case RuntimePlatform.XboxOne: case RuntimePlatform.tvOS: @@ -198,7 +200,9 @@ private void updateNativeDPI() break; // Probably TVs case RuntimePlatform.SamsungTVPlayer: +#if UNITY_5_6_OR_NEWER case RuntimePlatform.Switch: +#endif case RuntimePlatform.WiiU: case RuntimePlatform.XboxOne: case RuntimePlatform.tvOS: diff --git a/Source/Assets/TouchScript/Scripts/Gestures/FlickGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/FlickGesture.cs index a288d6b42..4b69b4887 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/FlickGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/FlickGesture.cs @@ -138,7 +138,9 @@ public GestureDirection Direction private bool isActive = false; private TimedSequence deltaSequence = new TimedSequence(); +#if UNITY_5_6_OR_NEWER private CustomSampler gestureSampler; +#endif #endregion @@ -149,7 +151,9 @@ protected override void Awake() { base.Awake(); +#if UNITY_5_6_OR_NEWER gestureSampler = CustomSampler.Create("[TouchScript] Flick Gesture"); +#endif } /// @@ -173,7 +177,9 @@ private void switchToBasicEditor() /// protected override void pointersPressed(IList pointers) { +#if UNITY_5_6_OR_NEWER gestureSampler.Begin(); +#endif base.pointersPressed(pointers); @@ -189,13 +195,17 @@ protected override void pointersPressed(IList pointers) else isActive = true; } +#if UNITY_5_6_OR_NEWER gestureSampler.End(); +#endif } /// protected override void pointersUpdated(IList pointers) { +#if UNITY_5_6_OR_NEWER gestureSampler.Begin(); +#endif base.pointersUpdated(pointers); @@ -209,13 +219,17 @@ protected override void pointersUpdated(IList pointers) } } +#if UNITY_5_6_OR_NEWER gestureSampler.End(); +#endif } /// protected override void pointersReleased(IList pointers) { +#if UNITY_5_6_OR_NEWER gestureSampler.Begin(); +#endif base.pointersReleased(pointers); @@ -224,7 +238,9 @@ protected override void pointersReleased(IList pointers) if (!isActive || !moving) { setState(GestureState.Failed); +#if UNITY_5_6_OR_NEWER gestureSampler.End(); +#endif return; } @@ -258,7 +274,9 @@ protected override void pointersReleased(IList pointers) } } +#if UNITY_5_6_OR_NEWER gestureSampler.End(); +#endif } /// diff --git a/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs index d8608d756..ff6bbb047 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs @@ -91,7 +91,9 @@ public float DistanceLimit private Vector2 totalMovement; +#if UNITY_5_6_OR_NEWER private CustomSampler gestureSampler; +#endif #endregion @@ -102,7 +104,9 @@ protected override void Awake() { base.Awake(); +#if UNITY_5_6_OR_NEWER gestureSampler = CustomSampler.Create("[TouchScript] Long Press Gesture"); +#endif } /// @@ -126,7 +130,9 @@ private void switchToBasicEditor() /// protected override void pointersPressed(IList pointers) { +#if UNITY_5_6_OR_NEWER gestureSampler.Begin(); +#endif base.pointersPressed(pointers); @@ -141,13 +147,17 @@ protected override void pointersPressed(IList pointers) StartCoroutine("wait"); } +#if UNITY_5_6_OR_NEWER gestureSampler.End(); +#endif } /// protected override void pointersUpdated(IList pointers) { +#if UNITY_5_6_OR_NEWER gestureSampler.Begin(); +#endif base.pointersUpdated(pointers); @@ -157,13 +167,17 @@ protected override void pointersUpdated(IList pointers) if (totalMovement.sqrMagnitude > distanceLimitInPixelsSquared) setState(GestureState.Failed); } +#if UNITY_5_6_OR_NEWER gestureSampler.End(); +#endif } /// protected override void pointersReleased(IList pointers) { +#if UNITY_5_6_OR_NEWER gestureSampler.Begin(); +#endif base.pointersReleased(pointers); @@ -172,7 +186,9 @@ protected override void pointersReleased(IList pointers) setState(GestureState.Failed); } +#if UNITY_5_6_OR_NEWER gestureSampler.End(); +#endif } /// diff --git a/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs index d004291fb..62192912e 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs @@ -90,7 +90,9 @@ public event EventHandler PointerCancelled #region Private variables +#if UNITY_5_6_OR_NEWER private CustomSampler gestureSampler; +#endif #endregion @@ -101,7 +103,9 @@ protected override void Awake() { base.Awake(); +#if UNITY_5_6_OR_NEWER gestureSampler = CustomSampler.Create("[TouchScript] Meta Gesture"); +#endif } [ContextMenu("Basic Editor")] @@ -117,7 +121,9 @@ private void switchToBasicEditor() /// protected override void pointersPressed(IList pointers) { +#if UNITY_5_6_OR_NEWER gestureSampler.Begin(); +#endif base.pointersPressed(pointers); @@ -134,13 +140,17 @@ protected override void pointersPressed(IList pointers) for (var i = 0; i < length; i++) SendMessageTarget.SendMessage(POINTER_PRESSED_MESSAGE, pointers[i], SendMessageOptions.DontRequireReceiver); } +#if UNITY_5_6_OR_NEWER gestureSampler.End(); +#endif } /// protected override void pointersUpdated(IList pointers) { +#if UNITY_5_6_OR_NEWER gestureSampler.Begin(); +#endif base.pointersUpdated(pointers); @@ -157,13 +167,17 @@ protected override void pointersUpdated(IList pointers) for (var i = 0; i < length; i++) SendMessageTarget.SendMessage(POINTER_MOVED_MESSAGE, pointers[i], SendMessageOptions.DontRequireReceiver); } +#if UNITY_5_6_OR_NEWER gestureSampler.End(); +#endif } /// protected override void pointersReleased(IList pointers) { +#if UNITY_5_6_OR_NEWER gestureSampler.Begin(); +#endif base.pointersReleased(pointers); @@ -180,13 +194,17 @@ protected override void pointersReleased(IList pointers) for (var i = 0; i < length; i++) SendMessageTarget.SendMessage(POINTER_RELEASED_MESSAGE, pointers[i], SendMessageOptions.DontRequireReceiver); } +#if UNITY_5_6_OR_NEWER gestureSampler.End(); +#endif } /// protected override void pointersCancelled(IList pointers) { +#if UNITY_5_6_OR_NEWER gestureSampler.Begin(); +#endif base.pointersCancelled(pointers); @@ -201,7 +219,9 @@ protected override void pointersCancelled(IList pointers) for (var i = 0; i < length; i++) SendMessageTarget.SendMessage(POINTER_CANCELLED_MESSAGE, pointers[i], SendMessageOptions.DontRequireReceiver); } +#if UNITY_5_6_OR_NEWER gestureSampler.End(); +#endif } #endregion diff --git a/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs index a5d5b0e72..26f147b55 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs @@ -75,7 +75,9 @@ public bool IgnoreChildren [ToggleLeft] private bool ignoreChildren = false; +#if UNITY_5_6_OR_NEWER private CustomSampler gestureSampler; +#endif #endregion @@ -86,7 +88,9 @@ protected override void Awake() { base.Awake(); +#if UNITY_5_6_OR_NEWER gestureSampler = CustomSampler.Create("[TouchScript] Press Gesture"); +#endif } [ContextMenu("Basic Editor")] @@ -126,24 +130,32 @@ public override bool CanBePreventedByGesture(Gesture gesture) /// protected override void pointersPressed(IList pointers) { +#if UNITY_5_6_OR_NEWER gestureSampler.Begin(); +#endif base.pointersPressed(pointers); if (pointersNumState == PointersNumState.PassedMinThreshold) { setState(GestureState.Recognized); +#if UNITY_5_6_OR_NEWER gestureSampler.End(); +#endif return; } if (pointersNumState == PointersNumState.PassedMinMaxThreshold) { setState(GestureState.Failed); +#if UNITY_5_6_OR_NEWER gestureSampler.End(); +#endif return; } +#if UNITY_5_6_OR_NEWER gestureSampler.End(); +#endif } /// diff --git a/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs index 5df1c813a..1cd64faf0 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs @@ -70,7 +70,9 @@ public bool IgnoreChildren [ToggleLeft] private bool ignoreChildren = false; +#if UNITY_5_6_OR_NEWER private CustomSampler gestureSampler; +#endif #endregion @@ -81,7 +83,9 @@ protected override void Awake() { base.Awake(); +#if UNITY_5_6_OR_NEWER gestureSampler = CustomSampler.Create("[TouchScript] Release Gesture"); +#endif } [ContextMenu("Basic Editor")] @@ -121,36 +125,48 @@ public override bool CanBePreventedByGesture(Gesture gesture) /// protected override void pointersPressed(IList pointers) { +#if UNITY_5_6_OR_NEWER gestureSampler.Begin(); +#endif base.pointersPressed(pointers); if (pointersNumState == PointersNumState.PassedMinThreshold) { if (State == GestureState.Idle) setState(GestureState.Possible); +#if UNITY_5_6_OR_NEWER gestureSampler.End(); +#endif return; } if (pointersNumState == PointersNumState.PassedMinMaxThreshold) { setState(GestureState.Failed); +#if UNITY_5_6_OR_NEWER gestureSampler.End(); +#endif return; } +#if UNITY_5_6_OR_NEWER gestureSampler.End(); +#endif } /// protected override void pointersReleased(IList pointers) { +#if UNITY_5_6_OR_NEWER gestureSampler.Begin(); +#endif base.pointersReleased(pointers); if (pointersNumState == PointersNumState.PassedMinThreshold) setState(GestureState.Recognized); +#if UNITY_5_6_OR_NEWER gestureSampler.End(); +#endif } /// diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs index b7474f004..934b79687 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs @@ -145,7 +145,9 @@ public float CombinePointersInterval private Vector2 totalMovement; private TimedSequence pointerSequence = new TimedSequence(); +#if UNITY_5_6_OR_NEWER private CustomSampler gestureSampler; +#endif #endregion @@ -169,7 +171,9 @@ protected override void Awake() { base.Awake(); +#if UNITY_5_6_OR_NEWER gestureSampler = CustomSampler.Create("[TouchScript] Tap Gesture"); +#endif } /// @@ -193,7 +197,9 @@ private void switchToBasicEditor() /// protected override void pointersPressed(IList pointers) { +#if UNITY_5_6_OR_NEWER gestureSampler.Begin(); +#endif base.pointersPressed(pointers); @@ -201,7 +207,9 @@ protected override void pointersPressed(IList pointers) pointersNumState == PointersNumState.PassedMinMaxThreshold) { setState(GestureState.Failed); +#if UNITY_5_6_OR_NEWER gestureSampler.End(); +#endif return; } @@ -226,7 +234,9 @@ protected override void pointersPressed(IList pointers) if ((pointers[0].Position - startPosition).sqrMagnitude > distanceLimitInPixelsSquared) { setState(GestureState.Failed); +#if UNITY_5_6_OR_NEWER gestureSampler.End(); +#endif return; } } @@ -243,13 +253,17 @@ protected override void pointersPressed(IList pointers) } } +#if UNITY_5_6_OR_NEWER gestureSampler.End(); +#endif } /// protected override void pointersUpdated(IList pointers) { +#if UNITY_5_6_OR_NEWER gestureSampler.Begin(); +#endif base.pointersUpdated(pointers); @@ -259,13 +273,17 @@ protected override void pointersUpdated(IList pointers) if (totalMovement.sqrMagnitude > distanceLimitInPixelsSquared) setState(GestureState.Failed); } +#if UNITY_5_6_OR_NEWER gestureSampler.End(); +#endif } /// protected override void pointersReleased(IList pointers) { +#if UNITY_5_6_OR_NEWER gestureSampler.Begin(); +#endif base.pointersReleased(pointers); @@ -289,7 +307,9 @@ protected override void pointersReleased(IList pointers) if (!isActive) { setState(GestureState.Failed); +#if UNITY_5_6_OR_NEWER gestureSampler.End(); +#endif return; } @@ -308,7 +328,9 @@ protected override void pointersReleased(IList pointers) } } +#if UNITY_5_6_OR_NEWER gestureSampler.End(); +#endif } /// diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs index 567de42f0..b7a992b78 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs @@ -89,7 +89,9 @@ public Plane TransformPlane private TouchLayer projectionLayer; private Plane transformPlane; +#if UNITY_5_6_OR_NEWER private CustomSampler gestureSampler; +#endif #endregion @@ -105,7 +107,9 @@ protected override void Awake() base.Awake(); transformPlane = new Plane(); +#if UNITY_5_6_OR_NEWER gestureSampler = CustomSampler.Create("[TouchScript] Pinned Transform Gesture"); +#endif } /// @@ -129,7 +133,9 @@ private void switchToBasicEditor() /// protected override void pointersPressed(IList pointers) { +#if UNITY_5_6_OR_NEWER gestureSampler.Begin(); +#endif base.pointersPressed(pointers); @@ -143,9 +149,12 @@ protected override void pointersPressed(IList pointers) #endif } +#if UNITY_5_6_OR_NEWER gestureSampler.End(); +#endif } +#if UNITY_5_6_OR_NEWER /// protected override void pointersUpdated(IList pointers) { @@ -155,11 +164,14 @@ protected override void pointersUpdated(IList pointers) gestureSampler.End(); } +#endif /// protected override void pointersReleased(IList pointers) { +#if UNITY_5_6_OR_NEWER gestureSampler.Begin(); +#endif base.pointersReleased(pointers); @@ -167,8 +179,9 @@ protected override void pointersReleased(IList pointers) if (NumPointers == 0) clearDebug(); else drawDebug(activePointers[0].ProjectionParams.ProjectFrom(cachedTransform.position), activePointers[0].Position); #endif - +#if UNITY_5_6_OR_NEWER gestureSampler.End(); +#endif } #endregion diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/ScreenTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/ScreenTransformGesture.cs index 391c12d05..16fb17847 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/ScreenTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/ScreenTransformGesture.cs @@ -22,7 +22,9 @@ public class ScreenTransformGesture : TwoPointTransformGestureBase #region Private variables +#if UNITY_5_6_OR_NEWER private CustomSampler gestureSampler; +#endif #endregion @@ -33,7 +35,9 @@ protected override void Awake() { base.Awake(); +#if UNITY_5_6_OR_NEWER gestureSampler = CustomSampler.Create("[TouchScript] Screen Transform Gesture"); +#endif } [ContextMenu("Basic Editor")] @@ -46,6 +50,7 @@ private void switchToBasicEditor() #region Gesture callbacks +#if UNITY_5_6_OR_NEWER /// protected override void pointersPressed(IList pointers) { @@ -65,16 +70,25 @@ protected override void pointersUpdated(IList pointers) gestureSampler.End(); } +#endif /// protected override void pointersReleased(IList pointers) { +#if UNITY_5_6_OR_NEWER + gestureSampler.Begin(); +#endif + base.pointersReleased(pointers); #if TOUCHSCRIPT_DEBUG if (getNumPoints() == 0) clearDebug(); else drawDebugDelayed(getNumPoints()); #endif + +#if UNITY_5_6_OR_NEWER + gestureSampler.End(); +#endif } #endregion diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs index 708459bd8..827792c94 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs @@ -147,7 +147,9 @@ public Vector3 LocalDeltaPosition private TouchLayer projectionLayer; private Plane transformPlane; +#if UNITY_5_6_OR_NEWER private CustomSampler gestureSampler; +#endif #endregion @@ -163,7 +165,9 @@ protected override void Awake() base.Awake(); transformPlane = new Plane(); +#if UNITY_5_6_OR_NEWER gestureSampler = CustomSampler.Create("[TouchScript] Transform Gesture"); +#endif } /// @@ -187,7 +191,9 @@ private void switchToBasicEditor() /// protected override void pointersPressed(IList pointers) { +#if UNITY_5_6_OR_NEWER gestureSampler.Begin(); +#endif base.pointersPressed(pointers); @@ -197,9 +203,12 @@ protected override void pointersPressed(IList pointers) updateProjectionPlane(); } +#if UNITY_5_6_OR_NEWER gestureSampler.End(); +#endif } +#if UNITY_5_6_OR_NEWER /// protected override void pointersUpdated(IList pointers) { @@ -209,11 +218,14 @@ protected override void pointersUpdated(IList pointers) gestureSampler.End(); } +#endif /// protected override void pointersReleased(IList pointers) { +#if UNITY_5_6_OR_NEWER gestureSampler.Begin(); +#endif base.pointersReleased(pointers); @@ -222,7 +234,9 @@ protected override void pointersReleased(IList pointers) else drawDebugDelayed(getNumPoints()); #endif +#if UNITY_5_6_OR_NEWER gestureSampler.End(); +#endif } diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs index a9d5b3bff..d492b6637 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs @@ -47,7 +47,9 @@ public bool HasPointers private Dictionary systemToInternalId = new Dictionary(10); private int pointersNum; +#if UNITY_5_6_OR_NEWER private CustomSampler updateSampler; +#endif #endregion @@ -72,7 +74,9 @@ public TouchHandler(PointerDelegate addPointer, PointerDelegate updatePointer, P touchPool = new ObjectPool(10, () => new TouchPointer(this), null, resetPointer); touchPool.Name = "Touch"; +#if UNITY_5_6_OR_NEWER updateSampler = CustomSampler.Create("[TouchScript] Update touch"); +#endif } #region Public methods @@ -80,7 +84,9 @@ public TouchHandler(PointerDelegate addPointer, PointerDelegate updatePointer, P /// public bool UpdateInput() { +#if UNITY_5_6_OR_NEWER updateSampler.Begin(); +#endif for (var i = 0; i < Input.touchCount; ++i) { @@ -155,7 +161,9 @@ public bool UpdateInput() } } +#if UNITY_5_6_OR_NEWER updateSampler.End(); +#endif return Input.touchCount > 0; } diff --git a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs index 0c43bf398..ce813b6ca 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs @@ -230,13 +230,17 @@ private class UIStandardInputModule { protected TouchScriptInputModule input; +#if UNITY_5_6_OR_NEWER private CustomSampler uiSampler; +#endif public UIStandardInputModule(TouchScriptInputModule input) { this.input = input; +#if UNITY_5_6_OR_NEWER uiSampler = CustomSampler.Create("[TouchScript] Update UI"); +#endif } #region Unchanged from PointerInputModule @@ -431,7 +435,9 @@ private void convertRaycast(RaycastHitUI old, ref RaycastResult current) public virtual void ProcessUpdated(object sender, PointerEventArgs pointerEventArgs) { +#if UNITY_5_6_OR_NEWER uiSampler.Begin(); +#endif var pointers = pointerEventArgs.Pointers; var raycast = new RaycastResult(); @@ -499,12 +505,16 @@ public virtual void ProcessUpdated(object sender, PointerEventArgs pointerEventA } } +#if UNITY_5_6_OR_NEWER uiSampler.End(); +#endif } public virtual void ProcessPressed(object sender, PointerEventArgs pointerEventArgs) { +#if UNITY_5_6_OR_NEWER uiSampler.Begin(); +#endif var pointers = pointerEventArgs.Pointers; var count = pointers.Count; @@ -577,12 +587,16 @@ public virtual void ProcessPressed(object sender, PointerEventArgs pointerEventA ExecuteEvents.Execute(data.pointerDrag, data, ExecuteEvents.initializePotentialDrag); } +#if UNITY_5_6_OR_NEWER uiSampler.End(); +#endif } public virtual void ProcessReleased(object sender, PointerEventArgs pointerEventArgs) { +#if UNITY_5_6_OR_NEWER uiSampler.Begin(); +#endif var pointers = pointerEventArgs.Pointers; var count = pointers.Count; @@ -636,12 +650,16 @@ public virtual void ProcessReleased(object sender, PointerEventArgs pointerEvent } } +#if UNITY_5_6_OR_NEWER uiSampler.End(); +#endif } public virtual void ProcessCancelled(object sender, PointerEventArgs pointerEventArgs) { +#if UNITY_5_6_OR_NEWER uiSampler.Begin(); +#endif var pointers = pointerEventArgs.Pointers; var count = pointers.Count; @@ -678,12 +696,16 @@ public virtual void ProcessCancelled(object sender, PointerEventArgs pointerEven data.pointerEnter = null; } +#if UNITY_5_6_OR_NEWER uiSampler.End(); +#endif } public virtual void ProcessRemoved(object sender, PointerEventArgs pointerEventArgs) { +#if UNITY_5_6_OR_NEWER uiSampler.Begin(); +#endif var pointers = pointerEventArgs.Pointers; var count = pointers.Count; @@ -702,7 +724,9 @@ public virtual void ProcessRemoved(object sender, PointerEventArgs pointerEventA RemovePointerData(pointer.Id); } +#if UNITY_5_6_OR_NEWER uiSampler.End(); +#endif } #endregion From 61ac45bb3e2b8b24cdfc90344b2a1f4a168c72ca Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 1 Aug 2017 15:08:25 +0300 Subject: [PATCH 53/58] Updated screenshots for Asset Store. --- AssetStore/Assets/screens/2.jpg | Bin 98189 -> 265923 bytes AssetStore/Assets/screens/3.jpg | Bin 41518 -> 309458 bytes AssetStore/Assets/screens/7.jpg | Bin 0 -> 368306 bytes AssetStore/Assets/screens/7.jpg.meta | 68 +++++++++++++++++++++++++++ 4 files changed, 68 insertions(+) create mode 100644 AssetStore/Assets/screens/7.jpg create mode 100644 AssetStore/Assets/screens/7.jpg.meta diff --git a/AssetStore/Assets/screens/2.jpg b/AssetStore/Assets/screens/2.jpg index 2779363921a2159b5a7c01538e55bca47752a5d1..59c8aed18f01d61125e1ca1428af952077831517 100644 GIT binary patch literal 265923 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%0AJ|olH(KEU* z_Zxn7RQxrn+n+utRhK(*wqNxdXYw^9Q%uQmsUGojQJURDajy;dP;zRlQd`p7d)^vK z?6I0?ZzY5*0;F~IFQ?3J#E7+<8Fps;N4M!w~Fj8k3hC zd}HSlprmDw9$Z|3*X`~zLtbBT)VDU?!bI6mw6fxm?@92NzkRmbiIHj+d&eFmQgOb= zKG{1}Jet+;wrISl;!m_6)Y9WU3x7OpX}wo2?&h{NWsS`7jB!ZnG%uyZUmm= zZ_gVVLfqU&;F0D)rvw}_k?ap)>_G;cbXQotOJm<5=GePTtKOl)hUzY{={5xpA;i53 zz$!#C{B<6*0ykJah*rT%6LaP>>p!h*78?GOZU~rM+p_Ky9(al9avO1x+u!H5)-w54 zWyp9;*wQJdtzHd_6w%qXU7JZRHi@;-mmo6yDNQUUKtW5W^Ga2|@`P>|671u*{MCKl zy>}y;cr+bw(npGRzvLA#?4#p8kXdAXsyja&FEkU?r8387mLfkWR=FA^-Rf8osDZ1_Ev{VUI9!kC+8^X zJUajr5>bgb+#lvMRwGJ+;}P2cw+p%7l()aZy~cMK>yDY}?kzg2S2K=S^={)P#GAj< ze2$#t@GfXvcMPyrek0mtG#L)+X| zEcEGQxob(?#B)Z&m@w)$1m~&k@$FK6wCUCtXUoojW?0pm^_jKKKK(10yt?KjRbOL~ zo_ag8B1^6h%7ZO7QT^r^d2R<9eb$0fQP5&c(U^f?OMj#cV0=C5)?F+cIE)f1PRq-N zUrP^TjPjiHJB{&*rI23EG|-|hpJo!Vr{p2ui0R#njm*Pr;#oK0zVj55qf4e?yH@t` zQyihEmXxcZ4yTAwO>mjW=eFGQV>@>Z-};YyRc2nyeO}6UwA6+az{mJ54|H4=RzAyx zaf5|nx?DWNP@Sc31aBO+sIIVrFJuqY|OG|pAwlPhU6z>@f&jqUx2`t`V*_0k!RxfAffl=x&GdGd!GAtKTuuVN( z!YuLm36zQYtx;mk+ON`l6BV^E=1q-S@NQeKuc7AIT1eSj5$ZprkBOSs33yRuK9^yt z>AXp*JOOSK%VpCf4vqC|+k_=nNkbT8Rmv9(52rcu@6oHmz8T_=6tAr{8~rO+;jJa+ zCf-8f^$3|IjL&Os>aNKbD$MM8T~m~S%tkvIoO>ZOqfV!3KB{2ZR)3mlo>iFRby=pG zKYQ@_xOOXPU1MnnFT?Xe8LXBZ?K{etZeuJ-3VuggnFR_S8vOqNarB_$QNh=`ClIBb zw;83AtaoDENVgX}${N~xZ}L_lPcva$k3$@M^7=%0o#RIo=$1S|uh~n(JRN&9e^a-LS6Qwb z%1KP#aOHWe!m_%s0Ru9P*aBcr(H%>}v5Ze#*oa0kCQ}wsY*Rdc8KLKuvY<+9D4_vg-YP3>;f9B){12>OvgSYRBgh@RGopRcs3aIE+^Bp`Q>=Rw0;mWehr+|JL~qnvLg71a3sRKfCqI{?0mJ1fNZ4%soe!r4n!+!*1X6 z{?0NKuI95C%V5zb%0MI?kC*TN0I1>AIQv~HQiTTqZ$%X0P}{fm{{Uxx5Y3&tREpQ! z58uLvFkFwaYa3P%F%n}gMVS?ek=*GnN0iHQBdnzElD1t++ftCA2s?H?#>b5MSvd$C zq;3yG{pm;;9$~Q`oprz2ukD@ZE7_xWk;c>PzV})5hVul-F~}Ug>jra_UTK~unLin$ zg=!WYnUXB+u_fa+EcDpcRlN=+-E*p8&k6S9Nn)1sLbJG;WQ6%cKClMNJ{#-{-}%!oIgz=W_xt_)85q1w8CAJt zoW92Wi%9gz{Rpn2jS1NHSrX+i2*~8iaSlSHW(SO-V}-n@LI&L=k(?OU0Q$4G-DwNE zZ_=60D64*+;C(!|9$fxGNQ{O7Hgi@UTBRSQ~t6L0C@btO4Xc$NKy6 zmL8vDK`N&#N6NJY?oWOH04^)tvUeK_XuIbprE7Hc0y;rHpHcVWBd$imman!CN+y2% zDf)bA!9?BPxZOQJe?Q0%U-@yA{c8=J_o5D{1d+Jk%y0hyFJ2V*KAOll-jkF@`}u!w z5lVn?Hx+_;jzGm}Qu;^d>B3AZ!vg~y=~y3)6IRL!R^z|d{(M3^Y8xHsLvu#m<$HG&tGBI}T$`GQl%z3lQmIWd@fxWMLW6Qy>tVu`1gwyDWs#TFOY+yL z12llM+hMlfUAVy9=cPJ|2Gm{Eplmlix9*<)n{D^uYn|ztjz-(mg^FaEz0GTSKMOiz z7s4{T>iY{wIStCG@RZxcZOG8C@)!I!lF+SX<$&=@)Y25Lk>6r5!X97W&YD5bh1d`0 zOdANl51Td$Wkj9sQshMU*bW!qO!sG0*Sx@dr3OSd`g)pP$?8D|VdcaY1h!m*nsMVG zVRks8YA0^nB>9oQm*vB;#JyW_LO366;Mcw)f=6_cHu68)+l0vqgOSpmGlRB39`%Pv z->CN_@8A4w!+GpFRymF^I#Gzw-<=^WHQ6U+I^i3khJpFrbL+7DBleZpeV?|0?qv|f zJx8hR2f6+4Q7-OQ(i1D}xco`>AHBNM{vu;ShU7L_O43>hY1dSGnLT}P$SF?Ac0_+Z+g{{9uD&2;w;(#ipL8+$1B1NZ&6I~mCS4~x>3Jiw3< z)D*VbUj7+%Bk(O?ZW4R!LG|K5b#Qrm98`8jLOHvP(Qu*)NZWLfM&o_X`;Ecud-0Nh zf)8;?3_%2S6#K8NeoVIPuaxBJ9vU2tT%~m_K_GY@_KwMo6(DXJ02L1~2cDIEt3hjQ zbo~)TadQyT4TgUAA?nV1x#`;{rrT>_J=DVURbuk;f)Mq`Zg2FjvW?HM8O*^|5@gpS z$eX%{M@K_RBf?SgZL|T>RC@!kAt~ceB_mRi06(w9p1G}+A(BQ9CQ1G51x;9`C3t-c zke8cRT2h1IgCk?GS|Xu)r>u|K{hu?$MrJ!z#igWc>pK#CxBMzva!n)`65QErQNei% zZMRn3n=3gDqq6$a*b8xe_5_rtzi+Y$+kUk+c_M&vy8s*UIHj5xG_w@k$Pt`ivDBty zspYVlBXRi#S&}AI)MPXq`KMut&E&>B&_UJxdoJE#>K1{K3gV<*@+Ua_(Do3UQ6xQ&2S>NK!mV2&!#gg-KJLPQIjlI|IdeF9FXe+{3&29B| zKkvx>2YSt>^-^&`u*)gwYNLk3l(Y2g$?SKn0C75SvdbUCo^*nSbj6CyJf zkwDvEqiUG3EKvyHk;`*rmn5b6p!WHXH6X z;wY9Wo9gQ1Wc2qxBT~(}s*8u-Kt9ns2=%8s(P+pTU+a=fs9Z4!vsbi?_m!p;S zZVEdnZ?PU+M4j85s2B;h^3}K6Nw43LxJm8_iB}H*ab^&cJ#Yt;tn38*!5}~>s zj(t!^ZUrHLkOCym`|L-yJ0Fc@`Ixdc3|+m!{@)5$g3D~FNo5T&At?(k#6fKik~S+y z+=12mN$xm{b%NtN$I}P*`qp7Z3d#l~8{`k={Y5FXsIl2sjvHR;-AM48LVo2yqy-MI zUopcCkl(`xr@1w+YEawfmHoP4WAdgo;_EBqzhGd&bUo4(+e&kEwzTw@3uxcKJ9(52 zg?f$nyRb9dg@!g|KI9A&?Z02gaa`M5hT76rozgZ3vXVB(Ty{SZvF}i{_F^!l#)_#( zYGGQ#@!XEBgNo|uQ$;;w_tdaVhi`E)+(P^D2Wr7VUV+aVaKRs^pLW<{M|B9}3tlZJ}wr znSuI~;|w?DC#NmCbOt^Z0-H9Xeo0x39$M5t%okhLT z!!!H_;-D$e(xb61Lnd?-Hnl04OovnudQ?c;yH@hU%wv#plluIARoC=}ihF)Wm`f?> zdJ?|F;yN(uF}*3}xRiZ7x|rq#aW1bp#ilW0-ZN`=HY}UiPDV*{^j9W_CECj{Vt}-^ zlEk7AK1X&ViAe-LZ=nAG5O(kLQ`~!sw2IaU&O(CcY>}P4hqXMkTP?=Ktdmo6T6!xD zNwbvHymr$yjEj-ud#c;Bq>^W!b7sLIA;|lW22+17z=Dn;v~dS@Kw9LS{Julj_s2t3 z(#;%iAP9$-0XEy>r{~+XF)}2_a>6UNN~)1z?(*eODy8Xk@M@fyC30G)5s;)rg&B!% zo`8@;P895*gRqJsX;er74h}K#_+x*$$vsMEe*`-gK}y`|J}OF6vUWR?9(0G#BM^Ck3EK+o z&^bL7#&Av)?mF#I^<589)h>`*uor?H`iTZWpJ;*psLl&xEIm78a(hp-(=454>VGe2b91BGuZ+&@~#k;8EwwsA>+cQ$%U}*B`KveFijosc>SKTC$_b>@JEV!FZP6 zal|;^LfQm&-w6C*@jHU}j@mvHl6^-`Z!^u)nDaotw@JH;)mY0n(%hE!Ho=2jr` ze-peQ@Y9O;R^kpTF=_We$K>CD1j#9rl_JMUQsv|*(6+_dSqid(7WI?Z!G!51Kb+m@ zb6HkbsX4BFrd662;_eMIdL2cM$*r===Ss=_>6v!cnR8Glp+)4PI@2Mzqok-T`kRFQ zk&^Lc^cH+y^=p0~x3amHP*z@Xdn1C8DnrV^BqYZF0C~eHkZhz^mUzeL(s&0>yT9P` zadWR;-`m4rQ1Y8d)7LDLN=QC*+^&ce1OSB3Gjmm}=ZBf>+muZp!K7s39;mgd+OKb6 zpJ8=&EmmfDo)?!?+vOCM`gG4NvaUyw;TwL2aM&Dap2Lfo_81j{pGs@#Q?swc#G7b!|dR zi<@|yq_+0Afu1pH=h2vDR~Th@*n=AZ%p5&5u9q9vtsKEMzen;IT8U41(-&x>RK+=R z*Sn}Fz`2T-R@?a|CpT!eRp?mo-)%uEBcrR&TwTHX&kXCgTr0$o`5N_%%@n9|5wZ4V zh>#0ID&gXOjEp)EK=kJeaZZWG8V!#XaMa>`4)QSQa=gfU$1qYt&kK4bPrBgaY!e?@ z;IpCMyJ2|6t!#*I*?1MOl`1ujOLlACd!Gz-DTc~AikoM~1+)hV*!CQ01{OvsD9maA zVbqmQ`S-_u^=NHDxcb9=zGo?qx?iuPZH~YlhG`L4C2Y#edh6IwZqsiw+-6lROutz% z6I^N5r3SnY1|5?X@%C}8*3^|BnL7YDA23Vj*-0dF53=aR9ZzRR7-VodGLYXIYI|6x zh^6dN$gD8P;4(LSGM`Hf4b;+!w}?T8=8Rj`1v98-9I+W0)3-Fb)JvK;~Qll>~GcX6AZTf@E0S>{-lO zwncQgtk=j*dORxUrnMojc2XlpN}FL0x}aZD6SJ(1iQB&wI$s&_XAW^9aW<2AGHZ+* z_{>W=45c#6cO^l}5`82BI#f;};qDpNw0X2^nTZ*-6K7CyDY?Ck>L=#dGmlSG&^1@w7B9qZXwekm`Hqu=9!rYD5;&5xv{y}0CB!6 z|JV5pl(F#{-+6L(Kbyg)G5Q~w@OTR zq=gSL=f9WVg^)`8Y4yl#icj4j_VxaO^z`8&a&mgqyc};^Jv;FrfD;sv_P!Oby0+;Z zx9KPP`+4j*U=H2s=ErI<+DKN(I~~0JcHw?l11-HY!v`Ix!2tjb_b2z0zp45T7?Ddb zgTp5=i`q_oq<@R-)wZ#zjd36|GIBTb+jI*NoO^ zv#D4cZc05r>+8c#ncZt3){gzbA8*fwK2(-YV~}eFC++3_JNFdUyVT--vILdTm%C`9LDP^Vt1;cx()u4zz*3!izh( zK3jbc)Nz6eoF0_=4q71i+hMnEAC@oZx%X0Pk8H+?|2jZ{NTCyK#cyhrI>8#S(L3qBrRWw`1J> zcHx2;oRjINx$_?@eX37$U`PZMk0Ll}r32Etkxb(qD?*OI`fd)x&(nm0>$`WQs2SgJ zMO1blFdLrxtG@pLnDXI=bIftq-k#WRov8iZO_1b93CJ&QZvGbun#!|pWirR%m2tX+ zTB_fBb>DESh!%Vp?Q}BGC!s0a?gDY@G|4N}QV~+RcIy8CuNl~HOEMf_^sRj(&&=@I zV@S_8%Dh&}2di$8=eXbcJ$PxHF5Oz5Sk5!rw0Mi^!1oNb1a*6XSWX}!QIQTnL%N=K>m z94#PuSR#LzdJ11ShBGXu5h%(1{{SKHPxhd(T*!*S3s_1OI!QnHnSDE~H{?Wi3FvJ< zVx!#l+UzY7(i{!tZP@$&0LQgyx}D?RPm{DuupZw30FS*WCA7q9B(;>eA#aCK325CO z>ek9b(obX4A+$$}sxB5aSsMkj)8YRBKfc+}lt`T+!h|jP z4=HacEvLGarFAJs$t|{$uQRYn;}XdYtX^cSsR-&x!2bY~@Eg`+j$5fppe4^>Dcw^? z;FL%zL(-B)%IvuDm;V6l_ZvL&5AA*wpD(W(R;{nS*f#drOGCG_xcL77rBAn0-`cjl zH%1oZOCaW)Z@<}7@b@F%pzWTuC(zQR4hb*3zZFXBS6WKT$Iq#1?p8NGLycNVasq+r z0|Veb6|=!>%5ukZx%m9eO3))9r9B1KrWAEBQMysmrG6(!O14tH5I$qXaCtplSNGDV z1yR%O)WJm!#?Xlp3$4!Zz1$tpmzs`8;^_I?h!y9z%(LsmCvZNxAKCX5qvisax!b?c0mK)VeY#U#f$KZ`PW1GE%w3kGAwgrZLGC+` z#1N6w)$8TA46}ptphynGtvTzN>Sa-o$&%ZfhZ8xl>2(V1rqWMR(2_fBowwpMJ`XV1 ziojvWV>l>!=X3h>A1aV);UX#{H3_ss3jh>GLrt{C!{$m-N01(S?s#qHcLcG|&%I(a zNbs?MtMI4wLR@Ti2q;pwQ3wrqg+02L;e>^ex33UnkmM3iPL$_2D8l>vsoc|w4xo6Q z4H5ID)B=U8{gj>%tXSk9O(e>|<22}H*B(e>D`lqAgzn%w6#YU|^gIQWdYFvT%(4;6 zqiS-&L4_IO*i*fWr71!S>v2D_+K%9LA5I`j-h7H%Zr==iYbkbPL+J#5w1X2mvRwZF zhs4Bfm~^^?u2jgbDmV)}b(a(J1pfZqO*SwE=aOJl54uHC%fvVSch&5z4>m`s!N=#) zruwe8m`ZG8GULR2?J?G-exUVsAdV`fbcyn;e7@Q1TLf~vw&Uw78rhVhUIKAqN%>I2Ak;yIia``F{!SZ&k!5!#vNb%~VV!ry2e#{GZhjZvkDOo+*8u)uLn z$4^qa62bCJS3;HHwnwJ>1H$hmmgZA5r1{5Ueb2iLZfiCyEus;{k0=~~4#0aU&cor_ zq*za*@i0q3v{IEgQ_>vr3t974$Jf`2vaAm0EuP-q!mNbK=O}TJ-==HW)=e|xxh*S! zVuuP3ytMI!Ejx6kLlPSWhP+RqBfk?~BPan+G-P(iF!&MHqQ$8BIrE1kpySjCQ}GSb zo0mB{9B4Gt%6-WFW!8{_rqFlUz@j_!_WJ$!nH`#sP#Dc>8rH6p5@X4cbC3q#_Nbcs zD^$@nQBQ!BrM3ii+%ByuAO{Ob{aedyp68`qxWChEgc3&X4i5R~54LlV54J^et#4J9 z?nykLQ~(zpar}-xMw%=+1}s&`l{J}ilCtWWfYh&f?tW43@{pGlwEC11c->*Mywv7F z3}!247!5IALGkB9h4=;nvgSnPvDv;@KHW#?YR}-h{{Ww1^iinbWRKEYM~bM}!lg`8YU?XVu%LExi72zjFB?Zv zV!C?SdTd8f{;yB)0D282>b8;#B#0|oO)vbW}{`*rrN@#rqS=>GsS*v0{6VR0TVzT@=FVE6iSZE;^mcaqYn@firf?C(Mulh*M{ zovL~FVy*3oWuUaW9)+WG$Xh2HXSnzuhq3@{}h8k7OtR0Npts z4e}yxX{xmLn${#-j~%hZF_})-(ZSE!gqvJLBC$@&k%j73JnLrLPV?%QP_~xThStO2 z2N-!nVjU?Zsm4Eq+u;0vf7+|{NNpGdok&nh^Ys}Yb;ji!bRgs&#;HWSc@*Kh++Qb- z+Y6Am!Mj(Bku6mn2@R-7XRZ{F5;n;TaJ3~p9V;pu5msc3yIIPO$fqlhw7K@q- zZ%F!;#f%B5SWc&ydV?QJ5%C)a$9UVbn12SB9bbwf7*dNX@zil2r@XowNAvGBfX17Q8`zZdO=QM^lb<*@wpm zV~^B!C#5Wm&Q#gXM!a?{6^!ILB9euGO~ydPZT7PfBgT*!S6SRAZltIye!%Rg?OteJ z_Q_i2#wh~LJ~?BBo1(KbC?_4qxb8-Ab*;}e&|CHv_Yxs!p-dSiRoj^1TO0Q4vCl(J zJSKD-^~y3>mGA5+#w2`QOt~gP8YDjmA(!8b>{KCpow`X$-)`Nd-&jj+va+?ARb?@A z1zvBm`DF|kk+yO&KQ(B#Fls#SBDtMO4d&pp0o8B`QlmTL8y|+xXKkR-IAGqQOZ8Fr zvZbD$r>!e|By%ppBmMkz zEDJ_M0;ge*Shdny>e_&FVIT1!ZnDHi*bUXd`yAbQO00l_7(I0M(-E_i11-n$IBTxA zQ>|CnGa&*rn<&Kl)ikD3t>If00+NCU>o(kMt{K!V_1zBO@b0^7D7d!)fhu{HCg^#( zJVb7-oMUY4F|cX(S`NQxn%0eX6Ixsn6@v~_D)o(*s!5%S>~r(3i0EDREtX7yhvi#a zQd;b7|o*h_gTJzmrvKx8fmeri+_z5uOaxlY{nNKNw@TZ|t zal(9e;|)_s(FA%(aeZqvS7?KmGc*U9G3ry!sNWz3UY`!Cxwg-)JYZR-NlMRD49rSuchdWZ`FziDk z2;`k40D|FTRpuZbO~?Ee*4$&lT7MDUM%)K(@Y{*xR%mW5(&A~4)&U`sL}^yuScwf9 zo_B6vSY6h=Easz-y>-qxtI_HBQ(V33B~#hHzER=$@}lYfl(&YnOG96mqYjkn1lnAR z1(PeZjY1y0F<{G*+LX52QPj9gSm2KsIA+sGI0N+}#Pw$Y3)LX6A{L z_-#KdD(@U*VVGA(;?5rN1Hv9HxZ{op7VE*c@%>`@D|pA%t(qQ4#G(_*yt9ctO9wRN z5?2kCLMGhnn#|R3^j^yQ~@c#HE%6kp+YsBmqsIi)eS zay-cTDxP84)5dqTv(Z;v(JpxQYJ!nvF9hj%BdyGlHDb`?vP!BNb~PUQDmU4ZpR2vS5P~7;_k}w z%JHo(V|ec)C0aHZWnr-lzWZ!GST)tIwR>+ZFKlIwdpVFY$cLIYLU0&3*>lr9ago=g zGa9uf}NFEm zbT%DBWyZ=%JVb7^Byn!{H?|VRscEvj8jZAzEK;L#$s4BO<8G?M9lDHzkVr0T`hB*i zrB7jb6f;^+6GtLQp_St!)TK{QdgCDE0yhAUlr2p5cg!}==GqaLN%-VTSUD_AM=TH< zZd2^bMUaz^__Bma-xqyc4K;_$HS>qWa z)i4+}|IqmYn0B2z{qj$L{{Sq%`SH_aaJvo7X&@8wqRu*Y*pg1$?ezZu2aKW0^LGBV zl~JBrOmXe^PmuH9>;0Sn^Bv7gP^x$9iqZz>eifQn-_>0Xg&&NG_ZI$Z(04&-m zU6yIaEs##bBV@UTqT$+T&VQa&*STwHf@w^Awsc2xtd_15O81`+z=YH3ESVlE97-y0 zHLGh`yn~l<_Oa1_x%UI}sj*qfB6ExZ+vEL(F)&V4BVx(Nv+i$m+((y9FZk@3_SgnP zYbMK>{LPGd@>LdBi{m;=h^EUZ#I9o5*GY!C*FNOTN7z{@Z~?wQ#M)e~fN5qUV~isF z$=Kt#8K6Vu?{Gq(`0jo}l{vD^`6R58?wWF4q|;>4#C4TqJi_WuOOxceRzm7hmwpkZ z)V7i$SJ2ZmPeiL(QB0|83QG;N*UqKc9Z8Rys6PFW008*6x%M5YHwFXgfp#Bw_526* zs!H2~ZI#&le!rRe@i?nZ zHsM#NO2he$k)O)6udo3LA5O#kZ^Uw#Zedx8b^w0!eXNKTQOt*9)>TDzb)|#AY#WOL z3oCWi6Y{o#eK<)D+2q`g*{28|{b`cwRMU>OuFGj^ZDX<7NIMbRei)ONlbN=r&KF}u zT~dfUe=h$3*~D&QM#mMH$PbfAuB&sgK3-k6;U%`;r7lptLEej<&iuJeoA&HB;v|egz^vn! zVbZm&UA8^@b{qcyNjx;8CpDFngNFMxq!n$p{4WBrB)rGdu%HM}au1%s>`FoU6XZC~ z3mh+6%uV-kf$#n6#k<&@i0ItzKHqOr2L=jn-lc@?w)G@XRIWR5{{U2{EoT=009Fu{ zIUmIvu@Swu*+H@#cfWNII|0Var`!1u`ST1&!zVv=eZFVCYC5Io)@}v72QedHf4RN? z0QmN)u9E|c5;Iv9+^CAJjPiU|0=#X*W5je3uu7Doo|F##YCG-Iw&5H)Go{OHmqoDcq?b5efTNt1ifkGzP$5ZW-)cn2a z)e^Z2LdRxf#cj2{x{{Y%-0swL{{XUGUzz%G6LYz%AsVR1N_R!Fik90`kqLc-cult- zx<>uCQ5yt>ZLlZ5+lCw--9LYwFV6_M!6u}NX3*QwoIy}^K@KUPKUW!h4wRGMWgrhP zKd%fi%KEYWO<`vtv(x&1{i>73nb6+LVb6weD&|U~aW7E;wHdg!k%oK&#JhP8($9^nsN<`hU;oNKyt{ zBAziLL60>i18z2lOH3iS?gg^6?Xsi^4yUb2C%GU1eK>_TC;+5DTfb}p)c($C(Ux58 zPdBmWD-ztaHtVroPf(KL3vGuF<3mL4;_bh3KD;wLZxH6{zbX;QT=b=Q2qYvVf;Q|2 zZT|ov=62$`Lzc;;nRmu_rS{lz!E7?7LKNC$TCm=0JJCwDMAn2jv-vyPO|c4IWgCm zW96RowBqhWtYEytnl_XV@H? zOtWSq$gXqT;YL3bN=}POa$>sNv{%+8lt+9+b*DPIcMccQ^IMcUKP3a?c#~vo?QP^q zlg+$lEDPrYJu!o^ABa8b4czy45+sQJRhUo@AqPJB$j%Rb_yRjIncc;*2xUs} z)U}{~FASuRzOEv?j?x(<8@F6^%|9EUj4UikUY#>aW!70>KKsuwf~7VR<7#LZ5;sx; zRGy@()OP7UoHjX_;ddgE*CA8Pk%$?_;~UoZEMPHSUvgu?wIiiSocdQ4z<*^RjlN|0 zr0>Jg7kPq!0r(B+iLYT086R^iOouBP1m%#qFi0L^ia$21sf z`O_4{rhx{rmxD`zCe*EFC|2TXB*baJw+KHf7Nno4<9&`U9JY#4eW+etYf?qbE+e)8 zd8B`o(aP(E{{T~>k^Yfdgo~-n=+@ToL#M0Y#M0#QXYGbSa($JE_?niXPHm=`lGQ`5 zyA469ETE9=s0X_G2W34Wkb06g-AN~;pDr~UI}bWvsN7x05s`AOAmu?PU|4Lb-8qQD zwmG)muiow`!pfHA+B1R_`kFrY_hsq^az{^UcH}kjWnvanV>qAtr3~BGMYCl5@}sE^ zqQ1q)P^X%WC9~2ULW0^@LdTKb*M%pV%Zn{+E>ZleqSn*AE$T#&6=`A$d0Ei!$iSqk zS~JvR8r`fhDJGKy)^j)L7kZcReG8?L0)_ zm%rh=Nlz1Kq(`XQE)0e?T*q^0#{yNysp2?exL;TS^}qbd&1*cL zW0_7KE1tZkJ0!n%V%bh&mLD>1DXVKF(J03>!aCwTZ4t7~9mXXJN64Ah5N%AK6)}o@ zB9LE0`)=CS+R(AW7l$q5x|Tg!R<@Zk6p&dM=VU4fDBmmr*8t^fu*t5<*3r$OAi1?{ z7g2?H*B@`x2zB@z=iH1Mi7X(iB&M^gu4;Sr`4dk^wUJoVYNW$spcTNgua`Nb*g%x% z4Z4`_M|r=-+J?aJ{f{n>sKKd*iEpgjG(pSB%t8BcNg5w6L`MTD7FO2>mczLerms%GK*bnioRx2x+ zFQX@@X>>la?X(DqNt>$6n zG*go#l8(7oVzHs+2Rz2Qr;_PqP7_OwM3H-j%ZHW)KZnh#x`8dpv!bP5B+(rRk2$7` zjs}#qq@h7!JNj|Jbp0z;yn<`%MVeKDAZ7}r;R)Plr#1m~Q@ILpy?RP}tro zOK`+O+{^aB*~r~3Gn@YK4RGXp}bBNK2z)>R(MJ<3Oz{HIpm@E8J0ShoGh~Cgi@CZ**y#2e?7+^NjM*bw4GarH2aPyfiH!sG*P^Z{B(?Z zUfSa$n1pPpSM@LCYv(T+afZF1@iw7lpiK5Hbn7&W89!H*&I(;y;PQrb!*edg_3u^- zALdJ#*wCV1VIBQW-mVsww0qNeYul#fI8&cDvg5{sIjsUs6`I_gwLEiHJ9mQrB4J^DAP($z?!&sIRjj_>H!l=MS2WrX(=p%Tk?% z)Da<-tHV%RY?XPU2{hjdyhgfMC6XN;OuQiFlx|Pe=3cvcl_cuBb8OF#RI_UyD)@V8 zJm@FaEtAWilL4I=4oj7(rK5HL;P5xW>E~e{ve6F!6p_(Ly(6nfyxQ?hYj#7 zzfis5o;Hd-OHN6Vpq;=ze0V-vNTB5|A;FE^c}t@JOC|uAAY-(3lx<^B>fyIQ#4}#q zLyZX#1OkHDgk#C^khrC?Q{k(0^!D3s+-cVumHpN8YIDlxP-o{d1BT}7&6UO*JLGSg z={DL2B%0H+O{ufXk9pD5(ZM>1_v(!E-0J;p7OXtekw)#*ay~jL&DI(y1 z5bw@k3M*aHbZhMwjDPa)1zg+R@MM!sCZlO_Gc=Zx%OR7V%;V7*X2G`^javY662z<3 za;cExS>z0cuRcxH3lNjai=!&R4HS;h)* zYKaxqE1_nFvml8nksfYVtddql^kcoXkxgqdgV5 z>hW8Qi6P$|B0T5PmUh`>IOma1ekHx;ZM@<)=EggF@1Dl2Ev^N^6C!}Yh$F5moSOB5 zs)ljQ-b8PKPqlJ9$nY7A+NrM0rdySZI^2~qT8|n$#$HO>Ly1@)t5OO`I@Iwrk}Jjl zCp(U+dymVfQN3s!O*B?9z1`W$lYkTtQO-F)IOQ9IoE^Fx?O*@V`1!Ft6X$FP{w_#Q z&A%RVZ>bthL!MjaT8DWX8+lc5ks5t-&&{ok;3W%@BaLfN z)-L3@BHfxe7wmzMNcU{u@7Eo=Z`9n|+eEPrU>VO`;N##vUj6?7m7DfAG-7kJn)?p< z+0yBlwT~-WYt1!(D>+2#XvoyeS0c+blM3br2Bc$F)l9~ugQ>0KmQQ3D&T~k_SLV}4 zX@b*Cw(AP7xeqD}^1+O(Lv4;$9eZPxf-$~M{>Gn-DxV|+g&TaozT5k4?knZrpFBre z@D6#o!Nxh5onLv(O=mEAh`n3N>nNgQ6`8(4YiaSC{Qj1L3K15bhd;*W!MKXUK`kW{ zeo#B{vuRBi)MI4o3C~`m^6ie5TXYDV^KNms%l`T6y;U?mH`{+bwjP7){XAGJ_8Ze5 zIy2)WY)StBp9@w8;AwG=-K%0>E)9Vo4>7-={WyHeae=w_r#W`5ok01YPhaZe0f{^B zSRmAcrTR&#`sbO$(|r-r{QFq-63PvQoqh$TSgo#SmrbjwLrz;+#-OE-DtoonO}>Rm zcq5^dttCVPIA5C-BbsIkpA&&uRde=6O)l#zcrlaBc1e{jsG}%6!QC&^O zuQd{u$q?L&Hw2~0You38w+av=&tYsW)VMl$kIxd4j?0YujE%Fuw#JQl~ zjfv_8jcPV3;H}K?jNX>_0?a6V;u}^7k9|jO#dVZ;ldEJQ_MB1+5@R@*5T&-DOGSjS z<}wK1fBE+PD?Fr(8jTLlfcJ^k9Y}OK78I8dvDB9Xn~Dg5@q2vEK18^JD8u38*%S)n zXs(zpO`5|fbxUyouqKGH0E~Rb5B2@~Q-xSy0s2*Od;zk&{WkRf0N;nm+iGow^ifBD zw+ym?I^*G36tzc}WjMrZ_*mvcYfBF(t2B8eYS~JR-Q_8HxeBPW2=6AnavDO^(LE|s zQb;=v8_RYiZB7tzw#5Fl&^?dM=f8c1-+wL;+`QX#qz%ujYRhDSxC3+NxcZJ7ELi(g zrB&_Hi#h(;$U1o!MXbVhNO z=~+R{*rQBZOor6vAWMELHgOeSVun-_nXp#tZ!RO@NhM6J)>5Ok$8`Dd90Qf=JJi&S zsKS2{I&Hl_x2x&{VEo# zb}a14PxD{WzmHS+57dg9DbwzerDO_Q1^AC45ZQZW`0u){_6+V6>ZCYALPubY%C<=F zu+DkhTa4iK{ro?lPllrc@X$k?}n+2Xbo8+Bq7`vYu&O&Ieub z`F=fsq*^+*Va9E~prp9o#G|os#SNTsYFBk_u?Zc38*!vx-phS()5)Go z>SUmy0oRaRDqFkwZLg!{OR5U)v?I{}04Eu2sKM(^`Mkq#&ZKJM2a!Tj0z#Y(fOkmz zNgqM=^x_*YFWUU6mXjj@?N3TKcTiu-j)GPjQTbK};qT^2JyM_8-oqy1B6u{Brw;t+V>3;-jQE?)&cN zNek%h-@kq%g#_g6J5riq(C%tWRLgMFDw35zhhnc0wv)37c_}>}E3NiePTpNdW5YAN zk(^`FYb!1XK~Kt;5Zftn4qQl2d&BqSy~O4+tH8-5Yz!w(}dAhv#VePAN`TXVYLf1e`%YqN?L_ElPxixUsqS~YXktDzuWo_7l}!s))J1A|xOLfRredg%jB)ZsT$E;fPi4q!AEQ{8ttJ;+$dCfuNJ`zCEI#(%PK2PS9lo1!9(iQB3mmuzy#fwV{Qm%+Y3PF6 zlJT+UBXaGN`}ty*n7o977#7gO{XfAiav9%l>h6@R^q;>GS_f}XR^<2VO*W$#B{|p3 z`H@P|@>C;c!<(cHyhQkqFb~;VZa4m35G}@Xa8I$Qvg$iv;Cy#9wG$wXH5)Z0j~Tz= z8as6@ApRiQx)e$NQN)26jCzpZosUsShUz(v%%=l!??h(Z_z87Px~E!sV35j^!s9qS zTLA@4ckj6QRm1Q>&n6Drcc>TFi2@goBoo-+gZtmwv40@7jLS~Xl=@ThmcA(CEJj}A z<=NNVY$z0wu>|kK_ExcK6PR@1CY5uM5H7qxPl+jH+vA;d*dDf~MVzZ=9{9dmCSbIUcQo5(YZ z$>Xs#8rkZ zD=H=w`KfNw+0Sj~98ewlQPtniZa0PS{{T&GEpQo~bWg*1YDfcIL^+E9V! zuu6WMM~mt)sTxs+ONho@k$@QPQHQ9XWgs7VYFlf@m!9y;9lM`OvgaQL2Lt9oBigcZ zz52$=ycmg!lk+VzAv@wX>f>xAI9W*t$wctvQwzxe%QWQdFu>>7oQ(b$rsjq_XvqRG z5csc8a65iEqY%)#rrEcoVnvocC24Nr8%k65v`KMYDaawAo!GRfhVkBG2m$t*J|jh2 zDFbB|)|^7;Mb=7K@hnT28Nge6o>9G|jD1jCNWcBG#F%7%;mj13b3_ETD7X4@z0Qv3 z5~%e}22RtU8%q)&^P?D%7uOzeR7z2&T1%~x(xFUEpN!lI?FjA3i#i&aC94|ck{YzE zmla`YQa^=hL~NC$flWS*XKSfME#`;nEWGhCVy_#9!HQ+;4AHpdV1CO0a#4dFjA}Qt zSVyDYg^pm(7ny}F9tRu8b z2qRe7by1Z&^k8;4Jpnt6VDuF3%d|%@%j>37u7#_a6s{uo8JTTTOR^@$*-X`2*R7O? z8}~g*xYR*(cN3j>+x7|uvx{_P%!M881|zY zgtCw4u=b=h1tr7Ok(hQc~iu~6^DJf}~wQ8mHLK;ZK?E>Ey* z5&`H42j3OHMWkF`LG^w?9mg&~Sit~)xB@wd?hZb6NwvDa^hQ>aXuch*)N~ofuj&CX>P3H+L1U5bBqR1pKkIs~QdCNXz9+ zt?Z<7j$U9+PfK-Uk&Qgp4Lz5MWD+OS<`~s|G<<(hFYd&G|LEA~f*G5CGQTs3r>9lRr$ zF_zv?50oSrnhE0@G*8i;c4g$AGP0oM@n4IBkN6Xa?PTH^rDR4?9n2(;Frmyd!6#`K zs-y0$&jf*@e^iZ)a!&)B%#MRS(wWup>?s+6BU`i$mYsm*Tb8mnXHxX9#Ug67b2^dK zrd&KV4{3lYV#yhLIv*Sp-I<Qe(B`0VD*- z9Yibc2>$@;IFDS?Jh6Lh1KrsomE{r~{chEIt)$J9BqMuSi=hDuGk3cQ_GaSxVQHm0 zrJ(meq8Uav4Z58{)BLIgYkU(@aGQu`CR2o8*R7{f8A@&Ssx*X$5{E~ZhN1_aH4hvP zs~)4nJW&ftq)f!yT-&)>?d3-1hIAy1;eaf;Q;x)q`^J~xKh-U??keFaWB&jXhaP>U z!UF{Houz@n$iW#IBL{LA0xO_8DWcf^fz#OF_#{&cPL)1Yz9)}$spEt;Q%fj=(EGXeHxBhxQu!nnaK z2X^4j4}*a`{WnUC{{ZFrNtPJ%%+{pt_Q8(t4o+Y_P-ZsRD>S11H;zrZfs)F{YGh;( zgJf{O5v0VIF` z+>_VFil&xDvSGl&4x;IG&j>E-#JK~0=rD-p&TTdms+Tzw2p;5^aVM98^ zpa*QP+x{WW8wVo1^}$?A;U^Dq4zju=sT7Mi^X}%I`Uf5|?Ox|5dLvbdF%z^}I2&J^Jg0BvEp_?JLQ*#m<`=L@83t>u0C{mNL zIwu%#hP}XM+Ab%D>i5?%hgfnNRa5qS#9Z&NyDpgL;ZFSOd;aHUaF7qROE z6z%Kf#;n)`I}jC4PH}^`e}!&05G~AV7?n`Lv(WAQs*dMVDzV$l>)^L8*-E3O9jN}@~V%AB#cA?|UX%eUiF z;&{;WGV>2^m1cRW_K@qRG!--$f@|n>7fvXu%_I7AqE^@V{yUY{vRXwfEWr5jpSXpL z#6qLj#U30s8F6F6B=5vqYbY(VAWC)QCWhR{^{yFWOP4={0^qB2nP+`xY7PrHz(4k^HIuoIrE~tkS*EDqP~%={MZGjCDAQ)%%+K_@A~2w)DqZnd$I`8Weq(2)-L1KJy+pbrtojgd#p<{CD|nii7oe7u4W#=A-`r z89@BqyZ(ER`5m~hRwsUwQob6f|7gvxO97pF`t!fORF0l&u`@W{_Y%C!*9~C zMRf<+Q0>C?JDu;*?~43){{W&F+F|gYfqU=9ej;>2H@S+hhkvL0{{XxM_+Ag|diLq> zw-oyGt6K67yuMe$YYHvUO%RC2_+;dw| zp0`(!b0e5*{F+W;s`P+m?y)rswdGoMq2?ls400? zz8kzQElT?AM+tsHS^Z&iojZgGLO4h&JIPBJhy&%a;7s28+L3DFKyy{KA^ zhvWRdSK@rW=-yGvc3+ZmxpQ@YcN#t=b)niNs+!NFxh6w4#AOx}E@tFcaHYspmZqWC zkIdVN**98k#P@bm86PqSbq)t%(Bt3R@Ywf_Dym2T8xRgZf4}M1hkcWrrzaz_&?y+i zHZ=yjn(^%wveg5WSRxE>V3T^!H%%O@hdoxG3vRi3c9i9w{ot;|ypbEn1Rdz#R=ojy z#`P+de@Od$#O>{nIdkon-1Lxb;%%|EayLCO{{T7tDj?GP90LmF&t3I9O?hk6D&%t` z>gcfSLrY(y_qg!W9z2^ob}fvLn9MR@ z+{-JeX}L^`6ZU)v-H09LB3#v>%Yo8q^Fb#x20g&IwVaZqWF6^`0!v5sf{BxjD%uQqo&}WVy7O zdx(niiHeX%+RJ07U^9_}*0F_URX*R+xXZ~74b2v@U2ArZa^0RYq*#`zXiTsBVQSr) zl~IT3$0_(;PmkyMrPiWm^|f|cmN|kweM88>e1Q-WWSr!0 z{Q7PA6Yc;k7>A#mZNGoN-p2CF)=o?{yV?cG)*r6Wd9+_I9It8TDqN%T^Qag2z5!F6 z^9r3g*1wJ`Sh<&?*Na5N#Pl~QvCVAaK&gu+Yt%S|I2G>g;7J0lA-ay(%NQXUmkKsG z8)WUB_UVl7af42mPct3xcm4kQS3muyEpnX4H@w3)$|KsY{u<7*YtnNiY6MLrgM&Ah zM%B!@34x$ZX&mX*kLaMRKt*EZskclp(ppLz+lQ=vvn(N`-7&EzB=3%$MlgE(F}FlY zP(By!_pZ+KpId`-1B2#y9$BNBeTm!X*RUVicb{qD)7P~p7_6BN%eBbvv2- z>bv|i6~%JvTKa0qtjLVhGYju~#Mau9+yFUcU;rRU1_r}tWoFHtIR&0FUq8|AlHCu@dBpJv%57IlX& z8_FNOsfuA&jA_^`M`71l4yneYmO|mPhR9uj2OIo89})QsEs=R}dUc}u&&tm)c`iTg zY0=AWK`>5JX?Y0Ou2{Kt&>m^wFI8$X`bu)?*2IModzn!LI# z({W<83c1+|h&~wnV;?B*>2B;tZTHT1Bd_Pzee+mlToKrOcK!bVYCq5CDtw1v_|H7r zFQ$4)i^9&i6xHo4!L;V%M>%!p7aq=W3fpdCF^wdj2cI2!)n_H>#-r8i&KYj)l`Xw! zt`Fn_I`QQyk;TVWBX;HlcRt_O{{H=NXkai$!kl@wFYNKbdAIhLV3xd(=szy{Tgd*V zMCH#!HTO8tE@^qD#Zfvsb6LkgMFL#~5m4CBl(2 z+@`eNTa%k?XV`Z5e*XZza5=s|GyDDiTnzS!=w#kndDhqc7MZ3vW{fqBWEkb;9-3*+ zq~yB2r`XmbsJJFAsQ6;=eMHTxDRYbLQu7$fqS)7>@+51x5oMwz_R}ecM-w1C%f94( zpTFMNsPbhS)6o9_Ki}^)Nz^w<9lw9q`uLHWZ#~UvPm%N7e~&&R&l=;LZ9&gb(zPfZ z_uFB^DtL51>D;6eJofWHko7z@&z`k0TRR@LB2>aK zYujl<_3v*YK^|d6Bdfo!g5J%i{{T@uZPph509LjEzszq_e9uAn3eojTudZFQA^sAM zRsR5_b#KJ~07`jM#;TBshTXu(Z4JK_1gNfAX=AD*N(1$52GFjzKWRs|rw&ZgsUA+` zo&Fi`{{R&p0Sjl&I0L80;qv&?)pjmgLR>hlwH_OCCCq6oq%_LpO>roQgrPfrsth)O z1JlpXzZzz>E+;nIl7I#$yJIK!?rUn(m!2^y;3*`i_;eq?g<`i9*-SQ?GS=Hj>gZ5y z3UH@?*1P`zme&6OHr{9VaY2u~#{#X(@}Dh6PCt3AY%t@c4$di3I>MD1E7~gnd3Wj_ zJA~{2J%2KA-5Ef<=8k-pO}vS050S5 z;oEB)`?Wt)iR1&R1N6^No+>@f?WM5-;zdU20sep6H2Q}rg#ZwszmOCxcS8DykqPrr z-}i9^)seX**}=gb#U-X!9Lu`nW7?fH%SXx@Q9_4h?mE(ve`TZQv-k4fhR%ACpVRZG zWR5%l*~{rW)ReqK*D0W{Qeo%@=WACrzjio;ctU&*J+ zZ~pUg&^nlvivVtzjRy+cc%8s1ASFG(@4_dyffF&fcRy=6!u-B8pFA9FXv`}Vv$0?) zmd4#Jl2iyDdj#xP+sJWE%gk|78sH-3cBc|99gse=%UBb2E17`qY~S*4n`cfb7K6d&1HSP!NY0-}V;#mrBalvDrjy zIENrma~2s#bGPa3QiQTH@<@3J?7NT8y*eY}_Ap&bio1^Qhz~;0TX^s4NF?;{!!z7K z>B{h@;KXLIBaj@1Kb1P8#BB*mY;7N!2?Rz21a&94J{w^55&WD&NgY8Ju`FZXbNZUg zs3Q|OW%mC7ieE*PNUfKa*=jpGb-5&v0!MGv$41+$Vf5i9-dPAvU|jYe)YDBeMx~FY zG1UJ6z@)db!8gV+(i(umfGz{!t>AqNU0XNQKQqMG^s^oVoX*|7s;XU0Sg}F;5#04Z zhicZWnz}S@?g)q@tD&?Z5?tT?msAUj@ATh^cG@-N)cmn2mGg}5RDAL2AC4*o#^)czDfch9xpy$|9`Y0sTVGSu7aXm=sM6f3N#eE{O_(@VFJo*SouC0(=0 z%%Q*C%0@BsHLqOij-*Ksn#y|muyOeR0L42ivI**O#W=zd6{xC~+||67RQpZ$R99J2 zLx{3%KeC?3Zrnn;(yXI`FDgSN_C=)&#Y`Z$#cTeUfUqfhi z{w?&&09;n&CD)`#ir(%YlpzV*jo#Mzr_vWp)~|ShE+gue(pkrEw!;dDk`s-XyS8gq zyOmb--B>}Tv@PCbxM_YqqRgOYpj8;Ds}s|GK-PS^vYlDIE*Vc%CL6ZZRgKl)R3(%G z=yG4WST7*Rl(hVg`@3sV2e=#YFNOGvOW_xmT|0*?^$ki@Wfxkl%U??vZtC^$aOmy zscJ>?J_nRe#a*1E`qf8NdV1@2nsw2$OL-1#j{QpGbpHVB2Or*Ovhdirw}(rRg2E^j za0lF6u^hkrMMAmo=Yi7wHCuJKlT(Q|=4WLj^(U27=i51_exK+)^Z4xSf#}BT7h!6H zkkvl94MD3h(X+}4$<&7%Y6$t2(3EwNw;bYYXr!GkE`pg;IADsUiT?msCON+x;^*Ai5GFNAWE%olLf&R@kjkqsVIC-W4u;Azg7Ck0q45kC5+4J|Bo3{{Yf_=eTQh&Dm)$ zp$C~79!^v^^#ZMnjj{(fDNpxypQmYp>HO<(vD!>wHMM*BF5LL?=2=JLY|+VtDoQ*@eb$eIpj^3qH^k;?1WGbktl`=UamcJ`~U zWy~#JKZ@AtG)*ywrq4l=s57Ik6s*stWDvBt@`g(tg~LPXcdZkfZE8!St+zMw*4p~! zM95WDBd$*1_8-_*=bLE1f)El82ml;o-#tEcP_LAn=5*xFU4+CjAO7>On`wH~7TS)V z7|%CroX}{;Wgxtu>uE?&&~3(2YwHsg)GDRefQkaUl6@cunOKs<;CfDKG_l(1VoP!z zV^uutOCl&6mNKg@0)dn20CnwEFB@x5b?aE}@oruzp0c&VEpg+SYn1qnPs3?4I!kV- z&*FD;E`CIf~BuDNGtnM;9`~G62Hn z6;y`Z5Ro7fEQGM#NEjY>)E9&J?~86Ncn%bj{>kDK>audZyi&sFm93>L^G@s(#(5eb z7jWBxewuXe4R=d2n+L8}E^y6Ts`2k$l&^P*WgZA;;OT&p^AM_xj}c97vZO6RAd~{5 zz-{fOxQ*pqif0R)lDWt|k1!Yq00Y!}SEE$JWpX2CEYbi=9k6kXV{jClk+~zj+mtS7 zc~sM`WAICSUo@p%v`Gyual~NCE~(z>8(Cu0mJ+yDu$@9=Fxgjxw^7sbg`O|?V~aJO z5!PYXv?+Y8N)v*5q^b9!nR+@f*ynMajrXdaD&Y+ej5JBOe_o5u(&imL{7?5~g}S4u z!5G-%9X762;2gSJ6O@jFgR2Wm^tPVYVU_rZJFV6`e9FMLu?{G zK}#V%3y(JEK}c{0y2ba1(Lp5FalkbX54C^|)|oqH?Cwx{)(MBHMoDXVmkboHeMy$% zx_5@x2?TcSIk4lM9f*TcfqgeN?r|KGLVYce0$jp<1%qSK_+HHD4sWQrwgS@idl0O{ zH8&oynT}=fvB{Dwu&c?CJT*hia4Q*sGo)epWozwBiqxPb!c&Wi@mq`+T;#k_W1w1U zLS7fTd%XhUHI^2T1)4D5Y8ljeeCU`IW?w{r2^RsmSF`Y~{=0jod0b6umYVgvhAEaZ zS_umMnXTCFVUS928LCqP$Wp;078Kq5JBug z9Apv>M_R)wx|LuGk%A9GJ&kYtgY_2jvZ1Pm>T9;UI>y%)e=VZ@~LJla6ogu0OeI9aew&? zTONWB98bo7 z75HzCVz{xk)8JiUZa_=8PDGHQ=^=a9ZQRR zMEb6>+AXY$0^6`@93L^8m3g^voWWEL&Q5w~8Nq2*a{ZcWHC``qX<*JbUu9Vq#!Yv) zJ6!ZcO6flBGP*!i`4$C(;y9N~bQN@<>;dDGYrHa=RIUEe)cfP{{3^k8 z=q;|r;!SDPEpKh zAyP_vfKKDpU5Dg5_TT}SV>F?b=m-P76LsXQgXBQ(>%Zmu_;FX4VrT;cCbW3tebS@2 z*q^TcoBHvV!t6ypfs|}(^cVjCBzu{R`10kDa(S%PC3;tu-|GgV@^zD1&8)Df%BnF7 z>I!~pbVOGfDpg#~J>#WyD;78)GxU{w&pQ~=KXvAx%@F#cIAvq z&(|NPZ_>WW6^LSLII@+CUZdvtSwVON#TJ-xOz^{_zX5~Fw@t7_*SCQ5s(v-D(irl6> zoqNEgY)**NiBeRMK}CKp`njc9-!Iy`s(J^iP}dJpG)qx3{VL5^DRBvM`wF?0OCriC zbNFZ%EJto^cL!1(k0A<4DIlH3&frY~$+s~Z`{(11nd^?(s4Rg_DTpL(`#=r$8~LBQ zy!PTzlN(b^PIl>A!|EP>UvAyMw~UE7k5VZix(shpj*x0@wCPr8&TY%yf2$g0sgP-J zBS*~iPWLCqbNakx=z>;N;a*}2ZtAxk_;e8Eo25vKh|P6Aq@g>7JaF76mpB9+zwPXP zROhLENOz}3cg&wM8pWAl`jxCa$ZPho>K>TNV#7=`jaAkR=TI^|G_a3l0_rW6p4enp zGlnHOo0_=O5h4Ovd)^pr&aR|`!*=#oR+96_8sv;;bAWa|N$NH~4XKu%SM<3*%8lvg zG5p8r9KArZ(q3Zq(@bskY56mCTI&VW{GNj6Qf%f~*xbpx%`Br$FWzKIxVM)j7H%Ji zu=JM{)95QZ$!iNKAV@g}l!q&Wf--V&df@v~#Igo2oRj+1hvm36&|VPcat~kYBb)=za&~ zjOXK6S!5X8 zoQ5i}9GcetY{}J(q(he`TaPUYTDpQ|v$B(!jA%=!QbyY^Ok<`nHy*>u*yfU= z=DN*skXp*8&vk?dd*E=rq!%X4n-3v9ZR3s`3 zbkO=7Kw-6P$+NWx$jCVyf^*#MzIz?I`|s4&M6Nf_PvuTb6I6Mu5mw#nwtl@f`&3rR1C$WUv=km9!8M|jZM!vHH7DjTlk{{T8uNLYeMBver? z+R;lMsj3J}O=fHI9J*>mp!BNO7-@#6)mPQDm@?$7t0Wjm3GG4 zZTeCdEs}H3*EH>&th&!*7Sa^`VbvM1uP_WNNp2xY&Tjk#PYh_has2EVBSI2R-(x#9_d)vgMoDIl79FCv9^sysj9}H0``pc{q7J83wd#Tyh zRV!MuDqN#o7|XJ}hVmA?+fZfEv&!SG2y)4(8igGhbVN_ubE{fqez^)up(_#E2$*tm zfHR!qzsKBsHuzJCBQe|Ue^2jS6Xr+SmgcW=)u{ZkX{M2CuAAXH%=VQ+&MLKUo2^Rb zcL383Khg|>4rh#L&nVa)bwyP6hH0a@y)As#O^udEa@~9=^=!>VHrAKe7H#GRlb4hn z_uu#5r_0$-FDl??n;7|i{{R}IIqx?-*Xou5g=t2n^Ea_6w?b4_{9%gfq} z;5^&&Riyf%nrmj7^Czx2R%<$g&HG676nn>?AC>{Fx4|*A_`pCxohq{R`9i({330`igBWKPmbj<>7gx zXY;Kn8-)Tk8;;$<{r;RG@;5XDJM$dY3sQYHJ@z2~0LzGk4Eks+K4QECZS)`2#xQB% z%gdhByN_4=LU3_oc<}&v&Bw~O3E76u{(ms){{ZFU!%VglTzQfV#UAI_x7{Dq{HniH zxiDM#QJhUK!1oLHi2g(8@TaV<&n*D-^bM2`phuAV{Kxrt+SHP{JxyuS;aI5cx8>Th z1^2@d$O?7TA+#*{p_F{cK-+DS(sxlGmkrG}A5a0-t~cJd(u zWPlIbjhZVwm9mpw_TrxKQjYtt9?zBE#L)#ifQkIG3s$sS2a{rq!| zFViHo)V{sw@@K$N-X2j*D*6|`tqvCU=mQ_beaNhh`sOrPWhNwu$)C!ubVQSziG z<>~FX-)}UJ={#z(!pnwL!k@=K@_#{A9%wlPWSc>d_9>5Agkr&Jx5l&j@&!aJ#bw*;R}`*9bML{4x9O-GVOS6m$X z)1VmRN>Gzv-B{Z8CLbsu$bpAa+o(}rammdkt&)Uo8`YA(kd;J>;N|vGZ zR~BMva3g@IkNv=w{PI8_Dyk+YZh14${@s`I{BdS z*=%~9_Tl)g$(A^6(7e((1!K=K_aQ#}dk(c8S=1xRBXXjy#j%gYy9#DhYONcY3aG49 z%Uh^6#ie_Sml4<2PlnJXDIpz)QoM%zcU@b+o+O8YmyC31W|RfylGfowGo)i2&y0{x z=ao91_^wxJ$NE&7^Jus48Uk>$Mof{j9*fXz?$t1OlblOQLY-lfLfTUbX}4cOzYB?5 zjk(gFp&K2z<+^39glc6G$1CFuugpRo>dF{z@HrK<-dtU64?9O5ath!UAL;~yx5Qx4 z)im1#`?OfB%aD$qw@QmU@4A-az$L{w>%UKaEo|htp91n(UcxicanFv*ppXjtKVT_#e=eZ|xN$=BoQf2p=C}C?2nW9X6 zX;GrHZilHSJy`VKn2zQ_`~X&2!QZgQuoXN}>n5U7Q$ec6@9wb@+Dv#eaaGmU%1_Ed znlHqwV!@<2x$0MqxgERl1I+}UQmm`KdTsgDfxgrhAru_&=V8b|-}1;6Z?rR9wEGrB zJAFrMQne2_grpa0?rh}2pt@-P00{M!@@L1ldC2GZ6gIFwcWxxx&i+$Os;wC~%ADip zinX!3vWZk)iR8RdxMBjI{#gg*R~lD5^|R&5u&B_w#Z)Dj@exU!F!9>uH&>Hcbk~= zpJB=lKN^;oO>(3`WM_vPi1|k^$JPBRzGc*UG{bD)>Aq1jS23FjKMI3ePwvt)+-}-P zQk%r`%7)*LrY6UACA3O(GMA7*=nL2@b<_Mc<6TL)EUklC5FAS+iwt~+{{V3v@El`* zM>od@rlWbpTp1BE$#6`gBgzWTBC!7e+jULU=U`ixJ-#r+En~jLoVjvmDEi{6yj{lF zzP_lLO`6T9X|=6}A67d}9TVx{$VmNba$NBfw#7rY9ab-+wyE_|C7%-MA6}dSvB?~< zA=@Pk#JFM)MpflKagFOuxACJ&(`IFxhc#EVLIje>B1-9lfPB7G5vl4!NKgBRLDtS( z^+%GvcBv$3_9VOPE0`K8XpR!)9IOuc=i{=|D}$3(UVGCUK1WGYY_lBiw~miKIoA^S zamIWL9BIT>DlDYWmppDKwsY5MV!&b{-nzo&)2zbm9BK{wW?g;$`w@8+0h! zFzi_i5BFD3v93w+6zR2I3wv2c+^KAJWEbo^Wg_j8%0gip5}98LhT7BezS#>x_v-|$ zDOVbLmlKP&3+99Ex9h*h_H(|SH6*qAljD(wimB@P&ldoIz{EvRXE*bk-MMOfGPFP6Nu&=15jN zoMm}Q*p9f>c)sr1_d&Vgn|sK#fvBmq`ozh&<{9$iN%0)bCc|gu11I2E9IpE@@or5X z$Mc$vTd3DjM=|QXUc=;LbMh=*n)S>Q=3P`$V{Y8efstZ`2zoouvd~FN(BRobr@e7^ zi{r$ftlDZ8AK|k~f$ZiI#~X|cDm;?}=Sg=C0}w$4a6r!m;U5Ou!)La>u+$e-h8JYK zgUOmm&Q4j8A?IaiK?XJ;5Jnq2D~Q*$ z(%RYuoOjV7FD139g|h33+i5Z0ZB00Z1i0IXC|W|&M;g`SGedCE&l!$!xnG|79|AW7 zWDs%=D{Zm4g5ud^fNrv$jK0r!yU^vE6fauuj7<@ktq*HQQNG9`D zLxl&ICk?;aLVKy|Gu&_3)QhKBweBTOD{bzLt3)*PNXl$~+`(=BzOjirsmV~;b8ihw zJAg<4063}$h*(Ad1&Q0HPh5QZ{Qm$NpBj*>)Bw1_+=19<;nTj`b`>GK>kaZhRTR97)ESh_d0RVxIX_xQ(3@vZgtRR$y2rL2rk@O6Hy-_=&=N6{SerO)cD3 zl43V_V`Io<2bD~is&7~d~YAriilU5g(0zx;|RKM-)iV_ z_I>#l_LHNBC-gYtQ8m~}b+#7!jI!d$>m$AKPX=+f0oYmUdWD~xVW%N8Ps%xDmQ%`O zjR^~|CLt+SWkB*M9*}&o;olo@pBrlz+76R&Ai31v7O)2m($uyuD7@P+&sa286 zBR4KcxR^swbi+;I)nfUUSE;u71+|5YJcBTkF7D!d+p7m2ebmP-LU9%GdbW!kbRjJS z{N*1p^Jg0IQ}G_I*O6LT*)qnFBsS<0Bvc%up*-*1j(0tA(!F)UoHBSbhaTG6>hDmw zl2?_bxMpb`k!fc`tkMpy<4820AKU>D$^w?VgBdssT!!5FY^BF$jON7ocjI^*fpP}*tSS{@laeVVasUKx z-}C;zx#2v_H|_<%q5J>S0jzgB+hKPA%S6ciUi@GodiJ9eEWUD&;lH`$P6WxBct% zbmF$9P~f7!JHPU|J)L%%SIia}?HtpZ1*=Utfr&w-oWMU@52>72Td_*DSLyy^ao{!+ z60=h2D z+y4N}yL`9F`47fi1QK!k>sLcbxnkwA+gZ6mQKqW^*)t7t#4t%sK5RSjU)B1i~=k{P@T1T8@{L*K7@uIl4zT=t??BwQ8 zncRCzvpJbXW+Q8=I%4*kJA~L@y@uZ7nF+_^O}=$ABe6A~dar%vI+9#U(P@2sG!_xu z!rZbyDZu{#a2XrtrfG;_PcfIOXY$5trg~4KJiTW+>FmYj*?ffP{-NMr)mBs`%blh4OorLd|k4b42w20FYWNHYD3fR*l|CneOtHe77S$$wVc& zzs!v++>dUfV!JsjoOZ@>f_BNqFi!6B$G0lvG57fXzrNMBhY*FYngi@^#OLzs%ig5v zZi{kV?H<;g-!RT{Jy+5FESsmCy>l(Ebhg@!tXVFdr!>?Iqe?67DWK>1Mkj~WoRcZD zkhp9;4kXdwFt?HmxvrIpNYE+V0&;mrFR%w<4l)29*eWrOMN9$%e|ohV34-V@n{zen z#O8BCG-sFWisPDYQ@yXXnOvPK(CvBAjRVw&G#i&}sr)}S(k%_uJcc%+QCVM5Th7L= zE#rH%ES9oFff^inNmJ=*?`~zan%YMuC5SjA0CUc`8+P9#zIXPe2-lro8|NPVjX+$z z@}<<4AOU zo>w5@@C1r`Ca28zi1MGwLZC^E5~aPpje$aWV@1cL72QDq^uWg1&Q3k@PCU5!mUFI#NUI<}u3wym2Q-zu%5RczK8 zan%~TNwJ#gd2PPkwx;bSl+rd;im4+#@;2M!?eM7aVQ0X>8Lok7n>rn?lYNDJn`>t( zIzy?n{M~YMt+aVwsoF@?TK!bg40g|%UT*GiDqdV%rOcsYx@kX4vYK_xOzCy^GcH+m zFr}zRYh}@MPLnk8l~!0#^zG$>6c28Ip19xVC@S)WIma>mO(F8Z%10q^bZ6Por&_Ir z;=0F@bM?#h-mYpTmNUz@HoDW!E>o31o@%}sHyq^yQuIv9(M>9!%cNW$44L&);mdh* zQ8GqIkB3Q$gpGA@^7)xO%AoWe)MtIULFu**K0BOpCoVf@`u?@Z4`#lI>At#i6`57) zW+fw9DKvkUPHnl2#k4WGS9B9On$G!j((H>hz_fx;#OBA#ny$>JRf+c1^sfs^HPB?m zjI^nJV#@w`7S$XnR$-IVV~{X$w)xNDjmAN4AOn%wuLg-avbjVrwQe#KPmWbVUi))g)t^W z#=xjXM0A-QBp?yYhZ(^41MutHuW`A`u&$tyv8M+;+?)G6w0jrlmzC@n5uufT$^QT^ z6uOh7dH$1f@6Cm`G^}S#v8A(XwTqeVV=_xd`DV>IcjgfpHK6e;p|e+5n|f7aq@{<< zv(1ww#(BDQ{%5({q4xLOW08K(Z{KRuu6h&7_7Bc)H=2Ki@+ZkQmvZCmwHe9Jmx-^mx$H5-n?n9o7w7Cpz|7~=2<1BRt1DmS7X$*lI_I1sd6F3EV>6g ztTF)R#xOf)_mAbabJGKUnf?C%0OOcG*}VtRoeS6QTkJGD2c*;7YnYx!bTgS;mWL6< z^#@LH30dZIl4?dbcarJ8mTIk?=Ar3s50=;AknAE++02lpRQlgwqAZ45L$>9ZGLy37 z_xt{I%;VA-PtW7~{r0XzIFJB6L-P9l$J>bta%w6uCm5_hWb8VQ-N)DM-?tfU_B|^n zG^LSOP{Dq+IQ~MsiJ4Tj^Q@d*Ji295UC2U>jyh2-*FGpJoB=-i&r1?Iw?F`QipW%w zpz{9z07?!v{{T@G+u2+6gq0|el%#p7N;@SZ?o@W+J$iMdeEL+&kJOkIT}eq_fxMd+ zy#D}NlBX7Kr~;{%)Ww^vIcoz-P?qZjEU?RMbnnz%Qq*^C z9;$XhA2Iv=2O6&uTwxN$TP|CjzC-Ni@yP?>TONrQsjk?16mpM=@BNAR(6q9jHbSc- zhh38~Xk~GjN}N}Sy@DY|LIG0NKnXi}`FU@`G#xD!S5&$HAjym#{k+55-;{nn)V*6# zmDt$9lFjz8I)Ai#{C_HLF%DablhYN&CI;qeQ?M*03+PyJUP(P;ZZ^hr+kM-o#)u(gxPThhBbfFvfC(QY9q&bt9Jq0Du`CRzMO&N?kfKOn5 ztNy%OK_5z`xNf-XQ!X6=Ou=$%n*j2FZ6xeMN9_^kx%A_oamDbO`W-euxTTwJr1T#z zdf0e!(8p~p?4Nk@kHf$AsXDc=pqD;Sp2xo151}ONRHOYIX)?2e$TQ9R{DPl9Cw6cJq+$6ZIh)(`{dGOkZl2FnfQI5FD`~^n1X-e`!IlcG5&&1Q_t~`f4 zH@et%N)h}5n+2BAN6d!QdnrWr>O1iYNnyi81BglcS@jdxpKq4bEK{~6B}|}n#>3nX z?@tKzuwDf-S(8@lo=-I5{3UJXt(zeUPv#F1*6#8q1~y4z9hpHtnWZ(Ayo!9#(MWrO zarq6X+c9NCT3B4i)d|D1MWm#7jd~Tk{2<@$--p`b83&lKr`89#I0ycol?Yo)6Nuhc zFnj>qd{0_fKxwj-#f;iZW9Cz--EJQ)uC;EWcvMX6IWD9)Zh#yC@W#TiEJ!_2FHe5- zrp(vfTVcn_)HVob$4Ln%_EOo~ZX|t0qm0V1xqyA`@sE7;s^^g%!bvajKhvM-PAKKm zvYiWHq>h554ZC{nu>=9b5XlsTq)G_+?@iAfiGrkq@~0(o*id>j#ii)dz-__d2Z2ug z_iJsH`Ec`#m?nz$#eBP{4pj4U;Qs*C+vib`7e}|dJkUrmcFx}_uG!{2h*jRoe!C!B z6B%$wRd2d3DM}OFEJtyKl(8Yr`xE8s$G-d~<4!x)cv=fhS4dfO$q=Bp^Ahdd` zyldPJy}DPLc;iXoojX^STPwy}v~FV;DN}*>RH(wS>`zLQ^wU$9b2W+^q`u^4A{ODg zl%&o;Z)CKWB&2}iM*aGSemPHz-VMjYT6DZs!$vf_mgAaaB!~|->{cU^r1s@F6}50b zh)JzpCX1^pm{vSS*agNg057&jzDD&bs>dfq*o4&tH|YsiO``0Fyd^0Eqr{EUQWm4> z$1Jq9;8{3i>USEw#9U6e&7ih!LQh^Zb|r9HmGV1S+f0H=*jd9D+fvlx#+Nyp+kRH?{~@fcAjz;F0cjdK zs#)lcgvprN-E|}*@wdB#HV>}g@5E_dOIQdGg)NYyZ^vq|wt!DB+25B0^{ZD$2@Jz# zGM#P6ejdZ!zE}GVl85?=yQ|l@JWz*unVWFg@BKa%x7wspMdizbAH%Q6)M>5S>xbyx z8)1&n+(&;=awz=_RAbL|PsUgvrBCE<$YpH8T(*{cCeha62Y%dkPX@dg*ZfH0SarQt z(8IviFP56%e-7=s^4kSq(gY*a&B~zdy=ZGLb`RodZWg!=8rLesMX z6tF&(US`JoS12je+lZdGXUmNA_Z(E@wJG+#B9$yU1%VEr%|c!71D#tRFSpa1i+C5y zNMek{iUQyO7Xu!UHebTNd`o+AG>-C5Cp(SubDsN?x!-?{OPDQmMdUTHlc>^gHz%KU zR#6q}W_`u?I(^Z+iP&$kIr`@w*(K7alG1yW^o}bhaImurf2?xv<&dW%zbHFr9lM{6 zO0v(^RDE;m{QDOi-jmy(7(BV|GlB4{Q>MDZ&bFTCaB@8>)qJYcD92_TdJaWg{x_RL zgcL(jV!bZnzQGZqTE|KYYf{2gg@9HSxD-0K4R9vArZt|gW{GJk^A!e282gYBmnBcQ zI6bjjPKCujA!u5n-)J{ROW2>3Kk()Q*k!{73^9T+vE1gqtvNX7C!76a(&~vi!%K(Y zIb8*ypvmSKP}gHFG&qhvtLvzeCZ@8UU5iY0GQ$aUNJ_$yw)=7O*Tp>ph4?3lj*-K6 zw-@?!v2({GC)r}a2vvaoAVPUwM&;!oyR4KBZM&>nFltVprlLWiDQ76=r7%nk6 zj=j7-k=&#kUJz8Zy8i$Wx7Jrn)FN(23FrB;!rAixF{?!&17j4JCpq^uRmD8hTK@os z+-Tq8mJYn?(tTXR6wCfuB34-=$=phr0~qcq2-R!+??rV3IMKdI@EjXgay%-t9LhO` zx_3~lsOzxY{^DfFGa0A``_+|?ytIfc%xu1{va+7}qxgHL@g0q~5O|}k zUg^3$z>zFe!mRV#s11~98bE=v0!PYuiuy+`E6-ZDh83Wy35&BOzQ8(gsiidYd^Rx1%$Cp{{Gywn?r!X+x!R>6)x}NpdVcUMqEoq4+GB z83rycDsnrkOy3j9YvnWVaOFHy+sj0Vr4J=r+wmQTgWNB|Fh#)nl$w(_H`gGzl0h}f zJ_5+GG;zmoaRC{Lqe0A|#~@`R5qMJn0LCsa;=8Fh<4TWA5%L>3?crZ8+0+uz$sli z(=4e-k0K97)ZymDR%>?Z%JfuQdO2{Jz>`0_~Su#gbtT$bb-S36vl6fv+ zxPfAyn0diiG8f0&iH6LM20_4e*goQ|;6Y14w79TCeF=3$EzQDuLdjSmYxV99=Z!?1 zoYw1%FDNIcUjG0(N35t7>$iD{Z>-x)T+$ZvvKo&iY&OfT$7)NDCO?SdeM)TwEbcoc zB&&Djls_V}fKXukN5>fL`20;V3??G&%t&LLe0%doDB7>_{C<21r#_ap}|EC3M+)Z(B4ux_2%Q4I2vPxY6V>{DRXKu zyphk0xem629LVdKlV5O~Xq6F8QJPs7z>@|ej;1(Vjnt-)-&po{f*vLKG2w>+HxlYr z%`b_oB(N1g%`~yIbD>sqLN`K_NWNk?Vvdof zLo)&}jH-FForh02XxuY(^mg$k@yZiPgM@;(SvWjxHR!;}CBCcc;S za_x-E2Ey}2*(xoDS5*rB6~hZc>)^t)Z{8c39Zn@^anl_|4ekne+qahACwP|Cw0y*p4Jyw0#sd;Ch?y=i58}7!@ic zSjj~V%sP|zzZ2HK|JC@8vTzCWk6;AJJCof101UrgH!~?6Dy3o_F-ePi>EC~^5haz_ zg9muHWvu8lz|WQeWN+*wNj?9uy=Z;0);;qf&!C06(v`!CYHSx$X!%oRbOp zQN0+!?NoU#DC~D1yRkoiw-Wh_0iA_mLpJ9asV7XeQ&aR`HKo+u8PuHXNcAHe6NWvg zT4|J9VY!_eZD7AwYSmsrOC~J%tXft|c07i{i*GWrm86aa2_hKe9MO@CQ+}juuFNU< zU(DY!^}01}%bj;J8uJ5}>-iSaZ}d(ks^!dSo!am1K0A=dv&EaT5T2~auYjLE5_%y` zoRJ~smhaA5HdfLyxn0y_so&@C`}`aepR#r|z{j&JvlC|~V-d=-OhKH}4!6_1#Wr8!E{SFHwQA(EH_j#%x_OJRAh{`8z+rrjaFDO2{7`w ztRbsrV}=^FZ6Pw!@a@89wYIuo^DbO>$pnvMj-rHik379Q4{GxW=3AJ(Gpy6PJv8PI zTQu(<(k!a;InsQ03)HNeAE47*(}bG?noa$fyR2{ z1F)qukCBpbocuFK@Q!4;meTzy$uuWR`Hk0oIMGbG7EI+@QG;rpU5#Lu?A}FY21vx} z8tW!ww#HXq9TBb3AHYqtapB7kB#>afpJ^c;oCWL&8+#w;@15ylM;n8={r>(H5aRhZ zQ>XbZH=1eoO_5+ZmKSFR?+(lGtE(JaDa3B7lnr&hHGfSe9i=^t5->VB=~E1W61?H^t2dCleuhghxgnA%@;uGV^)n%d;` zdQ{|)^o%-MAU`5R{XDObOyNZuGNZ0yL(Q}A8!w0hPqz^i$6o#R-)!{u=}(DR;g9d< zQ2uGJy8W6<%2Sy053Ra}oTCv&m*n=@hNb3r(zAUrgPk2ohlJ!VUfRpBvccWdG$$cN zRJE;!tw?;JI*>w5rLv3xl{h#(ay{v@E9XAjQUlu6tuD%!VCJxDnV&aFn$QUo{{T*M z1k7H6u}s!F)`%uTW`|nRWMj-C55Q7Id5D15htM|R2HGM?Dm`6)e}!RP!2lhAsT(oZ z{&I4TTX5YT&h_J8vMy8WY~kbhKA2>hpOV^XBQtQsCd!{5fr(1Eb%(3)#LW*^M0KUY ztuCK-OJtG54Q&#?m_~Q+)AH;5#YkxzlcwgHxQ{j*(_lKWeXlrgGCJRm>uy<8 z_1ck=qdLqn_19L^evjq1&dzp5OGM3WG$xvfH^*V5!j4dsmRl*wf++z~Fn1^4C%Em6 zy}zw8C2(`_sMk_;Usg4i-n#z)ShY`4^=~1is9rx$km`18kY{(bv~FBlWG+*~x5+11 zSTk0;>&dfA0nZFcmg>L-YTW`9O!D26D?%|?oBr1$;bPu=$5>9sSs+JajevUSL56D-|(vaPG2s~h{$I2=i%S<+wrMA`v>4vIZoLL_tY@##qIMHw0uM` zljfAEY6V~IaelE0CKDcukUza^Z8Jq|ZP)LBPsnzp7)x!raol*14GyJCDjTO^>Y?g5 zl_q%z9Z0BgkQ^5KH0X}Bu@%{=1;jDpI~+OKc3(?tQhb7lKe%zC>QMc2S~g_v?5arZ z>B$4+KU&&tW%4xPDElf21K)j*<4Listf(#;xMRa&$TVd}TEbmab2*g+J=5Q&LR)aD zJNHiGjmX0cw!+(U3V^=Z3)|&XB57^zKCmz)JNx6Czt4QqLvOv&EBz&D5)>BtdXH46 zI*P}LN8;IPD(~ueca?Gu21ieYMiMuxbH87WJS&)OSggkj1U)9oJ6`tc$IesV!eDRI zLVVS~rwywUcsJNDN|4wV3~}l#H~xaOz=hR0xWuHSyp$Dp>GSS>qz~!h;%lF)SxIyO zB@mol75hp9$bsp{9n>eexGQ^f0?#RIs*zQT+?4K?wiIe?DAHMx*(uvflr*tq@ z*a0cn0r=8Cpn0DzBl=OZmdW<473N%Ea*uj&#cibk65^WmSBA1S`<^h;N>0ihejrq4 zjvmZZ{0%I$+oYikI_!q~EzZN`1F;2tj{ABJ9Yl=gONEX%#uqvMU)0no3ydU8(l1l+ z{C~AMqA39YcrGchb}3tG>FWA`l1~2sek<-3;eWKHh|WRnKy_v4a6SF$?NKqfMG9^_ zg0%ou=AV2DWPa9B1wj0^!yIGT@}*t(XhBc*O6 zj;3MO`^$%aF29v(N0-}(Wi-F!a3FURsQG#^5z*AN@?@y+&^GO!Z8EJNyDt!UYdlc##FQ&OK#ktF7kL<7ImfRsR6f=(V2{=$1S^7OSq@T4^x44=y>_Ly!RIj1_|X zLSy>*GUtc&8?8!9YZaF5!+M%9WZyl=$j{BH)#;{^)6sjbM>@vIR>h5%RV{=ofUrdI`Xo5|yBW9Gy2S!qG0-XC-a^SuI(==}@Sh|wn z>KvQI$`C0%LF!2#I+`VQ^>~f2l9hHLXTS~m0Cmo_>j4ZH^o1$1qHJ3GvbY0IA;1Ew%lQ{9$IiVf-d4g!}ZTzNHLV z^YC98#t#1g(xnPJnCXVo1(e5SPBs{Y2gPZz7>$FkpmhZ;1JBQX2<_xKcRbEM@j3hj zPl9w<#AIPf*+zPMntx`wtxl8a{JiMZ+FZUOEvkyPB^a=uaz^pQ`HOXx22%~ibtDv( zD{jNrjjzMb620*wi(%m_Y2dT9X+upjuRMS*8_SFW3FjLf@H4rr@i!1y@HY(2#M8ko z)ZsZ|jZZ9je@{D-4mkRlKh!Y7oS&J%8=TfAQh#Q z9+dX-9DQD}(d=|RGT%zl;z(>@K&q-aS7EsWv17UT*UpV+SG?A*rPOs7GF?dJi6P7(t=ap zZX`TBut{+gK77!|&LUhEla)ydx#(DqPp6V#&c8bmCM0tHd6cRF9mvR&m z#~C;k^lzkGre;_R7=B};oW{`U{-Rpp3|Cyw#VBocCqQ+21Bhx=9Fp>;{?W;R7EcZ8?Tj;Em#smjTc4-P@Jo z`&;1G((W7Z9k_Ve>--z8Tj~5j_KF%yXyv-oZ_weAXA(I%WFN#;LQ-F{F_3LelXFd| znI=hdqdAnA5^Xf|5>dJ?}8aWSHVU&6ZDx{6U>}yN8o?}Jz*1mr>m^(S->RFPs`#jIF zwMEKmt!&dGQ`kO^dP}MG4pPcH=BC@Y89rdB)o#R{rTTjTQRB#% zw8N*(^$EC$ZJ5kVMSJc@$8og2-)4h}nPa~1DGi?qT$bNdveLixh|%htPWdPYGuzq| zxnNiUG{9^d9$Y_g7WIzhEsmk8A+nM=G`<>42Pc+0i?tgCV5FE~Cvr39O`ll{=`Frv zbE>XIF?}@F{SC+ISk+r+?eVqC%Wf>^&AvsVQ6~0dnDY}DZd-C+5!Cyxp~VC;8$m+U zRy((bHYwt@yxI>EJd;@RE3(9(1S)+$#K9rH)-Xq0oT$O`_lsJ*o)3ulqe6-`)ns;# zFE!7oFv}k(5zN12wnq30Fi9hw_5RSWXvUxCbx`5+9etDMIpoN<2TiSLaQyC?wRg5l zvw@DLo<&04#*EW2AVQ5fr=Y4(jkV*)e4!?Nnkid&18#DTWy&f4;-D2)K$4KE=y4-H2s~dWV)mjwo6NG4=oEQ zPfy|S7aHljKX0kedBTy+7Y>;U#4aQcBMzL)g;S2F2PH;1j(Yth;M>k8eJTrHFMD}- zhmbVJ1Sp73{HN5wk+PN?s>}~6TTZ>?buQ0h#*6RrI8d8cJN_tcZdvSNe z{6(zrwyPeupv-OcSVIWp0a=rn6(xCt0N5u785zjIt#67rOF`o;A@nXGhtJZbkse6- znFEv{faMC3rvMS1#@^UwX`Y<5j6+Rh^~#4?jMz-9#v(cHf-T|j6lk7K7k=Xx>9ck5cwBj(s1-a~&Q z{hTPCV}n3p)1_?dD*dl7r=kAdGB(&!fE}xIPAl#R^&i*v;VY1OZAf5Oq1w8q?5Os- z^DFF~)%iJwlt`1P8ZDLy3Duri@3ILsSO$3VpgS73CZ>4Bv}*;=>7^xy5pN1HT$s$5 z(opj&C=qA0Nl!5Jws-HJ!}sy0Qf5)U>rSs|C$}HkEA1VA;)hmsh5a(oD<@w>eqJ;! z>r59;T&-J=cu?~zCTBUAYD)YCqr?{TU5DbMsi@5Z(jB(8h7t=5pMQ?s`s_z+WE>D_ zW=?OH@Auxh63cBzLRn$9*=+;mX{4pJCv&+W2>=br-1hExvI?O@hx~f+kb6?qf%{!(;#^Wl@4s!2-|zYGpfS>hMK!QEq2<-FJ-_L{ z59BuB8cs3aaYlpNr@13z=l1&#&xA1L-?b#1?0Wnw(DvShetv(M{P@UT;|9m3f9q*w&>l>HNRh!U^`JQCCsaHY3lz=lb|$ z95&RfWMjQ0y57NE`~LtZ{>O|t$=a}|K9fk!q>c7Y=YGS>Z{6v{eBkoQ)84UwcA|wV zJ&D*4GwOeLrwuXo=~x9uCviy+$Z^zBb#K3Z1pp1JCClz<-HkWX5?aD`GG#|?Ywz<%h!~%WbAa6<%)VVf|}f)~3s)xabEl{Ca+Zl;pf$ko&}*>e(RrC-9_x;5fKd zC;YQyUKV?V6 z{(_#iwR@LX)b7Xf1F89cGqpJ^3K^`D$~R8l0|^7aUg`?l@&Iml)3jeU>sVRk!GBzg zeTf+UxD~K!e2`graqO51K0=yGN#Al*qDTYHN+)k2=1JSrjqf9R)%u@}8C!1u0O8hv z*=0T=(b2Ng);ksX9-uuBmkokG(CBH>qPRQH;UjJ_ZxPG7l1Vww%dq$gRotV?jy3=&7{|}K_?q1jO~#z-jwmQH;*{S{ zZlE{t$lqhIPk+A_Hz@O3c@gYn7&+eqzv6mTA~1^N%G-rG$G^AbQm!#6QrUUq)~=Ta zPs%&}Pj4bmkos}YIJZxV!s^}#z+A_^`~JZ1TON&dCDc;N`5O|eK#Cw^P>zR=QVJ9^mAPOR*F(SkctSb_ErUi9IPU2SAEl__1il%#ei z({CZ$hFT=X4@z&Hhe~xrN}X$G6oNW`SksLqNnh1F5wf^!EOEG!GDO3n3_%CrM@maP zj5$~Who~SC_=;M9$`~qKc36xy-D_eyEGX^jvfF7perJd7XSupnit0(HZh$Ck zK|P9qNcH2TcygXC>o@S&a5T4&XlU!_IE+UEL=USny5O933QHcsw9YF30Liu%?{mZv z+sml3o<%HLMq|^^4tn=E6xq|M^W~LSCZY^j3rm2;@KRIZsGW?L&{7;%Ngp934m&4{ z8di~~BI@T+x}R54xR;!R%mDuYEeJfLKX?F5XdEMRe|AljcCg20LCRobm;LSBp)JBJY4g(>k&{f@AhJt$%d!9Vma@YFI?R%@wCDqwKZg(!kb^y6Ox&eym zi3~Qeh-{-sAp`87{>P#SBJvIshdee*Il)C=5&x27SdaBOvY`E zi20SWx{uS>(7qD=9pUijUXzILHFnijr3@5g&iC*kJR4vY2Jq}B1CDNi#E@!M?Yuq6B|k4wS)NcvdTTGCX~zx+lVtJ6L3 zagO-M#*y1f5SGh|NDe2h9VgiA*_B$Rn$d%VB2dEwTj^7@&rp*h-jQ1Ja zeZLQtDZd%`eh-P^Jk*whvEGdOA8FJBvHU+W7KH*7l?12}6;^?dc!|P@NHPd^1UlLewlLtg}+7b z)(}%&V_$nyBgL!9uzZHzvUO9=K${&cOKG4~w!)GYg@8vo<4yvHjku3T)^uH5S@CBM zUkQSwg_Wa`d0rc+V|8#H2{D$~93E0LU6;eoJ-gse7S!}EBGTIDg?NJ1qFEX~La!P0 zO9ZZrq@(Qk2X5-h2T zYG{>@WN)fTQ|&1MLP_fY5x*XH)I2}9@x#Y!t#(^WZ99XsOTiWEAb4-J38MtX=N?X3 zp-?b~KV#FH^vd{$XW*BB_O>GO=KlbTHLD{vmoZ7~>>!YVFObB#8aL3W_#NAIpT}JjxT@FbXk~?dsXzmC-UgMLP zLlOS~@JBq)*9a@nd|&jJ@UunN8%DH><6AJ0&v9uGmfR7HCBK=;=E^hvZ>A+X0_KV6 zk2ezvMSf<19d&-Q0MqwhkwFFc_ikir>sjY8sCaFsi;xip7X(YJe zN(znN8TdO6nZg#DPK7`Cp0NNj-CV^aDQv8Fk%*9qB8DZv=8@c%Bb7mH3SJ2Do_$Y@ zZuPx-HPbXZj##ZNq>5&`W&Z%%QOKnwo>$4`NYDibnTTATn_;-RHBRmfY{p^2@#f^W zb8~qTY#A0*xa>Cl>2aKv61Wui5>k-KR?fQ{scH$`J-9}lZfxU!sH;smB{_Lp4Bav_ zyD92A2HL$Rbbhp}KCJPfuvjEsYC%?|zlWA5*%CtocBUq5*oac9U zVa(2OIt2g$Rc4PZx5G788`XQZ(9MlDR|71QUc!7h>TRirU%4(i3X~(Z$vq7cLWl)> z_Xnh3>GA5?Oxg@%nkiu^zsspU`TqclMMnmhi z@h#SjWG@}Gg%>A0qpv9Kfu7%~&3&ohy;co(hOITIKnCU&b~wQ;jq_7C8l`PDt;U;o zZxOcFuuvUnO7;sKD+7N;r?L8uG8nHyMJ1J6?ErpspB?8b;I;9IvDWx_Fu6%=MP=6{ zNhpZZO>Ur-6u5){2_%o-!_KQLr|Qbwn8+PY!+icZG|D-SKm9`tuT#)()AXe@s3-*_ zg(Qu^2XI042Zl%>;Pt1$3^|nLO?$>GHGy%kpn~E8)Ou2qpcJJ9^>l&0mvOE~!avl)76`PUpW#J%@fW>gjIxI3*Bv{*=ql8cHH#>Lc>`)IBp*yj+GAOL7q0 znKK-Z7Az-}>nM4agW?SLJ=?-u*^GB>C23D$J1C@`ZLh9gRc7W96WgF4%#7?!FqaX_ zIEBd!P5@Ki8NoQlNazmVjeq~w_-?RuUlEO7#D2NX~$R1csX z{ReV>yaSXHYdpkM<;(tn>en+`ffr2la~X3XzV}ycvKwh`{5uiAv1n*ii+s~Q$sSL* zV|c|h7Myw4T|O(J9vdie#U&-VWk`?l4{y)@{W1NC4}@7qGVM_%i*X{^*+YYC8txP; zDez%lLuy2LS5cu$dMg(27?u+$m^Nr+Ji=WGbHZABfIEQluw~}#X$J~qb;j{BmAfQcHv6I9391AjCxHNNe8!J z51-UEJD)$c{=6vU4z%V%jjM28>D#{h4_^NOzlTJbTpGb#9MOcR z5&l1?hXxpJ(wZtkuR?;ocmDt$Twy>1(sC;VV!iV3!n*B8U8{I-C=K=-4&U_QqP)K< zL-QOC!o3Rh_4NM$rw8(+V1u<9j%E z9f2-HNK17olO>3yZ3#~>(JD)QN$MkQ#|h;b$?Hu5z?_})Smh8g=5Fm6#O!P>C>fCB zRQ8teTd$vC5j&;1b8DJ?^ucxAg1j)|$^qDu!)&S>40(|C_*3DRsoc_a@~B;t9OKp2 zRj|mz$I0)PKcglq%<9 zPfBf=%6Y`0y}H($p3HbM zmTB!^UBnI8L~3IV`~7S3BAEzb+kV)XY*h^Bs=} zD5bI~A-$^(k3RnZ$-)XS8KrYprw|l7k_aAq_9O4ZL<7A91HC6Kbb_t>4*X*~Qbtb0 ztw}U-d^*P-Uu3|C<0u`#T!()E@B2!1;oH+=`?e@h#cvcpdAC1~{{YIhE0_Ak+|%dK zrvv0YBlV)lOF}#9abK+IX)LGJOH%hzkI^l(l78flCO0u~sy3?S3&_R3*4U-`<`W(w zlr}OX4V14&o9t3I_58lSml`I$d~UCNn9u&29D(s~yx-7#K6SHckPB;JD-Ytyzv0+_ zU;9$Z8jRybw~^u`sU=7UVnRo6o6~+OV7a)qm(90sSuu>%^AtA`l$>({dQvruqN?gN zxKY{Nren!rmy%Y%bR_hxNhEdjCQ>FXPfA`^{{V?wdU_5XiAv+u-}LsTXK=vecE`y3(uq&&$m=WEBy}G( ze4}zlVmI{rac=+)J*tl6^067sOL#bWFrO>jH1nYh9>8ut8veZ_%YUyN=fnnrT}lYz zBkM^XU*viZpL}~()59V}vX!JC!)C(&08{eqnwsIMpL1=t$?=w;+Sj(gB_ss&@8`c7 zAsE}eY#U>4wJcabt*FN!^vpu#OHW;r*kMU9)7Aq_Dc>%)!R`SkZ>I=#AB|>Y3V}iO z9<+?pTd50z@|aQ*R9Zj5xRLmXN#DqJ;|Quj1PoLe2~+7frxkO)D*QpWj)C)ovXQs# zZlkdrN1b_B%O7O>Q(?KAKYE=_I+p?nNJ_gUNd%C6Pfyfv#7Tz1`yh2b{{T8_RwVS^ zofY67j*x`(s2|pLDFe)aJoe$aHaRCb_NGEH_28>d`?Y(fXZNAbb2OJfqI-WMoq6Z9W}dmP2WY8OHoK zUv*uBZa>y`3O_;Hk3egF5a>2sA#KDuD_&j7`7+3-nNbJcRKU(Xk6Pw7TyLn{YcgrK z%LFJe5l+OD*tTkBa^ig(9we-G!p%|>&|y&&N@>pBlDSd=Z7rSqpH4XTo5Na96x|4H zHJdvWgy+t_%uK%#6n>(^uWH3UTsc0Os0(|^4d%K|e27Vt2eFb)pD;3g$Q5WX%KJKKtw_sN7Bu$~JPNw_-ChF( zY|>Vk=?$fO5x<$=%<JNJjo8)y$aZaD7EghnTNiV*?!pcCH+^ zz0$43{7TU!;U1V`T=K7Ad3Fcisrb~T2`dW@j}0v?8y5C(Inb}E-{nvoXc0p5DL@I8 zPB-Xr-A{4twOq`6r{{KGEr(;0Gwa1WcLo%c!d z;!Jj?Ly2ULCQ<4Q_J^&3pq0j@{Cl#+D$L=vUlV?X& z0`BHI$VF5sh*Sq&Y#J!7M3J{;IF`_qgV>HJ=lV(NP-u-80ca^6nF@r8S;~mv zUVx>%DiM9cmSRs@xr@OYSJgvthOOr65;ruF#2B=V)Pppw%-+R+yVZc1gSIv zu;+dveI~VyYR(Ne!sxHGw1wJPZY~6EaVICJM6oe!L{IsIzFAHb0ypT~3-ol-G)ZN= zdXY93}ju=h(TGLVpks^1xgM8Dev`aebV%6LRZmP&IYB%ow=%rK-50lP@x1 zPqwDoMCYPC7M#a``n*KGl_@T^kd-AWB=NFC^uE7c2HMu+Kr?YyD*4h!I;ENA-HHZQ zlryfy2nAT=5&#uaK8jjgy4=?m`oM!g<{~6`ovubf06!}%cvd{z;fQ4zDhZ;zz;g4R zXkRTfRJwu9eNC1HN2qc94Iz_NGDKSDZJs_ZPk=>`x2%z3m=YBtO?zmJ)PHI|UNa|~DUEUfjx!Ff9LXCuP5PTHk{uuDC z-%Y;ab9uwCYC!!+MCLfejsAVJNOmDvnn+j61eU`w-K&55@zpppi!@$1;rMu)L}{bb=ICY%9E+Zu$<9ia&!jN~`&Sd=E(h1R3y3G-ja)|h zggsoclnjRwUM-$y8t8TI#c~+Macp(k>RmrujUgWE z9y($)?Y2Q~I>>4&{ouOmeKg zBIA@D+?wn@8R`BK>byKO{aWLQCGiGX3dahvL1YF!IONQ-zhI4?W*a4aAo97&UY%n$ zIyI2taaDfKISy&f=rUToVyi5#vYM97reB!EjJGXqZ!F_HTIiQ%W7kJOLs1)XWhcd) zZO7X05^8t0xAPyWNWqXJGr|#1qAPrWixQENRSUa%nnoC}bohVa-wp8QnQ11Hc_6M@$n>j@2{sJ+0JH~P)YX)MA$KH5()%Izz*$CS5a19ohTF2i%S zd_~lB?jN#wZQ(L%S21}g80IL`am*C$%t`d91hE-DmEY#WS2WiB{D)C1@yd!>7ckzR zKQ7DV&4n7H6@v-4B*|{dlW7bcCU9MtZV>|APIRH zw#u)!yB&bSi&%LP7ra|r^j%u{JS!kTXti(zAX_7l(vw9sVhoQgpzko#m1Vp*9}mUEoI`7;vVCt>xtJsnX9!zA=1O|`agR|0 zuTO~kh`}*NaC|!)#G}YE+n}k3S|paz%3fS{l9ya<ua-YoWyLBHP3lnC+9*h#z!hoG$nq zWSz^mih94H!9`-Bx=&=NfJ#EY4_4i`>_{8&kZ^t!mQce40zNdx!*X+zIcEB4ZYi0J z>Y^o9P}z+d)%cR;Ly=`twJ+i_Yn?ID8*%oS3r58$Ad|%F=moh6%pCjgkO%}R9Rc5b z6Hx4=Srn9BQSI2AoRE5+pM^mB*{wM=e4c|yG*$X(`lXRSBrbgS8I@0l#IFcVtn2tH zQca81@n#}eu5E2ed6vmalhl%Wj{|Tnn=X%Y#++=kN5YoMxK#yYxM$Cnu`v4qnM{6Z z1r?YBoE&h^5&TNk(}*p28^h;{P9~Z{9!;5T$`T}55rJ6>D+yXXm@4FT80AI3HML&P ztm{_mv%IFqm>iQ*^Xfdx?=XKMlIom{nvVf^%>_DKdMy)peYkoXA%KvmPDXJ+kmnwd z{{ZR9@t;A`uPkl<0Kjzn8#y3`-CROEjB6*nw7pe~ zI?Trt%CQS3z1{^(`WtBPEt?9E(@(AFZ^lqqSVGEHQhIL>eG_;d&N<-X0Q!Zzmhh@> z&`k`9lJX>xk<71>Ib>D<1g>Z~AAWRtk;rOn)P-jc-Gf!ossTO~cU+^5l(*NgGc9%Ca~ht3XaLd5*=q z2ATBL)woLjJr~8z50X~4j%B&AVg%9372=XOW@3(y6Nd8z!Y?o@$fqio;|k}imCj-^ zdW)SX)=Wi-sEXpG>Aq@Z;ko6-+>V7dhifYV5Aw&6c4EnQ(C08buy<8KB0 zP4MSTnYfolyq3!ZeP-ATn`B&lr;-kGoz7%b#@#cwq&PFj9}4_R)FMt8*DR9hi62+E zZ>!HFg9ny1pOIzQjCoGr?~LOWH)K$z+BY8R3(9KQn@G38A*3|9DrMy=Y9B51gelPJ zBVqCsq$k&ZFBwcn3;ti(A0KbSZk_A6U0FJ)lQ^78AE&omS$}eZRMb76Z0vOw7amwc-{P+;F8iI6Y~y zKM`5=9l-7Re~$cP)y<8uSir?uzE*ir)P8O4s^5*qG@YZ%2f1$P)#mOFKh z<#aj3D$D#<>E8@QZMWH4;l@_tUUxjDdJpTrw%^w@`+p5EJO2LwU*0Q*%_KJ38bAqc zw516ieJMZ*NE`R;2NnRxJtG1?=}`|{p0u-1S#x_~8m5x6!tT~$l!$dzFyz?S%vunq zTufLo8+uFSrckA7u@~3cl&Saw-3hU1}Q+W7&L!$g$e%NI=CUhpMtd!6(1x`TqcC8C{M~O2NSx9jkIw2_w(%>BF4B^yn!BU{=l!y=fJg zS8q<=ySLl#!U!Ym(s4ttrD$4C=WY9MxceVYGs~4A)_kxCZuET)mwR?d*mw0O{{T-XpSOb?Hrz z4#tQoI2(k7gzisB@*Q2&N7$YcaNT{WN}*R6*ilalr0uX$RoL(8x6u0Vk+$8a#tz*p zTA4~gJ;?O!x&8kDml)-&Fvk6;vd{+mcOHk!f3f;;9o4?qddMR?bfV2LmnBDRfI6OR ztF0kTl%(~j5J(>~Qb(BIeiD(1Bvc()fc^dziP>VedCx^sf4A#WOXyQnk1MD)hvdde zTkZ?J*7DWrNI@y{`VKZcgKz-q0sK1(()mi-u_pkL`1K}{jCF}k#&8s@sidg{5Tpf! zkO)3U!yx|t6+OU$(o3Py5s&5n05sHA?Dr{d-)Wc+&Yf}sT2etN4J|E(!B9`(NgZAP z0N4j|e7NRu$2{xIh|bydW3g_B^R2#ijxrFiRmR!&9lt6xREW`{$#F?6J>r!-oyt|< ztRYE9sfS&ZxjO(o>9o3!kWAY_ozKFXnFFbEV?ioHlH6v}I!^sPMM~LU zMQnV%INJDP7Kcu5a6>e#clcm_TU92xD#>;NkW@xGekc0U7W;SOV(V1mo|VXQ9c#=v z8L#xUG+vfghZe&wc1vwFzTx6GB>E097!M#|PDgKl_@y{05mE-^WcvzoURE&%Od|n) zJQ*+;brL#)obgq^QeR9l5);@fZ>q@L{(Nzrb~d-xt`X$(oJex{&U3y$`1JfMbFg)m#wS(e zQoTQ~)7yzUQxa?O*>(VbzwwfCQWOFYy&BxKnhXa zXlwR>N{@1T{#+$oa_zD2Ocf2DWAdkT32|LflF}SWJ)Cc&@GX063G5Vh;SM>D)Y%M! z2A)u2DqCgN6qT$iWioz8yt}KXZ~{Q$JF`aHRCz#ZaaX0rmQuFSx&b@7NLJ(aLVzHG zcwyCDdG`!YVf`t!X6dm2cc+z1?Ub@2A340 ze>4ENrhajOwRYQA6b+#a%AOtVLWOWjR511?S2wH+oqIk^CCWmM*Gx)lpE5ueVa@V61%*l3GycWrd{ z36gr2!0(a(18R}5?CFfkJCN$uYi23O+HyR!B1%xhd!^sNLX_&dNb}fl#+k<67hd>l zeI3TG$$wy|jwFDzS$4ru>I4N`f_s{?(RjWtDUG1BCJUli6mS~~I`rQsA0bX^nuxI7 zSc4IUr8uPrWJQdIUvO@B-D%xq5;r@ZBkCHirL4w@sN790nt)a*Bxw)N&{ReTPrW zr8r<>bB|ZKH1r`}Z&r;^V5dXw09;=yAi2j>B? zxBME4@k)S^8EEsrD9HSAQ>GVxbCcCpQZ?cDuc3&~r6_116Ve+=1Jj1Ctzrw%nZ7vX$Mels&10xRF?p8| z{2Mh0wFObEKzhP;W4%Xu{{V+ZO8QR4N_I<$>tV#F%cUJ#_uO#hxq>@pj#y(apR`$q z{{RFXemOY!RdEj-;nCd(`a-YfSoA*F8Tio~d@8EXAg{NnZ40hLi+1qJjwCrFpa9EJ z<~m+{g0Z^(U=NoYK9$6>+i4T&^0bY1R0v9*RZsO2ssJY)HZ@Uup>_O3E|n%GUvlyfblnKL#5MT3p{7GbiFi)RD1Jm_d{9?26S zy9a7th_$raXr75U@4F>iK8pAZ!iyG5?t{`KJhv6wuW3x^^xZP01B~4=Qh$X*xt)4t+lh2ZKGo?%Ar>Jzbh*l z>Noj0`tgZ16D7bspf(k{g8^b>C)&WX3|=!6_CGXyqN7x-?jrYD1VMIz>2csM(vI3qbHeMm{{ZuKq(Azb8^~jWQ?`k)326DG65Ez4tu?f> zL(En;kzDdu)CVEjqg%|foX_#N+69t*)xo529*3;D|ykE)WTEZrGJS_NKjWD3&W2IZoEyhyVPFe z>ULJZgm+L@MgyXZf~Ypj9BuYNu5aS!jrw%JezF@Vfvj!$e~e7nQBZse7_u{wMT;89yW+_r@@PnS+=0c++|8` zA#rNmZhjr7!)^?_;Z7!I;x}0|i22nN23Vza!7@qA6!~en0kO_UU^mlzOXG`9IpKKY z;pmZxL&+L2$CjL=ub9VTN7x?{K;#?zuepd|*EwG`Sv`$iED0%rrd+b%uS%1g z>sFvoPmM{2y=0FPM722}qECh203*sQC6|k(ks@8KG`KQuFRl(bB4_)mKg_t40uew~a84_+ z-psy0pmOO&GhH=L5~797PNu@~@eWQ0itEm_N0Crq;0OZEMWE0JTc}Vr2fZhq&@D->2YS&g4i1e zWmC<`oSvQQS=V*TO9(FP?Vc$$)YIj;NE$;KbU;8QhUlfhQp0iAwrY>*2AO;dUgheF zFX}Z9Imxl(U#QgWIT|#a9mglKnw)~I^cNtzV#Pb+zR{%?rAkLb&61F&&v)ZKBp3V! zIA`kf>6#6+;jH8#nQr-2i^U?GFjFRFfq-bx<~G5@SC_mm(O%!g2>6~U;nsMDdv^Nl zVYyz<%ym_`Sr4LFRUgZ_O`L`-rMClu+}QGKt5-bdYQCT1^>$i=62L{&YTJZFbqr(J zj&&+S(JQ9MYpg_MaN+Q~O5$BsNUUNg)>5l5^;}x0 zQt^|HWs)$m0CxnkjPinfY2w$0Ttyd)TBi!wESIsD7f~=$3R~TJ)g3_ev@A?bkMye? zb6`Q-Zt zJkKZ~U@}P?l6N-WN**t=@e{>yZ^LpI(ClD>!rfXi3P$5i^Mmcb^9<`!*{rSkdMChrPMi0+UcXw}JJ2mr|XKk#0;pm@8b zUh3LNx{lvamfm|=(Mj_bA21>o*(NcQEvt}LM?e&^u_NnO1-GHgu}VCz7MkqJd6Cwi z*0Q$jA<2g0tXR}pLvV*Gt|O_XCBzZau-pQZ$HhJ(v()shV&hBI&@JK}z$1{2nOzud zA`o(ixIJ@UY;{{V$ceY{n)HygZ`_bD6xE)~zQ#zDtX*YKcnvwu$2^dYI*#jjkuYR&8}U$n<1 z%5*;@(H>YKa*;u&x>j=iBFwZ0NHhEcnzl6t24jq&Hf-w-Gp*WqZf@pIMUisB`&gE3 zvWDZ7Ky(k&Vh7+xJA8WkZHkaK`TqX^f1OVM0OdSri_|>GXty`|X8hSasB`zF)qKq9 zWJX>q#qo_;%dyNI-Exgj4W&62CDx=@BNEE&o=-==OOY+jiDkpWts4wS-pBGkzsiYJ zk&)8AV*0k}+rIw*PcQoK#i48uS4xYF=8i+MpIIdnD(B9unuNI8Cf3Z60$Xjo+M0c~ z<-~QF4WagyP_UH_q!JF`k-`fAa8BP3>sSl-yNcA;PUC%m1duix0(}7T8=f6S1MKvp zI6L&C$XM#_vDoeQ-~LC8^Wm`FDQ65eqrHe5pZOolhZ0^*$4_b%w(DDl-kf2jFVkUI zKN|Ea)OY-k3j{g!Y~%H;1MOLL9rynL1BVszd0S?qe!qIRC0q9gWq(2b-W^xQ$8k&9 z_ZvMKO8tC@{{SD!!H`DuqP>l6@i*Jk@8`nRnMT{we3-1&)wgc{0G}8V9&DOO#&@8F zZ|AoT^N#0pLkx7S=~|L^9sb^5`*D(>^`xog`BH)%B_3O-cKpa2kVl_xBl%f7bgVWy zuS#`TVlTqO>9aGDV$&M9w3}2h$Tp$ux~<49vcHI3Qg}&KeN5pX2#+ah@yZrDM^5}N zlmU@V<2#SFO%;@$$8E=L_uO{#1M}k})HBf1ml7XV%s*Nr;sq4`qa+GF7aX{;foW$3 zrgXZ>Mx)5Nu#FkVVN>{gh+tK4vggPv&;2y3*$2S@KBF=Z&dW$+GBS2n%t-emJ7Cop8aghT@gd%Pzjk4{r;`bE~9}K9!_y z3GR5=qmDI|aUpQr2AR0cuHcM4uC7 zeln$Qqt*HE#1}D-Nf~3(qZDzvoxA*L(+N!|r7K7&+q#MA>id32ej&2B%Xjwntml4F zO38{EaF*UsO80xf2V`zMx=*JGSqT`&N)N|zP73zd@;H?`%cPFUDo|eMxC-;`M&0{x zhj60|Gn!7=!2=ZZk0M)2LR8^eN_SFRY!VOqJ|cUl53ay)*kD(t4M%KeZj|JYB_Sok z!$Cw5xamL0du_r>`IrQd0nWynV}YCv>0+^K>JJjOSto9kxDclRSCJjhN&cP}I1;ZU zfHpnHPmM6XgO$jq{FmiOfc$uFHyLinakA^E4t%R@fRLWa1zY)(+k;123oSw`o5+li zMo>8-BB>N9x*0Fx~Gupg1>=H*(GDdoej`Z74^6Y+Wn@@;iZ9*=;)}+4s_KvC5 zsa*}W-%CxP1sdXE5C;AIcvL=7JhI~-6GI9FK zTYk>Pv5?#-3XXg0_@{(t3NLBope8cN{{WajFm|Uk_O4UgWiWCYR&eMyZmDXvx~(gPNg+WUExw9}BC+7Cd7aM6 zUgyh)eCEd@N6xUYi?~jdK*h>Yx zJeMdQ;r{T!Cp`w+0bL}-aBX0nSbh_LV05h9Hl;$OkBvO+ma5-Q!ME-!+!ZOD;ZDS% zDo*|UhkF#7R2w4i-`cJPh19?@qN1MI+>f71r@YYecbUOlES|Qn7=IvBPP=)BRlK=M zfg)3hM08G`Qqztt4gCEeBp)q^;iD0h^Em_Xs%=+BodA&)OXGD1IQgFSL~~s=$h75% zLV6oQ(%n%2s*M}mGG+>dGG9UGHstN5cZO1|vzB-S> zg)M5Q2+cw(PeBWoXl8J93Qn$=DBI1ro}$YV0=@%Q8EOHSJSk zRgdIIlVIbpDhw#Cmm$HKDejh2X6&wz%W57ho}iGCxZ+-&rpEd_n&J%G&QE$6#7Zu0|}RMpSuR`xDJ0EN_f$&Q$CTc`xb3^r3G6{)<;$Bk)rg zc(-1XJwHfk6+=aFbdoW;^7k3GwT63$xs{a6uq3O>2`ZS&$|$RhTje!aF+zRS)ym=pFPj@aD^cG|!}W z(lW_7hm1I(-ulAVP!Bzwm4`n&YWk8g$@RIev**UMEb7tA4=Odpj_^ZNT#54b-HpDX zV!YJz51`iYVnt4#XAkS#%PnlpY^&6_W@=^LHq}*RI?6e6Sl%^S<=4uX&fXf^S>u~r zcvs?vjSaLqR9cPq7zQ$4T-r$|)$I;4mWe53`qb-@=E)N}BLV>;zNg&rC(+-EZLYMQ zE3o01JUD2C7M2&*R;<@bc6+CT%8@N$UrHPhsWLk0x_}PeP8p1nX_|y7G;&+Y%!m(`Brx4W6jdA95zPJfvm2TIYq>wvZ9$WZ z+G$2#ZE2>tq+Ch6#muiwq+Dw_haa@Ns(QUe!K^B8A+Zz!%$TZL$WqpL^A*1YYjW|8 z#|A+OyPC>p%7+n?61tBuOOSy`Ws!p&f#`Ryy*vlwmj`jrf;tzD3m~x5c!Ny0okJ^1 zBDj(wWVVybQtu=)B(}kjVVydGinzM9sQQ(xdY5&m`NmaiC0_F?UN#w0il<&UaHMZf?rp$lL}peh1u-P}9Du-)-oI_Zu%U1Cuq;E<{ZrZDZk3wqgC zd06GoDBG)?aQg4`I4GgPMGgupQ_r;>vg^wYwg?4BeYYoIJ8nrQg~uDp+>wm6H!QKh zo@A#9Ri|HaOgji(F_%eYp_I&%D!D!kSx!o~#Uj<(Nxp?*^fsJR6*a6pWQU&pOAjP> zPg&opcyp!edh*@q(J}u32t-#oWeXj{NgBe)7>vl|a&oV!)SZtg$De#^)Od4C{{Row zO0WK8nVvC#+|pVsQu*m2T;e6?&Q8kvPCf<~F*c3lDO$PqH06Td*^Q+CJ;~ zWRqbI+umKN3-KRin&#Aoq`uNzCAB58q?5k=;^v_Y`XoFlHRzj(E%hKC)J6ceUPh0U zNsIzqg2;?Vs1^W$j(Ol!g!*>1FBh8`qT!izsd;Y8HYQ|rk-a~E3XBz)4b_5^gHb;w zy478-8u_nUxhFZLwQh=)tbLjU*2t*7gN{bFnDtcVYF<#3&1^^!Hke!vE5}+^N^-5WJBNsT4>I$8x6)+?u1cGz{L5F<>x^8sKg_| z!ZX^1(rCuHh{{YlxY=zTixF@f^3Be|tkLJ`iu)6l(qh-%%8uzQwnBUv#N$@*)5Ja? z@V8eoU+}%^&8X>thck%ejg9S`WABTLKQJ^S?ayf&pb{|8(EbX#(mYh~`-i+x(tNuf zB7jAwY6N;$&xydaxs|i%YkR*fl3Zmi?xsg3HNd_!G>zLa6DY^7a&0-zyf^G}%Br_u z$ETHIWPC3nq|5QUNU~teTNm)u;uL_x!EGzUd&78xln1 zNDvP)32o*^R#0GIH|Abe9Lvsw91;)AOF($NwWU{SkM0eeU<+J9nLNXN`XZ8CxWqCQY1d0(+w&^xgwXU~|e?B{puib0iWy2ev zJA;$+Kc~y^{7z~>PQ&-}{hEQb>d#zxKGf}B<}t-?%=#!5zUMf^5`+F}7+uE z^24gI*~N5{(<-d4!=*;Es>ma>&040znIcMJx&e;2GN~&d0H1!_XWKo-bDsF$YIMYh z?Ed$vzo*{I-gvcd0;$zqG|_05_*QpAskx4iRa$D!lGW;Vvf~;>eU{W}G)*VdX?bi+ zyHqm`J8KHDcJ98G3-2`CV&h3#9b_tJ*AQSy${XN%dvEz~u-=gImL83O{r>vXGfe%T zT;l5%iLtMmZKV({u$%0EQgW>~sI=4!3mer9YR0s3Jh?i#l4x#@-(*$#m#i56n6&~y zxRXa+DJ`lbmf7*0jQSf>-$k(4w{E-bx99Q4zf2N=6K6Z)_n+SX0EYOpywLk7HN!~p zmi2c<>K@e%2e0J^mhNrx8=E~t(uHc%I(@6UO@ih6k*XBBGf{mPQfzc1O*IQHa*gZn zgZMEJ%3OKZP!{;iSJ9Vbl!e0(55E5Z+w<+3QHx;9oZ_q3CcKwqJmO<~<7BjX#xsVo z%0D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̙(3aI8CXc5Hr?0{#y^0^1oAaDE-f z^`_l);}O)Pq27f)44(mOZbFzz3t3N3WvPvnr1szDJa00_S#mL)ZJw2{#Qdinv%Wgw zp1DPIYALlZRN1+6O=i>5qbtWfP0K8h>m6ty2O18ABprx6L$sBy5yYwzWFQ^8b~Qfg zCAM^U9LWQW_2_-5ve1_!DpOYOn?~A=8MY-h8ko|26uzR{y|976gPw19(CqljW0z=@WJXxQcv4*572s!-@A$NxaQBj zRm&b%<4y?7s!~E@l!Y|eQqp(bWF3cw0Pdx4#N=*Vb9AcdBJ)1aYF3KlfRMD1wCSdNyOpcV4?g>GH62$ARqll4g($X^ZP1i&w@+5bbshZ% z+xOypZJw1~DxCa9Ojzb;XB|vIoa*INyh9%dKx<%@nef4Itvyc%5;i;bNb>K)GTJFT z$T2ToZT|p!RD`{d0FoTT{-4A3rL0NIHteN{xlDX^z9Z&ZX~moDHm20I0NZW?o}$N4 zPW{N=VZ`}4L~G8R?nX0#``)5kG`#KQ%jHB4d3lHge*XX;YE`z(GK<>#7%j_<6`r)g zn+6(E;^jtR?b&8Dj+MUaPONn-1rDR<+qV+!p|*k5`AL4Ek77qsI%nFe?=CLxVsusk zIu#x8cERh6?ni#~+?kAIl`x}R*wW023BuBudP_bVZy`f;IFb04h3)1%fa1;zxFvHO zZVUISd#yV12*mS7%Mr#27z9(UE#zN^rSS)4p#dpC2ujwq9o=ywZq0$@N&L8yBVyPm zYL3%KG>$O(PKgb<{-r6_C_)!g|GB`v&U10f{*Hmce0 zoemHHKRQgbwY0TxyJKSX#*#u%2rb7d9mrvkvO`Hbkaq5S@oQmk7+|WP57w*iCZ185 z9F^_u_zF?2X0_PpZOzP=mI~cg=tOj+`2~3ruj%4jtlwB-6bKY;gOX3mt6bZN!e=wF z{HkQr_&B5aJyc7%ZAPYLUNwY=+wl-sXmu(q7{jODX318_K~V@s%+@JZYWn+x;#hEI>yfwRr;+HGpN$$HGrt>J2 zpxP*~%82PN**PI$C{z6?X_oc_y0_zAhU%Alt!%Ebm)R_HP7Pil-R@=>QWbPv$ujf$pJu*!i5cfna*Dt0e^?57q z=ck$N?bq6>)f8LVm#`<(4YnDp0Q%@nP>{gJjO`X-eps^ZT zF5eTT`XnRz_Quj3~xSw!uK{pU?qTvuXENq8m9RW^Cb6e$z4U zkB@des?=ki&%BluDz9~KEQ^ZMKPIV+a}Hs{Cm_kxr-EH(On$J4$VSAiYv>6=7NS5M z=w8CmRB38(1~( zOLTR|aBUZ^ubY}fii)YZv#m8bnnqHvJSxQ~DWf$CM^RD^-zrA^__WY;eM?$DUDq9! z%${K$an1h#SHrjGRGQYirD%!%AEBcCbPiK4$Cu#0ACJnbohCzz-Q;P{wLIiGE+0WH ziFZxAA#1kCt|m5A+#?~)+pdE5yMzFd)TEUVJMK2?nC@+@f5SAtE-SeP1_z}S9=Q9* zeEwCX`SzC=UtQF^$!#M!VV_g6=ri|5)ak6e)xKx4XQ{CGbl9Tu%Qe;e{{V>9Ha(7G zQJYH@IAj^i@R+WpsjfkhV)}YY$WdB}AQZ3oXAIeiZkgm*mza;V?&qtK)UzFwcIZ9C zyK$-UJ;Oz6sTh#*=jrh={HK0r?dApd z*$MX*b#16{zYj~~X@KfFn_(E^2v}fpr++P*18-D-b_Z&`ue#f<8vCj3%+%TNatz}d zN@!z8#;Zres+y{0xUsR!Vxl8qh&2>xWHTN!2o0p9td%K6M{Ce@jUz?VO6jU&v42@C zcRa@>-H%p$&#B)NccC`H(E;Bu;sf~GlDM#CBS(@M4-jxw7D zCDX|Gwn+!wT12w6&5Fa@s#EhA065y$u{|DY_3SvkjKOpkRgig6Hg@Pp=mGw{t4nC^ zB6hYhpFU;A{Xjoxk^MW=jjCD3W0653>qqWd8Dd$HW+ zr=COWCfnyZ!wghDtKWh!BQUtn8O*{{ieH4w3QAPdZV-~Ce%{}1{!036Ta8~J^-x=6QSQWK`+@oO8O$a6 z>gcm%MtOI#Qu^$CX4U@yb=LUdr8wgs`Ac}W(iE>xFFrnMHKdT1fkP zIrt2mpOMGoS5WD8Fy`uKE}Wn$W9^c1Tk$@H_uTfVQ!T&8LRhV###xzq$+%|gB8xdj zy1Mdwpp;iMR7+D^#+piFt>lpjs_)AgzTxqdC( zM0SycC!pmR+!OHbYBh>As{L_2Q?MX>eU3gRx&xz71WNGDni^fY+V`A+-jxJ7X8b~2 zZLqz{5e-iSr5pUaai!`~wZ-E|go_ZEh^oIhnCz;pR=c%!dYZ>-qF6+l-$7DT=Zc2fb;Wsfq2+83mwq-oc#!ES5{$~k5%}(F zpHI#8`Ir;vB}w=S(SbhHZDH%B@YI{?9L7uD8k73578`P^(;>0jc=DsHqwILc5G-w> zM$>(zmLJQQD-X!iyfE_(Vp!Acn56^TJf(sB#Zr%G9#rO6p6Si9M7C<>U`u8^H^~TM z$(v`{vsi5GQ1X^i74`#g9ip*t@+t`M^Y7{1d*H$Q?-Bp)%YW_ z{{UFe{{VfJ{{S7%B-1oYf{GjzP~f761r#_auXrgep@+u2;~h5?$R!O8!1Wwwtv(nL zky;!HO1o}4j{ABO^&fsQkPa&)ayho394Q-rCjOuF;YS_m9Y!l?P$P4&+t2%dE)ot# zdsYz_tpK2R1JCd4!l`)`ml&)E1mI9ADILC`AFw`TeMsQOX-6GRND<-b-}$?+pDODk zR;DW=hSfzBdU$`LgA@@8r`lNFs#0tbdS{fj#8#P8DrhNAFRP_IAOs+S21)Chc~dx% znDT!A0DryX;kfPTx1apJzFa9m8y=K~r5z$PHD+qT;i+-`eq_uvhhO8`1_ef@r)yM%J@OEMf_b*y(EUKNjil+YgiD`H&$k=zgK{>~or0NZ?1 z+{gw1+OqM1-?{EKALG-6m(N})>b`7+zAo>sz z;z#Xlex2*@0XUTO8y}TLomAn+PW2~Fj4IxCDOz5PwW3@}DH{be@&?W&K7rQu>L0SS z@f76xN!$&ML1E>#I;r0@c4RMdaVT+Uba-v3INr-;*z!@-!=u$Cf>M0~l1I~q+bVg- z+8d9P*Svc zr9-jd#6r$y9+t-`2fhzq`K7z6#39Hlo?u7BbU)Udaq2ARV@z7OlRgD+kK#QWVKxG{ zEhNcC!A`c6kmQYpnlC8(2|b@u`ih8D1uf)eJ#|hhIiS74-0;hQa3$a_u^fgfmx!@q+=fc z02+yWfua%txvkaVk8_bR*seO!KJL#-fGKlr%7NT%vHKmkwGPZegS}LQL`HUBN!U}d zRzlT?Dlw}YR7O)B?{aLi`;DMrA2?=SxP}sVD@YuFahp*0q%ISNy8n-D<68Mo&djO^Dn}bnMzd+zjsT( z2a)eixRRDp)OJaEV||-X*U0fT7-xRCs1iq%^yjYr)a->@7E~$ruHDo?Fj_)=!3tZF zr#yO+$&S}zdeoiPufl=D(cDQKixQ)^G3(fT%{2Cr%M;9GjY^NRzDf8G=j}z=_?u0l za#@heB_AXH62n^)w`U00o-I;UEz6OgYNV1W6nUJdliwRs?R|?VkS5EF#O1b78bhBa z%m>cl3EU}L>~}m`M-Q1E6^IA)s76qYmQY8rr;S@V7DMCA$0{vmHx1_gBk*W17!gAE zDe;XV=^^51R85>gvs+r85Tc`y0yoT3Z7)r`|eAS0FIe*71G33COkS&3Hb+gaEUcJ zte8h6a!NXu0|NuD2XZ^sV$or~R+2emgq#IJa&mfP^Z=fpojoZzU)Bq`;;F~{aRy6!ru@6#K89|~^Yg0*Sq z@{mUEGEc2>w_f|;Z}II-{JT#gL2U`7oc-&t%3(}IIOXRJsaJ%kvD#!PD`yW*z>uB0 zkayzePSu<@@c=->BR}c)s?A?XiAN=~nH@$B2j2D={Hi<@w-KzIrK0Ji{d#E?ZGY5G)u=X?dnMShi3?qyx;lznfn9H5C5ni#-EwS+ zO+@JF+rU%G=|FwX$#1K<1AY2IK3pzayH6+U3hE&%k&nOs07&Y7C#H6$Q%t;(j0H%S zm;w*o{{X1=`Fn5kyIMJBbgq*tiKW4r`kQ3zYMJ_o>^RT8jj*B-@GKoKb%>Tz-&%wA zA1{EyRzcsVZEsPuOX*>kSIEhtvC{{R`Ht9v=kq`*{rJib$Dmrf>lXX6h z0FK;FvD3W69n{PqvJI7tY}ost`)Av=Gkbc`hk_L|UNYdh+A zD~7cH02ZpIcJ_L$6j`{rj2{d&0;U)N=Oj#$=IV1`hR_w?e%xMMaSgKErInhQu3h;@ zFWFtQl6qhc-Az(jaNWyWz4hyeZIOA7e$x)X4~hIL&S04Uj(l$@2;)3=e#IiMmyEU9|>Qv~>oyJFDSC-dfhE;E2 zMHfzK6b}7{JK+1)qp9%@x2;@}<}t`QIp{v|C+_@l@~38q@|~XQ z#L~_Wi&QAXv7*lkdBUJ=zb$%<+5G>$WuZ%k-9^E(}Y19P6#Ut448`psVJV6ealEtEE@(FEVVdl?|^QLSDWgq?;k4k%ipS_xG z>t=IZh-55bl~)X6*u@WQUS=9@l#&Z&P@IT2+o^Wgb1~hrcE}YCVVc0^ zpJkCVJZj#e7DEa&$n-=pV zrJs3-<29BVqhKUQg`L}YHt4U9WEQJQOf=_;+U(@`s{LYzQaA18#M{0Y8sUyRnaR-x z3r88*$onIie(3fUBGX+wJqxsOh1S>+&f_I>)bh6Z9RW4wKdbIUvbD``s@S*5orx*> zzj#Pg6K49*8G2)1gvMzdN>TtGAv<|*#ihoKvLt$St9f>+z&1Maj=1>t_*EsotK_@i z&Y`Z^P7iFJg#0?3cj;GuNHsr|SLh~Y9K%vKoZT%^?&bVBUIWcrMsW|sf|#jFlH?ZT zAt~_sQVIs%UAWRUO(%=~yfpqFCJSBBbGRVwl6~>sw(ToZ;Q?#)&LNNMH;sloyAZ>o zN@Sq>H-{5c5EE5*i67VX8UeTuZ=gh$%NTBA(!Z`o`MaN(MHTB`2<@%(z8p<*D|}w+?$Yz%0Fkey z2mb&SADJ~P<@&>o!qMw07>Rz{QgVxU59L`Zl$A87(bQdyQ&Pf5SdAUmO4qRgN=V<& zk36J^EXtAp0IGkq-M#>PE326jSiF=4rel_F*d2vbS#4Y1z;+Et_uQU(BvjYLY4U`z zCVP#g$gVnr)YrO4TWOf~{{SaihU0D@(jZ2hDaVpMXXDGV=jPji@D&N*mUl70rKIRS zeLqh1wOt|Begt7--}T&FB4>14OkBWa~2vxO@uS45ux z1HS$4Z!d&L3{*>z}K^bRt%JOLNhd-C0D8KHQ9Z3TsH#4-)Y8jr?%^TSU2u<+M}&bg&m8XP9*j zGX`Z}x{4~m*A_ANXy9~o%S4`-EkwYa-nzJ>@t2GO;T$b{EJlI zdeK&PbeMGe23l&mwJ2^*OsJ14OOLwl#l*uBQkK#OWe`sr70mJI(JWD_$#;&YqU3*S z(QU=W?AZYMMC5_@zh{jTls4E9KbQ=bqA;%!FC4+8`nHbiBUzcECb3Jl;i+L%eQg^ zHs{}J|JL{;vi|^B&;I~@mHz-8&Lq<`OM;3V1mI-!tkBz9et<}511Xlql}K5Qovko(y%H{{l}M<{{ZsiKN`V3t3vuz zuE9h42j)0V%|?5Q%?)-1UH*XjZ~^aG-24S?N&UdQgqorlSdVHytLZ@o*{{Tk_ zkgywcr`I_3b*y$s9!c%oANF?d+t3aB@Wn2@3LEt9H`pG>>*c@P@cKS>Znc6t*Q2Yx z;BD!*3mNZ0$7<5&N=ZAAPnaIR*}z6O&IKnUrZQ^;IuZ!jk?H>czZeGsvT{z{F<2?p z5JvuffAsorlKAUc`Boc~>*=@hah&9QD;ULj!bt#8UXP&l;~?Z@QH}9iP?aZj_5gaH z`Eik)WL9uFuuT{WONk@*5$Zqb!iM6pScNIR%G{6HSNxCA@se@YuoV5?m68?}_CG`F zKD=NsHIk$a>&3bfcH4ct{{ZR63t-}u7i^xD>Q}z!up8~?{eONNXJFfOtYCJmxBBsv zlRGzBF-Bs_kp@(Gu^jNFM0vRp-1F&mv(%l(st=JKpq?CM45d#)Nx&lqp{qqzZ4V`* zi1HKArvjXedXiNc-szoK_TRGG{{S<4`2`R5xT#>#HH3OoT1#*}HI;QGm;5Cq z3D~w|#`y!KCvK9qltRCE8|IB{VX=uzb1+=**f#k21Jbq2`Mk@C1~4=FjkEaoq&7NM zwKjTweYPjJN|JX4C+eU`BiD;|$luzl)Q!~l{&e%jGCK;hDylF`(QX?sWJOUuOD}$> z^?rRW1t=&TyPhH4TSqP>ZJ9R*Q)r(R(9NVZN z&6bwbK_j>!K<~GHBt;@fzHCP*)gD;ng^Uu6NWZ*NV!D1(p58#G>9F%3W5c;U>5YNf zl%SNB+-Pox5xb*x5DwmDKkTRv<>B~S1Rm7Xs4zh5OTPSMp@cZvL+qe5my!VMY=8BG zxKfDq;(SCYIOt7OTsJTPjmLU$Rl7JbAq*g`ve$y@0VH%STY?aK1q0j>+;KfQ3j*gA zUdt#(C4DcitE2#-@`aCG_U*-@xaI*xRWdgz=0AlgwA7fJ zEn}yscT;NzV0Jqlx8iJVny#8QQ<`0g;;Bxi8xIwPCBxvTsB|CNBgsfnJ;vNjM;mhy zRqq=d@&l1hCT(TA9k?rWI@8jSUT3Gm8>3`4g`^~Ik?08{am3UB9)9?!GP@8XCt`Y2 zmPv!-1{aLD%%&pkc8gV73o&|14QkSqMF8w>FvcIa&O?%~1 zw^-)SZvNk$Rcd2T4j#umxCDYaA8*6;r*<`{`8*o9c$^9EQDeRXh_#7Q@46!4D{(HU z*f^b*=vvYWfmZ6s2=TVvJBw=nDK{r>>M z9Z5a+{b_2v^J}1Dkw)`c-;; zN@;U2JfU~S27YFn>wYVx48cpyL^Bk$$9>?mDNOl3_l2-p!Uo%u+tZ79-Le`?7spUP zl~c}8o>;OX&q95>nsvj-r@bkbUAM4+mAdPxT|@6hTTZ&)f>fs)buKL`X+0!w<;2y3 zF&S`*#~*ursvNgcd7?7zgE`9Wzwc^$RAra28m7l^r{9FA5+$kEi>V@fiJvC#u0l%w zP)SeB06)vaV%p9}dyDPC0|VF(l_Bpg)Friv!vb=4+?v9|7E@Na*Dl*bnP&0}(_ciS zNR-nDD0!I-A?sYb$53xD;5YvC5ai!IqJ-Np5FnrT1^hbqrDc6W@DbW zf?~Hh3MAhmFZxDHagR31RL^q?SVR_-%1Bd$j-I{yore@U=A|Rd>0<$&;yB1m{e^DX z_c`tG#a(EY3&|VaP9U{;GT7bO0N)uwi2vzz5_V*6(jBM?oQimD%yMf z6HmWOmyM)F1fp~VAF@dH#{2GSWYt{8mg7Qeb9?5Mm1-`f<<(b`=_uAB(_*-0Jm@&~ z83q_^w1`oH1B(QIrASiTbAOa^7fQC84P~t0{uZ5W5m3#$JdgI|C*1TN!vJ@sYnQP; zfVZ;`H&VHoSgP!?#=l}PJ%?ZS9Fy9q26t_kYMx^^Fwfq35CV|~Ge}z8tg44p%V}nU zslO?c7)sLHg#lZFgEX#@{n|dQ7Zl09F7XVL-5${+)c(>S!Jv17E~2qU2gg|4n+5+&|YtU)^zl3 zu{<}a8O67kZr}RJk0^e;i`=O9$3xq#IiuUev$VHE_z^ENFHU3GPs2S&ewA#whUU{+ zT+#Y$0h?N!9}?9X*tr&Ug2osNby94qWVKm!pXO!f5~7){MvqqOhh#jGlheqo8^!+s5?AYbH_C4 z%G1m6WeFa7V;gGTHT^06hd)JaMot^!8=Iaj@iyGzYa1xi;jN??A!iLNHa3TFS|^rE zpgm0+a}H~dZR`c-#}$fOx4(fwHmK(M!zhUwKm1nEFT0Zkf*0YwKjZs!dL; zuZA)Ff-_H|DlO$F98>t7V~n{WL*8c97UsZGz;%+~Q)$xl&OPxn!YkOcU0Gy`CBPj1 zw0Ob86(F)oG29+tb|f9E-rO#}0DUUBN=`fQb5yp~EQZp=g`=L@W?p5AXru{oX(zHu zzFdG7jIv>k_K!_raaQ$}d{SUTOedr%w^K4ChGsO>is=>8RRHwX1^h6`BJ4eo|Nz0tw3>g z;)jS<9v1jI1Gxa6W+PyuHATU^8-2!HUj~4Q<;Kno%sNF9 z?(E05z=8ha1$JsXl@#@Cz=<3R_z>e#R5CtK4irX$RK14Zt&-s+pZ#2XKsPt~g~i6P ztG7P0eQ_nk?bk9$azOYf2sQr-Z3bEuL@kz}SDN`wxKXOQZ*T8Z2A>fzWu7}PKGh&#Hs>^DCX zO}r0Uuq&2iR?;ylJ~fIh6tU$bp|fEQB13LXir1PMnBsTqS9O!Q<7V*-z|J=C_8l`< z;;Ezm02KG?UL=$IM~_2&0k~67 z)I3?#b**@h@jWudO|Ln@^JITppgaA503)$J^~JuH`sMbU;kKWoX#W8Ho$b>blA}I^ zPfD>JJ#F8(6l0fboR-28N|Kezr^OhBR}v9f4m=X3>mxQ1x|FpgUpYu8x#M#BVesz@ z@Ya!T`YJHgHGOJZiCKUQ+ZL6Z8{m)v=e8=R=-aL9`u)|w)rvK)o217CN;d;=v4Qab zlEin-bcYjaqHaH-8hd1sA67F(+*;}_lVmC`6^Tf^W(6!mAEZh6wAkiEwe@VJAqfBh z=i#Up6^&w#{K;D+`!7NIZ(f$VWp|F#lnbIT*!!bD&bM<}m*e>+qS;j7@tUZ@>mWeI zF?cK>FlzCrvC#>3vsxQ}-j*@i#ClURRx9#MW-RjWOVF`0 zrs7@O$1R?@tMRTS^o;R(=Yf1W8g7W7YTQ8;&7hE+7_D|m1lPhrWw?{{S0nH+)C0xA-ofe>9gCR?NAV$a%Sx$UpYgA?$r@*ccnv z|JV2=vi|^B&;I~@mHz-8&Lq<`P#~YC-lyrt3jtYC&C-L3==_hD3XB;&BdsW@2X2+( zQ`P?fFY)x_47`96DLa#a*0WoC4aafo_WuB<2@Rd8MGA`5!l@PS`1^im^5YGhZApG^ zUrj$TJhL9hXfsOdEEbO4E=dkf~VNvoy-mzIw*r#F#pVxqs)Ks+PVL>WUBq(j$eg2x_TwWEqv;XcB3DIK?=H_ z*~s?}NU_K+UoxC_^hKW_%TK(a2}_N~Z{3*aNIMmGR@v+7tYC9>^;0oVD{g`5+pH2w zfco#T1n}^aY#PQZNhMx?$^BdKhJ5ttS=e;1c)(%?D;4JnqK5l@_)@VSDlwY(gpyBM zE6w)fDo8s~jMhb4e*XYZuMTqzW{g*fQAz3t=Kla4w)$|6W(PHs?b^1j@~wwX$^Mdm zk6czucYTQ){eIuq#!KhtN(2psYA4UJ z*++BzyKs!wGIQ~x2v>>H7NVWK2a=D_pP}KzP)0$ zdwK=3W)&?NlEb5eGf{#IEi-{Wez^t{{Sj( zSozl@sHxTX%2R&!fz(+bJ?Nx`o}JX6Kb3ut(D4!{Amn|X;P(gL;r{@7fg)sc56+rb zX$2^B{v|oGyKTAY*dM0HjrU7v#451o$>rNSk?ubOTD9Vp<$gEw-6&mVe z&93EWR7vR#mX!J-Hjf5Myqhkq3fS%3?Y|K%;}-da0rGl}hI>@&nOf@;$VZ=yAC5cx z>8emXG!&ktckvU`u}^)5{++zM`|&Is?NG|(d}uc7$zNAOl%SrS)A)jR{jI+c+v~uj zDfm-t3obEA(ccRLw@QE={XzPDM%-A$z|~yIOVMRIjrta(^$nG=BY)3t&x<&YcReby zQp=DjS%+43M^R8w?2<{@N7Q%hM;4H<>)+n0BN-_{{Y6T-H2?iL8YkgBssX; z6p*BzqqtD+2v?aPk6tGxalb=VlCBO%T5}6ok01p;^4#f4d}X*)q_&R9Z5~AlNbTE+ z*69c#h#2rm&KRvVIA-}_O>->-Nn=gCq>Qr6)r+$4OXZ>aR*ar6wR^qQ@IS@jxG zX`+OOd{&j>5>k+NSWlvl*p4OJ$OGVwssz#Da!n~V;*Q<+J9!T;-{rp+XhQE*aso~} zQ{xxNYAPp2k$aA{k;7qOMhlXiip$9<=^ihIw}_^R>OecEej2%1?hvdp7|HGiY0Ein zt>g`H5S2mbPCu16FEaW|#WuJYv-5~VQMA0t7ouboO$V0Dw`d+{Q|8Ljq~ zR*^?@*YW<8-SyS2z~+h-jzV|GLGu2&q}0d>AQX_II-6NLY)5_4e!KB>A3mSER1=(? zfZCVf&vjcD9O+pHsnq<0_W69a*+6>w@cKc4k~8co5tEy~^sQT7nKPn8ddRfQ*U-1# zcdOmlZ+*+o1GkE%)7&S0x8ZjakgU+BtPYv#eTTMbnBzyCVwLcWcRhgjKKQ9k+;ibD zU1nALLk^W|5el(xD~NvRt7QPo4s7sdI0T-N(m?7xw&J$lSDr1WD2gNx4d~)~&AHjX@5#7J2#4y4#m>0u?$`NRP5p z?hUBydWOYak~?q3gi&h}#~0QLN0|weZi+erbJm%h=ysA!)`grbVNjAzT=nG`=nuc) z?^3RsohsEEYFgc3%PeVZ6=4ml$t_li*#!8pz(aNT+;&uk96c?8+>ZSzA1FLEe)_hP z8$OQ`JS9&rs|X3|&zQ|ST9BcMob*1WkZeOixa<4ZkXO(mP1#G&M zw)b`o6{J5_($Y>|X))$79sU`pk2ZxtKHChh$0XA*^_Dj4g28O5b$V@s!yDLMd#_~8 z$m||c)|VB!Z!ed;+T)wy=XuZvtY!Me5=Bw{xc?ZAgo|e&zc+C9B7hM(JzB zQa~yltaM54r@6R$gi|DJFzkIGed4Rw4ujtrs5-WtZ5^aBqq3}^`V@MJ`=OiM^>1#K z5$gs{&JetJ6O-?G4rPJTqUSr6YD2yzp;*LijAIr{2pcyS4~F|CZ11yfl7q5>hZZ)5 zX49^9TW}KIQ^^2d^z&f9&PLxoz|TxoUZ9ZLURr5aEMDny^A`72&oBKksO1CwT*Ih2 zrasNSRqFkrocm;w^-+c7IupyJHRQQXB$B1T%x*q1<$g7cS#+sQn7M{d%*#s;l%`#E zYq1GPaSKPCv@I$x6ns#h>-m#~v~kK1{g>rps;9T{r4K8gyo<Za+Aqc zYd=IZPfT*J^Hr2;j-SPDK6j{Dm0OFdx1hjh$5csNOH#FC}L$f#e*5Q(CeV-dyWdzqak zUB+{y-0bs3jAzu(IVCn(9;L|COk&062T>WGCi_TY-nvYLlHqZiCfQ1Yl*7FwpBw2u zEODiU+Fx4V-Ykvk-f0^-+y+->N5JYGNGJ6Asl^{hzoWk!=*Nb5tAV&y<47sU7Ck!N z-bnVwZRdd_ng;Bx43V%M7*+eyT)!Lk$a1}|9HMh)h-3IyHu?(V5v(q%;v?N^@@dc} zqfd3e1o@nOio0nMl*Q$IS5+EBS9VI8V!|_Q`#Xho?JLKg2)NO;w2e4|-9Zkc7;*@T z;xW~IK%~)wj-z1e7vZ0cJ{$3${uVz;JqyL(2yX8$JQmmFbvDwzT1$A|HonoX7-1x2 zjn-{G>O~H$6^N2cS)NW_`z-ZKD5?EE<*!s@_?cdZWz#SjRn}wQ9)&?Z=F*l$E6yoS zI{I*I_N~M*w#jLk;iT+@qz?u0HIAdh`qN2oB(}Ga$jc{|#YmDS!;QA}V1w>gHTorO zLqg*|7_#DhFUq^nbxSC2t=*R@@lO)V41gWSJWj1$!qV(B6QG}W5~95ktmTGmE@y6p z2}x;7km3uf*rlZ`4y1#&zz#FVekJjzAIE725#7l)on*dUtVis`xWK^ZPB$&rB-WY3 zd>^22+fMpa2$y#rsif}bB%S*YfZCiHMdQ_#_EM}A#Y9-FKPb;}LufHk`sosiPhhqq zfI#j_)RD%mrs+C{x2aobS~M+jt6fU5MH=qUBb+Land*C0)X%5b+s&xzjT{ybp?M^3 zi5iTvACMoO)m!xc0Gar1W|L#eu4WcDZtuCdabYQKtUzOSmuWRAA;)Gu(IE)(Ks~#j zJ+;N3Li^n-fn!@c$!@sLIM!L9g#qT6u70f>9fWcH=ljjSO5hwl^qV zTiq>r1fKoL#R3C{5#g2AR2{mkTcpn_oEb5Z*{6&~GlP)S&%6b}(-C}%a zd^HW$>dLl4dx5y$j}`b!#(Y7;o;7gS5NVeSZyn~P1(nDnc@}>{FS4qPvm6tFf!4hX z$DB2!>i!q&njWVSm_cPN)FpZ$ht$X2i9VGX13xOO{IPQvnCYIQngO8Q3lJE3@k!gJlqu665Sm|G_UE$cj^t2S^4 zOr82ygFFoJJ67PnDuU5jf5D}EO1K#~Q_Jc-0LFTB71eA*I-{$Db*|PH3zLvvHmdA$ za9CSyWLH(IW>u_)QcB-l9Yd}ymPcg1`a2H8kB=JOn|;IDwZ@03L}I(LmPmjgg86T^ z+bW<0Qa0G*JDU1aYkQ^NSVgbt9Ft_Z>9EV#$O<19hnBy`%E?9Wu`(jCd2Z4<7Y z_@%L1z9+gyL}k1ibzt{$J7KRGAb?gvKHO4rIfs@ZmO1^O!=*qmOC*FKIRp3q05!WE zq)t%5v%1NVU5>zI#J@_yTz+JjZO8&Nc?~3lGb+(*3v;&nC=VgTNgP4^IAi9V{o~La zZb!g&t1E3Td#2=_!a}2<-y`?b)kEi}4ZfLgr&oURZtO0*mNCh z#ve?66V>i+G)->8)@IX1yTCaCWCS?nR8f)Q%^s%ZS_)^6nax&Hv&xpoorkFgTSLCFRDMw{@uEQ z{Dm_!5#|{_m~b=kZVem4^zfSA-8U`S5Lx`c!xOSQ}8^?f%cG{jVl(v+#)x>mlGD|7fk-1pzP^c#8(2H0<~r_keZTGZo#NlHfKej)z=UK(cR z7#j+3C#Q42y>BFdNE@BJxNS)XBC(9^ScUbce&G6#q5E)&U9-Iy$6C~%2qj&?*z8ZK zC+X|PFvR5aqort4$@1UVW9zr)!hitgj;AKD0G~s@kOSB99;ES;Sv&Nvf5-A2xGNRm zJ8)uvE6%Pniq9=6RIytsb4^@WyH#FMAx_PY1y(O1ZO3)U?V=)Ij9mAL2}^tRfPk)} zxK6~yXB3~*o{%>Ahw^^?$t3>(Ck7}YwUfUYtkB@1vIqHozuU$!Nh9*Cw;W=ziU9Ay zK^URND-<{=q5IGB@UCN7uXp1i&N1Gxitz8}{yTb)xZyd^UbT>F&fwWM$Em@6VAw-S zVOfLH3+X5#G~(Dh^hj+TD?5J*f_+C2WK$F5eUtmeLz+HAx7ljncFFfeEDghI0b6;c zD_`hc(N<746b+{`TBzDl3wKd7yHRfG6`cooh#ksz+rJxxisf>jXdL|h6-5gmd`b35Bjuj|0G$?bm9*omsHIC~L@1!{ z6rVJ>gV>ZUBoKawg{uO&?MQTFVm+xr$CoXXNhk$uCAK7}0rPh0Vda6`b%D}P`$O-; zY67<}W4NbF7G7^|wWYAKw1(a3Qjq5R>{37-(4cz}x0kOOAbV|^Ku^@4hK z`BmHxq4GRBFndxPIp3`titfadztgMl>A$BBM%<>N%$XFs9p5ed{ZFC${X6kz1fP{u zPL#hH)Te#HDm!#29lA(9d|AfqagVcAjxZ0sEH?7iK~lH!+wH&8`8cqIfmM=>o#|#e z`v89~C&blND$>kVC#gL|^!<;1C#-}FcBl@ty2{5;={uut+xh2y=}PrFOKaYY#r6o=a*OS;a+r% z2#XxU-m)#=UQ;@A(9mqpl!F^}s%C2q4+Fi#!Is@OYZj|&A%Vl=6+p;Xc?8F1howMJ3el=(GJsNcm z*6&vJc-rc|JBi3b=y9v7Sq#@|25R$z;q1nyi0Vt!a3-sF7q;*BLN-q86&k73WR5*A zN#(V;lzN?1W+?mRkKQAvw^Qv~9+aAFb3U!B^IclP-jrjs()0i*-;^G{{RTRT11{5R z{Qm$svYT5b+V?cc;zrGL_)*)3iQL6uEW!|+u-|}vKJ-<{{S7-W44AX7>Y!I=blc|5Z!Qh z-`m(%IjbmavZgLFe1cQ1Gx|ds`y{%S>X!Yj#f7S+%4|HZnq;|F5)fCm{f_=aw*AES z3uUAwjg}T(Xw_6~6-T5WfE#1wT)T%=wN4~WkAi*8SS_v=os=^aJZemMMzHL=Ns^!qsuBwui3E! zQ4_>TJxB(1&*0h5wth9_kNj$FF3s14+Vi7H!rxWZBLE*rkexC{UtrQg7nJuAwm!+l zHTGO#Q>pE;qnNU|nU0s|IrbruL7cvuHuW_YYWMhaykM76F~~6wmA z7xCq`h2bmsbeaDE%y)OQt=gWc9CE8MW8a;ECx5VWUtVoEavm?^n;#IghF0LG(yXp* zWK4N-MJ>PZe7t0Gs=0BEu_BT0UCOJaW-KW-6JCuPBc#r-ochvH7C0SpR^eZ6w-dS& zlifss0VHwe19XMCH|7HXd)H{S(&um)ahGfZ>^2=M6CwB^m&DW>|dg6SM%$)cf>N<3n>Fk4}dtYlwbJN-{=}=(a(oCZt0P@hUbgnn%Hg6wpq;|H`R|(d*Uy~>yULw^s%=V4; zKp|7YgI=ViG3)*DyBpg}M1#6yPm-pYLJ!On)I5{NuKtL;AO1h$OnxC*K_~uN&|{Un z*_5i!bt0JI5CT17G0!P~vOO5yyuI|1;uyGFf!l&@oIw-R|mL9r%A1F6R3lU>`v zFAg-9@$&Z9jUt8g{T|-x@@N|dCuk95!1Ri3OAOjuI%`dZZ`8zOGL<^6>vV*U$pCTS-=?mOq{qctEyaW>4;Sjt z+)Z+z46UpLM;wigk0JD+04gXwNhZB*^jOt(DY$D@I-I6%9MffjI2`8&=3rgpU-m`@ zSoLB@Kme)M;hRf}Mr#;bjJ*ak))~d4ji{lhR&OTO3k<%JK5q@At-=1t>H6{EJ2;-= z`a2t74aLlYI8c43Y~TU-?V9zZaZc8<-ZD3p0vRTJdR2bb=jGav^xIf)v}Oy$)gpDh zpT9$t{IZ~k771;&$V^l;*HYCr=F(9#xK*=l=5`Bd`;^rF5s(OeYcDe-y zmI;3AK}^+JoRcN5i!~CmBd^K@$cdD$xi1#LCA9ZF__Edbf5Bf0yf#fcOu3&@@s?Or z-Og?RiYZ)GqXqqHwx=k1);~ZsJ2Vahj%PsixeMPfI=XTvJkog)}UzUy_s+1n!ip zu_SJMont(lOR8IGmU0N5;hWbXIA;o6w1@pFs>kL&HR|m#f6}qIi$qi{ zKQMKDBfk7Mq1d(WnJ5HXWHTT3hnrxyguLTw zS^}GA?M?;A-m334T&(NIB|77pa_7v(pV?`itl*MkH*t^7dL4{8we~U7Hk%^HFDjmw zQIcafkQ__VCq#ADTuCV? z*=ij`@9K8nzkjEn86`od7BDvzirr`{a;?Y!fHxz!+!5*AefYs}2gaAnnzNkXa+j=p zjcc|;%a*^x#_Kgh7NNp&JBS#jO<$K(N3PTiI+r`g5}T^BVY?~Zdj2zxAt&Tg_60*_ z78sU0(y>wv$Fs|sgj`uuVYK)zu04zLf&Tz*jQY<>GnWy<2Y@P*G6~wqq%59jL9cxzgYgD+- z#VdXUkJP-TgT-jyuu?(v<0J+gr=>WIRPzp^nlhv+T$vJd5E6+t;UJ!roL6gViM!9@-VC~#3jf{GjzP~f6~J8)51b$xioDLD3_)%M`U z9JD&SefTl?QH}l-I=C@MEdZ}A{J*FAdvId2ij?r2pAE(-?IcctkV?ztO{`|JL`iX3 zppQf1DBiPc4c65vWaqYRaTMB+hSr1B4&a2yfDKy~O8hkkX{{EI)}|DakXU!-@LlXjO1mOqEE0Lq4rtEIz5f8}Ux@BI zkBHu7yF+mwkul|zeU|?K_)o*w_W2Wp*-<4^&Miq{#H4JOkOE6jGU8F|cFiz3CAGdW*5TUFk^# zlBR+2Q`52Ew%kdA?hyQpz(2;LTv$)b%oLIE{=F`j+O_$j zBewLj9nUTMefYFPim949SYg#HgrE|9_5hRH>^%n(QeSGWk}uAkFkw!98mto%QlK>Q zV?8mb?mWX!tvyL?#iSIaN=PSSciV}paDa%(9$^{Be0$UHviQjaeztn-lq4T(?MK|7^46wqy2P4T- z3O_0d?m~Q&p}*lFK1YWVM%)kxrX)eJQ;I$%J`mJoNL#H%>*(uIEhw#9tz8?D-|Bdu z4l~V+F{=5=Ba=RnN7zV^q^P*V4JZJ5m)w)vw%>o`;%drNVRM>*(Q|HbOA(EFS22k* zL2ah@WVVHMI^h2R$wJ2CvGYE>KO4z`$~PvMF~#Z*b^~fS$xD$?=x?Xy@Pd?gP)d96 z+qvz zjO28Qia`Jw3p`@P;CtwP=+imSU>rox#uJ;KJ7~>qr zABJ)9>+-EY-^UH(HMDWZ1Ik%fCAmO7G21^5gX7lj>yEABnh&Zuej|uUcR#kzajZWh z%Wf<0Bu9lnwqUb5RzAOZWIJ0TQ)6jL>Ql`jNk-`>ZZ%FD((d)`E*rbm`n)hnB1WY~ zUwjAH`hferiOH?2h%fE*T|!uF*=Lqyjie!n3${uPwm<4Q$jBb`Of?HoB1S4QP&m9v+w1-BCl1U8LZQmH_(Lfsy zjdK1Zzn@rjctAe(<*6posAQlQ5I6%UVtWVn~;z2*3yTmJy1J}EA_9ve;6V`jL4an2Q(d88@ZB0wgH>gw~;gwNo8}&u3{x_1adr4q3(AuT!%Bw73=){ z`!DsoPg%d#I@r?nCkDHELiB@J<-|f%yLq1B73(|~QsX!REMrNH9phjWw4Czu@fDozMVW0bK}ylE#S9- z27c45l5&idS0F1(TFI(hy?YEfOv`kqO*3JtyzJ{(osn4I-6|~X*CWnvBT0-kYfvGV z>{pK9Sb>o1l(kYFdCM7US^}SO`#I?Ex|R10coD(Rq3F^q{9AIl2LqhBUQslPG9!i| z{#0i?$6=DvNIrJ(F9~?p{{V{T(lXb??-8tI(msyb45B_oX+EtTvPdL-HqKHI-D)?? z7wh+ksv(aK!ZnJ@(W_^&TbCJnL4?cH?MZZ3XE|N%cA#c9S6iyeo5YDR7%nL~M762s zawm~*GUmy(0_zHt%T8?a7C8CU#k#{?-58fL1I@m7ZSw9&n6g$vlof{7<|`QMPKda>vWoQO!P8sJ7Nuka0{KPH^0# zKhAUfot_>YG?Hq$ij578~Zh|L|X zv=J!gSk!MLfHF}Rs~)7+gLHlo;tvxwYtAs%E){JSH@co_Sb@#dMx^b|?e zE=#6beBCr{EpFycb&q7#H1#?huh zsp@Sf_?IBl<%yCs0|W;cV&kU6rE8kC?vbSOL!=2CQ;KD2Bqt!0Jj0W?8R}|Swr5tk zhR8KXn{7z7sgE;I>#wKV3Wt5jDax2pYLgw9sUyLRT8f>4B}*iz_dI#q#19s@BZ0Vs zMerj^w36$JAl9_!UotT9B0CmR7>(RB6OpjT<>*cV;0`L{eG^vki&eRf4HD-}z6Z;G zNf^eVSTcj@TqZG-k-yHlVX)e@L^c~KWoVF5B1g#D{AIG^u~5^B+pzDrk zMdr>^mz4E2Z9sjuOVTG!NNoVBN!?C5loCKr>L+cyxcQOvkML_o;6yxgq9JW3Q`Bx{ zy;e}L!5f19lp6&n0G7gm*R6dA@GHe_SB}_lR-(XamKHYYY`~K&&X_@#JC?>s3zAPt zm9;}nFx_&gfe8}f&}ze2kVZD#$B=`1#UrxRVutrBWtSaF%2{nHdPAeAowwtc_zB|& z8F&$WbmG>1L&1pkh}QMvQhu!WNf|O{7-qvDX7EXl;0&r&Q>%ANo4gCfNB-x`g}=RTOy7_f#<68E9dVcxYtWeOHx>7 z0XzJvb*ORHK^ydSanydAS9+bdjhbe#>K4NDhoBa+XCcBfnHL>~TwouyjPw=7ev8%` zOr8_o=`oz%TWeCAlp`Fx!4@|7oFVD5=iJkWSu>okPFSP1jS*IOZhJ>zj!THcr4r@L z_fQylJN%Kn20%xOt<}&D-(Dj97W_Kk?-JtF>~AJpZZ^>G?R5wxVU=5TJgkg5w=?8~ z7zKzewgqgyIq|;|_|Er5kSZ1Be%h7}XBKiJ zc$Vx#Toyx#9Zg?lb_;^s&(`jz+NP`|Z`hvOdGYH{rDcw@sCaWejph~7r z;PaX+t~pxfU^eZ(Ys+6pO;1RJjN-kGIkhQkk&v&IFE+wRN!zm3+v+|w-dV>jj==qDbX*a>3wp8g z1ny5^Ur%(-XthBw0pfs>gWL>^fzTX&rmcRK>(f;(hGyEuudXOttGK^gPQ`&>Us;1s zToRSC^BDXX>vcedIJKYGoQT(JhQpsYx#cv6pF8akNmw%D^!M z`H6w*u2H0MR}AsLiA|#D7b$&pro`=cBy1fmnkjH1W8PV&B}q^~^$bm^8Wzw+~MFxDS`_&!ijX0_C5ap0NKWKni)!*8v204v>zz;u6r2$pIotWUyx}e zzF~O~)_!N%<~x`C+gI={A<3_(HQz9gnqgeQRHITd99oYn#POOY9Il-ui4RVQ^RBYX zO9@a@T@Li`QMFp0K(qrl<^KSgUuf{rA87O*ZFPs1Z6D>s6ge)6qn6RkUZ=^oRl9nP zhw|UdZ#vl)d4g$%k8=AiAcvXX*Fm%s>yXPRixJjYX?V}I9rx>2-xY^%U(CAENEA~xrL@@-P^;xkE&)81c2s)cCeDNBg_gtC`&oz6N@$^hjZ1y&#Oi{&$# za(nFY&ovE;3H;7u`nAojnrkiYsps6RY7aCJs3Kfqw>oExYptg$6qx3pRV}(g?8-_u z*pcuW*O0>GIU&cKcK~GKlH<}y>r?*#vX*|OG01Ha&utbHRInMN<(`tcvtmflSd0qBa z^Aw+FUCxT*I1ae`V7cSbdgAyOx}%Jx4y3Iv0S~ zXsvT9qMbipCG#_1m?dVKT(vn+jBVQR9o-Cu@kd&V`C!$Yy9(w5E7CqyGkpxj^{-lg z$#mtO&rUJ;vor#>zc=S+2CGe8Ar5t}b>ZPl&Fj^a+bVr!)9HySArfqvax_NVXvWl6 z=hKk4Y}NhaH{Bl_YUa_qkka8e*Ts=J^x1f8tx~I&k9-T+QORVFzODtZ;nI$#V_9&NWQkZjHgW+DoNm>f2=)BK_k(g;DBSc)E|7Kh98b@%ViGsyk9je8$8Ql_f)Bl@7%!N%b6bJc2#P zP)C1bT7d)~Vkzr|*t%}(VNCZ)kzPx%Q4ZB9Tq#L;r8I~RxV_AB`c>hy@9Zz5&~}A; z81foK$Z@_`sKx-B zWmFdJx!})$^3)2NVa4oL!<#tTzGUtJCN-VRuEiz?&tAXoUc`KUBW~3y{?Zgs(2?Xf zPxd!)^7tM7x^BXCqT&@AN>v`hu^#TG&cwQut8hDckPl)zDI^iaiky0vc-w!KRq@JO_p9zq20y04OQer%h&^OMN&Fk_K z@$n=@bw!o3V##rn9Ja5SjgnFvkJa36HyyX($Rp$+91uOnUyshQadKG*QG#gmGuH4P z@)GgitHf7lddjy^DjRhL`i?FkIN5fsetq|C{{Wpx6qS{>=u%9Nb95;!G=(icD%a#( zLcH5q*mVQjekA>7SV+L;7~Y}_cxDHFR?a^n6JrMl7s?O4fuxN4~jS<*$9S{{S??ShR8!cznnEqd3p>sargDk^H`g42vSG z3aw2=a~6|pB*}K3x>01iArl(;Qy?Y40^U+ef!u&cZWpAq-%@+#4KwqeP(TdBwmrU7 ztyDnQvFX62x^gIDr1GiibMNscnAtnf+;Ti=5Ikg^Wl&pT+pPnoSn=ZS4#nNw-L-ge zcP;J`+`SOogS%TP4nc~$yY}P#=A3!Y%=x=BlbIxYcJ620>spI}C-PFV)Tg+p=$hPs z&T^c=u7FH*7|5rQ8~kt%wPRN2jfPR35%rtyH(UN~{s`D+!QDKvPD()umN%WShM#5R zw&=P*%94Qngt1`U$7(@ppm)844AQvSF^L3v8$^>(A7Bfl4dCfohnp2sx zozZ05Nh2@f3^n83=q`j`Kn_}freD2YX#+9x=7mc7=%Xdjg}9uDk3cA9*(b^6w?l!YNuTI(qJ*s*zivBcD6N0&%~Th1 z-I6=krc3bJi>la>_t_E!(?3UD5@-Ct5u6)wR~^efJ5H?jr#(VNZhGwKmf$JX*#s#k zF7HmCd^W{%gOmgFA~f_dtfx1xc-iv?O8@e%(B+sdTt_R`}Qy@}rTBL(2Z}u`6 zu_mWw7PD9>q^q%D2~HMR4l;5s89iy{BluDEE8NL2sy>!O&%8?4o$cho9-&par~)wsy>H z(v9Oa`W+jGlCh;@2*;Fc8t2~o&8CLZlChpiCzbTCEL>FMDEI3h%;Un zelR`oFa7Fx9-MrI!LMH>J>^j`#grplHU-smbd%IzjSyJ`ufPAW4DB!MF+L}Y#G%i z!dV}GQmuFgZG7J{?Z^X5=lHTw}s zG(X2!UsRL%#g4K*q9#*G!qwQaRM8bPIJ;Nb2SK>$G9ALYzuq2M%c>UVGn*S$)zy$g zc4BNdtt6FNY$Cf5yx%@?wt7#f+*X7|3f6Gu#7STho>!MEZtWchUhAd_g6sg|Sru^t zS@d{ag3fDKs4&My48o6MYx8r6KlG*c00aeTODFCA8t*Yi&6N&ahEk^Q2-Ay((jTN> z=--Z5@MHHNt6S|lo3IS{ZqoQhi+vF`F=%I3gI`{E#Gv+-c{Lh&7%y#U2tf=_v&$Bx z8B(6y-dehq|CMu^FpyiZJ#SI#MGB`M{N~KM=QzmSU*)IyEa)Y_qm-3p9PKAqYPU=xlAFEz0s({2cT9Cr*_~MNGeN94-ZC5q_|5JNjt;Gh zs}^O|`*JDzFr}&~VV{wofgS>m+W9i^ob6zi?n>v_?@!L+U;hD~7SJOmS!($%AKr2E z#r;2N80t*~H9gTBj90HO7W)Etr-f?WJq3`2SO2h_daPD)(|3>M&|r;P*}S(Nr0exn z#_>5G?0fI(I%;Sc;`kIV&zON-PF)BGzUh||V}+emvka7@6tOtdsr>!Ge+g~ybEdsB zG708~Vnz?zyipzf%=3Mop#}({3Y|96Q8Ir)`fPteq%df|N09|%5@Fz~(3cYhX{xT+ zjJRUY%&vB-6AbA1$&RjNv^tI_rkhLXIwSWmj+}S!chD(ewXy!0T>;RHLTw1eY~UXf zQ=X*f$PQ!NT;4|?&aQ?DfEhI!sv6!>!dSjYw0ZLp(rx|@l)XT6&qsE%B_`hDNqD?( zAR^DHgIyQ@Y=-G?q&)_$)h|779#`=zN8`H-`;yLLRhqvLzs~I#9tOQRxso zcagMXbC$X5J-4PZti=Ki4}xIn*$v9YJJ$k9R49G@AyS>$bwl3o;p9>>QQn>i_c-6V ze%C*h79ROX9$?DSkQgW}md|nw5ppz)Lh;-XWDr}uI3Am|5}XsZ!Pf0Pp?sqN3^5w@ zx)muzeKE?Nmqq(Q(@b<--ol*_`f|2j5Iy5!(8lbRnhQ*X9d4A_lGkV0yqdTK`#c%= zn~ZQoqpoV6M(dkP67gj23+5TM^^O1-S+QxHOWB;?=sB@eG?>`gj_B!};Gj7a%{i{Mty6U`x zX^3Kr6r0Q>bb*NOQ-VT8uoIgrSZ`kYgWZw)a6Zry+d|U6;FD72XM`CbS-~Vi@q6+R zEDS6VR7~N{yc$cJ>^5h@8oFZ}#1>-SWaeZ4Y`Z|fW?7(S8~-xyX^ED+S=vx*B*6Oj zKBnsN?lyY<)o1>;qnbU)ZLA0zcAqO+ehxaN*+LqSO2Iz5V={^9z_9$zuxb4c??qy^ z_4!w^ZTVH{Ee635IMq^KnYXP>%8dsJg-nt^vFeRJXK95hO%qRC=2^165|}YnWxViF!xv`+IW; z7*#1tew`3=raKBP|F#5XWGv-krdsMWFQEi4Y<{%sO!bIW>c`pk3QC8!&WU~*z`-<` zix?%GwLV*>rU>0s_gQ_7My;K0Pp&kR5EZk?R94oNo_?37Y;-C}feJxyGyVMVSTA9G z&VP&`ZtIPU$5(2ehk7nDfo|zGbBi8Ib;9mq?>UN;(V~kM_Ix814i2kFeBDz!B-Y{9 zTB9Wnq%T*JD8pWK^DF|>7!O8UPEU6uO?f!mp19)8=DHTl1R!&N#|K&s$1&E-(O1&Paq2- z(;m$PD@ZI(kGm=lf*CPEd!aQz3!&_=Dgb0%CH&;p(<~!ong-c3WituV4wf!Tk5jjTG$@UhBmnUD`ky96Dip8>uy3OF2w(~08?O(z?(>T~BB|A8x;w$6Vv4w$nEd9rK_4TYICd$w4Qbyh_h@&dVNZ&G zkKR_$U+IfTnM!Gx?}&i~bMi3x4Ylmui|7zcWTaq|vLWco(#dtHqW<|dV9!3Juk^Wn z$#R>>-hR8oo}3CEgDUwkJ!|ccD^qT!A5(LpiL=*05|oiAA?_PRr+DXO!%qD6pRJiD zZwIOtMLDShtHiR)Gq()$J#KCjmn9rZ+-jV~M>BkG!>+j3*3Jdw4e-9IVd&|?mkhKR z1jEo}V8qWjZsxvQPHcwM@Rz*UL8ng zOe%a49gOP$2>+XVWNBPpSz#!pJIQC2ptMU=h(PJ}fja6x5;09)Y8lK|Vq?z*F+&+1 zwy%n3yBE8H9a%h{9k}>CxBNOsh!mwKm_DMSGv*(z+j zrldS;*_li@*;)Xo6ZxDoeC7&E)JT-Md*3WSI~kUNt2W2r(~edeUx$a1u%G9*gZs51 z4#wptk=aOTeHpGpqQuONFahuTKD<0#x&%qfA&io`7gacxq$KUVbCcvFkh)d5;uB&; z50?8l1+RzEe(SQ`44pmvujl0dkq7?w;w@$F?}EE`rOo^RL^@Od&qErBzVh@dDklxN zvsANkiNO#L)goC9SqyT|_2DdF7)7N6upl5eT1X@Azrw>UZIH+*s_Wecr$6eXYV^Nv zoa=TV_~p|1>sK(d%E`+AgaKu0j%egLVr0$pWT`3ut7ZN5r6lAvBw!Hz&};pj=tOOrPh%iN zXQ(sGLY*w}TpFKkchFwee%R%BSWS~T?VMnwzag6_cLDEej*b919TIJOn1`dQvAvc< z;`Q57{UbifO=uyoY#NNtArW|-V(!aBq#5Cw&=4^5%0Lh+$)y zRS0XmEN7SUiFSVo6;Y34+ATzBX<0iKKjq<;1J<9s$uT~Eikapsp)vW`nk_79d^fIq}{8h&XIZD?BnBMTIP=@>;qxKXv--AS%Lzgm1jJ*#|S?qa#vWRXM9io zDL0vNj)1Uv0uI;=IB0oQh-;iJ7;Qa~M_;PnJlW^E+3x3tU>P!g#Qk+*GSQLJ!4N$N zj%>EP^+BSNdg}7`!F>!m}R69S=O>*>O=@~i;=rRH)f-7eA4pL_OFkrUs-Tzd?M&k3hd|% zZQZh!$`U*_!g_bz=?YD}m^)-_aR)x0}6`IzZWi;MyunuVDi@T*1} z+i$EPla;>cIo@e)GepcqhxPFCj17)~X!RS70XjWxK0o865-K{R7Vb5WzTH$64o(B( z>{sN5dcw8|-m`0>w`0wR`7`uc)&ryVkVz>F*3D0CM1qw8!WouXh5pa{N#=9tN@un; zE8^BaVz4T*enfjCvHg67HV^|)RF*hy22wD~`yw-w2yL+L-+U)7X(SBb)VJr{FBVR6 zC!iLKokoTdcCN*Il#vOaGU&YvZ-A*FNxrsQH zBG(OiVy|Ma=Ey4!GoxvEP+lxMcpYpA=&gZ6Ry$Yit5dQD3lW>f5hi$$`hpl|U1Dhu z0c$}FzaG)c>AgUuk|2Zinv}4g=!ABd*C3cMgsBdqvHP(pWB6CdRz|jRW303W=#Tkm z47u7W8|JmoD?7b7tyl_0Q+0=@(m=u&oj3ef-TAY^_N*}z@9(-|9bvd8i4`LbF5G=1 zdJl>hv+Vur#QQQ7oz@t1lXjzFk)&H0<(nx)4T2S_BTtzTX~V!fe~4Xg9L~o=sw1(b z0F1{};uRA-juxS-7PU+zEF8dl-}d)`@X%qgJuTfUD;5Y7%o*F0P2oSY!w>{T6$Q|i z`8ePFwRhLLkYBLdo%{1;@^nj}eBQq(0(nvi@PUHkuHK{u&28hkAsL0wkx$rJ)KC$A zSQW51zQCq#aeGtAP-)2?>ZOIJl_W#_!88dXPB=5QvES}&38n>lzztjPnpxYpIs#`T z-&iAPPI-B>oZty|s9R}>-Z*%;m1k>DAIXQeAB?C9!Fd*R(4(ld*`HpAhILg^DO0Cm zWn_0xM05`L4O#yIZkB2otv7PD1a4oKRG96*FOB}xMQCK=;7P1U_=#cP6rAzrw_J#| zTJ8}U0g1T{sL;!>pY15;bFoxsFMRd3nBNEwvE8YlQZI^?splapWOxjMx2v3dR+tXVMCzZ3?=HD9yab{R?f| zV_s_8l_Q*&uT@!d847`{qe9#SSxOpx!FAj;_lv^vCN9( zLiqXLWpboJK8n^d0WJwlP)*SvlA2|Al)RByXMZb|=C7-ei959_yo`(|e|{HFPgAjA z7Mx8%f#nu0AFRRf=Y6h@+r$F6-<3|wD>!X%R9*Gz(?zbj`Fm=vdZ*NkjA{|gl_Q6Y zRtwswb2#;@utAdQZ3J`@k(`S+?VBkRP)+Tcv&tf$q6Ha(n|_@BC6ucl7j@ko|J!dE z?^Z5kR>krH$*aDO{R3?2H*)F3?kxvZ@VyGE_Io-TD51yP1ASjt^ALg)})*!TK-sOwYBw3qFUY63wYAqcYQ||m-RO4)e zQEjVBg}&h}$i&z1_p_`r0dcD1P>&2Vam)N;DUS4I-n}}5jyOx&fkv~KU->s`6&S9@ z)`L9S1de+8!AY#u@^1%QB*puUt`-B5&5l_1Mb}}s^|)tEC*gQNc^%!Tv~4Vb#0mQA z;oVWp23i)ck4WfoXIuXz%(6WF3H1cNok}XD_GTcM(0f*v#-+GTz=uVif=z#9f~Y;H zq8z${Jod8+m!>9wKK3&%bmtWRlqHU3^?#-ljd zrpvLNPF$6%4oe|XAQnSsYTq1NHcGyiJ4#8Wot4-HY?l1Wec zR@j!Oy*c?KWyszU{~w?}XWaa|SboD7qOPB}I#(2-t)JBMUZM`j@@DnD%oO4!5~Ccb zlU_2R;rr=e$_WQ)H~2<5oxNMk%u>yRCFaP7xd&{Q^@{pJGzZeV9+i>IcY$38FRZYg&*zb5tcF(&qE{U~1I8ZFY-twy?! zvXDlH8(D1?Ml#z6uY*1HAilq3bg=s`;r4g@1okNR)+7pzNq!@}2T2;A?%XKN7J{fU z9Ln`Lcul2ht%ej!4A)K)hwzWnlX}uI-ZEAigzEkhS0?XCcras2!_Zes&k}kyBZJpn zl!HTNClcrsN6f3L6)7E`Yq9!eA#FF$j$JF9O&E&qj+iR4?9h9dt}@5GnmIcQqXqPz z>Ijf4a~0j)Ih>{48O9vp$?YWtCKV!DBO6xMalDZd=P z%rGT-1H3&J@9R@Pf>;YCwd+R@EE~md}={P|F{P zBLaDDM5@q|-VI3bd(zrH+_P|5?B5;e9Hi35xC$kFW6yURi(|-5xtS_^N-@WAiU^|0k91OMqVd}8fol+0$A7VCAlUV5*U;B$=`F2UPn@weL37L7N)i(oeV)zo? zghy)ehG+=<7>GYm39TQF{kp+-Cz968CGMX5C1)+`V?z4=o{(_7jGQcOx}xc-O8Xb@ zdy+s><)sjwBVAJDjzvPVjHGBqQxC{ru^*;Z|0)oHqFq@oqC$D* z+40TbzppmvIp$|uLW*1cg|RKjSg3e>G%d%!zJ3{3J<`}0At2#ay;Gr5Wv&j5wonE? zM6~_`s64(TjBI2}q46NU%N_>K`X>xPAZ5+OV-(spX2khIGz0XH7-Av@G@SO7xpc87k`f+v7VQ1GT+L4v+aJuQ{ zi~hH|9Y>ZI8`=Q=v&0gCxv2BhLh-;Jf={FtWZ|L&@q?O(GJonUcuZ!iroZNC?Wmlz}|dGLh+v6;5MY}-aT@tpaGOnU_rHUTjqF6uW8MJeZ~ z0dJ4>bLWFkv8R8L{G?l-+&DEsD;&5f4xu@(2&V!5l9ImX8inm(3R7P?ntHgNnfvXf z1C7ClQY?W4^wK5+IgL=-QvFgHXW=M1l^a>XzL(3^jJWJ->hC4t20NG+HuBg*{ks<) z&hTPMSc}20-)B8k#LH!%raGSNyfQJv(FA#ooqRO-BL{bZ%REO?1w1tcDIF__{FuSm zaUG=+9%mofgKwx^suTaoX$)9|fT;%X4@(z~KO9h$sJ^i!G=(6hZ*|7sq5ED%oawxi zTww=2P6M#;B3;xDoR;y<1rr{sD}N07HEtK)B2TapyrOdVSOoc&ob98gW7o-18aYI? z-dEU0;?wN$$B%5J?6mrgJ$w8E)Shqq@SJG^$u8s-1&VJ0$S>acr`vW4pG8s?8JZdj zxCCFP50*ZTpN}V+*CTl;{&j!o^!hcrfdb=PLb)#&;IBJ&3+A9`!8x*`{G1;3FpMo;7}?I|Vo;3-?@3T5RW@^Kixb}gybRcO8+Ps(oH<+o&2 zD05yx>jnJ3a3xV#oJXc|(AeR5tN@z!d9>9rJ)D*|ng^#tfnFF(NRPVWs3>IvvoJlg zQ5A!|9o@a!YP26J0tzL~f?`!-sXOsNW$X4hRjQQI*=0qWgyLnX7Z+=B1UNkN^P&dC zHnFB|HT^}-nxdqXV#f1qutm32<%<~{4bd^809qqj5Re7oO#U7ROJTgmkilgo0lVuL z4c#6rj*zkR$@-C%d0|+2VrcHO`oj*IB&*if>zm|M2oFhu&(z=y!q?-UbrqjH_646k z-Zgq07e@=+mO6;o%pPNfurW@4GrBX?1&g&q3)?*i$TwLG1h0@@yu7Du6n-(G-0Q!7 z@9DmyF=^7N&e3_$#@N>6*0~;vh~vCdY&IEAc!pN_12saZH3~1g_T+K1gTu`}tl%8H z7Y?yQ?HSK)YHnhUDzT7M?>=D4+Z5_mckaNm^D{2$+R@|_PqM|g^X=4LjXw@HlS{$Y zK6mQd91wjo>$U=8JLgoy##@m527Oxl0B&I#SgdZ72{7PHVsB}deLXo2N51Qdw$$X4 z6*V$5?7>?w*e@lPprH*AVDSXiK}!ufKnWS>R#zJI{?Sjh)(9G)nDq%7JVoK=pXW@` zlS^K!q;CLr5Y`=~esW>2Tg`3e^G!99laC+F+>uF4+LHa^ya`jg{}8csUC3B)F7@&T zhuOY~cNqwKG@`Sue@NOOBBLVejf)g2N$?!MGAzW&F8R0n+YXcVD}!i5p6v)lW+WMf znv-tESs0x2l0&L5N112?!^a@?hmiRf$Jh$n7f;=9=+pXfw77#$XK9}(34dli<9&p~hUmdX2vBgv zpC(@+pTa16j89-XZTd?Y#WT(#BQ!H~_rMvtw{)(gPhM`Y2y#OiZ5F8T*R zU+z~5@wN3f=gn139?MDF{2VW?;cqbuBcn_`q%5S!>aYVg-WxH9#qNWX{f>IX< zO+DXI-qKvsk~=E#`l6vClKw-!;xa+yYd-BxvER!hy9$hI%A@FNn{|{M@Y)yW2xVug z(%qApkCg(VPrcWO6x-!IC(B-@hus-|Ql4{XAhm2vNF2bWuXUy7&68H2qD%_bek03_ zf5fd>_N1y_7O=ySPSIz_DhaJS3yVXRZw!QT;~4k}8cUd~7aGVEx20cv|5E6Q%VR#Fp%Ek zFZ{X7-p_|~9e3G~GAja(R=Ah|B;+)ZO;+$O|XL^Og>k`N2QjyH8B`&Sy?SawEVBzhRQFZg$RM9O+yB+~x?2&;qEQza0q!~&P- zS%;6^@7k!3E8$bjPJLaR_o+Qe2#mzW6eu`U`1FTmq6c*kW?q5FrOWWBEbJQ9(BH& zV~Tvm&a5#{J_2ax)6xkD|ER>%*XjTo*CSh&y^&ta+NK2}C_G*$$ z#LoM){Dp!csInA(U*nD)>K2Z)uxhntj_$D}*$hfSo+>sNZHcQXP2BkHps+JzqZF9X zf=36w;?2r{o#?}NWa|8C=EhoQVKf^p)&6qEjQ|-+_c3oP_jiHG-Q8L~sp7eb_^zc$ z0W0|~^d@__aIZk+Zfo7RH7D08{2Z8QEVErPOsMed4Jo0T?@HpFN1R9+TD{f5FPVCj z(=N|@D`d-Y4W(Y_Hh(#wWVN>qA|9yZ$l%wYm36YVQnR-AQth6^27?@P97g^E`r|`D zX9k2~rIKB(mh)e*Q*Xd^s!z`eYD#e8nZ*)MLi_p|YneIHGPnKL+q!Z1)7$S0B!I#C z=*(-u4dgtm}ffT48-XQ_x{S&A(Uv@ZZ*}(#`0w)>#KI;Y)4FNcOLmvY*b!+Lehe_fX0mnTbmuK36Y`!l-N+zr;?3er(TMGwEOF{hYyURj8EE=O~a)+g_75f3y*xWw}ti*7)XHHfPQ8 z8-9VNp^HCPKX+F*j~f-eZ0d-~{Toprf-SL!W{rK&pugv1nqXpV6hdh(QxmIAIdI^! z(dmVf3+>+PvEZhQ--9fj3TfB}XkG%MF@+b32yI03j#w!sD#z&zPAlS8x26fm9T7`g z);;x20p`Bm@9-Ko@nsF%xR~K#RV#%7(A%SqPg8)^KyFovDKa{Od@vq6tRTPpLrIAp z4pzBiovNzR5i=dYXvAUw-b- zW4}oOP!Gc5o%W~_ucRXNB%`t_!NN!h*4*2LR+AM9athzvwx#rS2X$+IYft;l#M!xA zfyL(L0x_s*^Nce6#;}lBsm}Te8=_WK*cKasT&XcS)bOKH;yM9pWIPM58V1Qs@W)0$ z5&Ws>N4FhmNJEgCa-bw-uuyTV+7CMq`sLeT49)r@L={yTno%s6+=!Yr++r;5lUnBI z^ogo!#xPLgkx5UL9#LuMpowg0cTJD{s%@3V#~*W))|$G!^6I3uDE!gAMLzZDoD5g~(jhC))YW+!fEX=|*E@)p`RV+qlo= zIC*0D%F|83sw&nn-oYrn4`<79eXo%Mm@1_4gJ>Rbt&n>4CNc(Z&47; z2j5@M57lEHHy=m}MRUkQTl-(#LIeYz^iR(OVd1rt^a#OPWZ_ z%j@GiH6u)J`z<$+bZL{ay#E|C?`hhvCaDvV)7n9P2WTuya2w9O@B!VJ>Oa8QcTY9G z_;smuas>(&0{*VE?C&Gxf(^dt%XwX>gSn|LTS6!FWEM4B){xSDe7kX5C#d-=e^qK(%@q{t~p5pQ+FoxlaP=bxXp(vY{ZHd zh2xQopJq6mBUIrf5?MRQ{QfHQ%72d=;G>>`tAIKU1% zj<39o`}hs7Jl(CB#ZKU%v*az*i5^eHPx9R!diMP``-yCkimA$|)vgOd>O3hA_@)0% zJXe*9?)br*Q6TSXP4!K`TrIH>oQ{LtIDNJ4eg}0Q4sUXf+SAG@?d=FHo1y$+0d_&m zHx=wA&$8$b^>Uzb?%w$>Ad&w@Pn`c}u$Oxu3y_1NKHE~by=+Y;kvsO~n&K3b|Kg=J zfDZBQNR=kmjG~%%drI$%Ln?7eS*hrEK*Bvb8D@* zLU;)i5nHDFVC$T%vi*t*lw|W$ko3ghiKo*bFN_DLzAK?LQc$>{=-Kt7T9Y^O=`6Mu zmzvxXSX)l^T>b6^1#)HeHMz9{WQM!Bd0R#%&%~!rtd9X%p%EvLZe=EX)7aw1Y&XhgzGQl82LBLi8sgnUM`M?LhW-aY9!C;tUo+KB?(t= zeu{D6jRLv6`8E_4i{33ULRm4OO37zv4X*23NL1tsgohI$g2MGXdbEzIjV6|=;0hv{ zp}p|pu^)zVAoKANu|DyKfnd~WuZ}+sT+Zf`QueKK)4$SpRHGP=al~FudbA-m@iffi z0zBvZ(h3A_MN$5JPesuQff|RE-v2R>v5{oKJl`DynTi1Ve;Q zTRMwyD*&-qb}si>4)WWG@oe+iEVLH%tgqwI%bPR~h}u>+3odrgdh#tbWZ{qPf$$DF zzFcATf>%PrY{#Rlvjhm9W-gE!Kawn^)6C=k;;Lv{cQ?u`<+RvlxLYoZjF{G(NtWvF zTwFf@V%91j@m9dSeMXUxh}tyZ=lc&ZqNgGcjZeD3J@2PTpyOVeIJJNum7kkQgNLxjpefSKk&U6U}7Z;k+ zpyi-@9fhILi95nTePk(kE}Y3Ck0S|NKDae_?JLmS<2Dxg!v@mjHrpfXWI(su+56Mm zXUw9l4f6qQOa02U6vU)j*Oe8gMobSe>8Kzw@FIxuGrWR}ZQ28eTg^2|ACNCn)9&du zgnJN|rKb}qm-tA2e2j1b(!VGe9o#@k?80g?Np7{EUN%w`QuQMl@5WeERl)`GBka_L z6JmdT=>B_by2$DyYyV{?ua*W#t-YgyedHOo2b)7k#)-+RC zxQwAuq7O7>E+C7h2N;Xf=t2bls3sViU$Y=#woOqQ|fjzth`pPNZu zpg*b>uJRn{&!K7*+4O1R5ZGh^9q52vBI0H;Mw`&ggM^A|!K+X5qY=-25ft`1#-gbcSejlk9D3o`n znMR9BgW770>G~b_V{{Va@7Lip2!#^^|-qHFU*zkDG z87c6^?5pBB7eiP|4A&`Y{6ouU&}Z_|f@XA8k4`^}XSWy_$>#ahiw)JGt{};d0o;so zuhh39l#rHK#CTIewRaJ9;+BhkhK=!q)h`w^?wg(y@>V2b3SJ{FX&&lbo9P zCv{l`$rALVqZK3@dsZ5XX{9pl%OeuBWe(?m1Dk z;jc*Ysx5-2&soFkz?#v4LVLR zv@f0%eo*GS%g~BX5Di1F4ilh-;{3$7se8<}mC+d>P8PW%nTToTY3DKtCFHR#{l6P! z=gUd8(XU312nLL>F9QmD35CbphtpezECnk5=v58idaN~#XIJ@0!7KqLW{i?L&0EQX zQd+?t4^auJsi|l}8aN1Rq4xx5McgbJfD$@OJtRARmKCnxo zg@8qW6drF&-KAI4q0DM)7o`x!&$d?Aq%lBDuXpItHvsxrp*hwE2Di3Ix<7Y%K+MlReh@&0OZ?I=do5>!~4%gpd-B z_foq!kD~b#@Kb!;q!JtPH1imX9@7M4xf(dL}=vND!OIr5yx z*Pt%f!JaV68_EKJVk!}YHNw1m00;oAwhKu=)h|`z+W(MdUJbL3)XReKa6fQPnYbg< zschHn%-Xx)oa_vg{@e++5Kv#_rf8E>O7h+@4ilh(IT_MBi}eYsXamybtnn4ld`?4K z@uYxeP0m4e;m&r1ewEsW4R#>@<47RW>V`f+{>5u$R5gs94O?fmLRZ)r|JOWEa~9QoqhqW7b&Uv({&_Vy7x z5?E@G6Yw=mfJ=XZ8E1EDXg+Aj**WQ5k9GrBWLQ5tPt3U??oD{B_77*PVBpAOyuN-7 zIhBOd!DKi!({WM@)QXf`4LrdvQ0kjMm|y1`y-s(nNeU+h?l|kZhSjHmR9pHA!(XoD z*gPdTwl`(AnFcQFSYNK;)C6$U(dp!o0_ttlyeu=fNHCp|d{q883s&#vEP+u9pX|Wzmg^DCRX3tAGZs&XFEF$QBB=$Q!%Aemy< zq$;J2v&;q4?s(I0Rvjnka$s!XRl^8>$J%-xlyTPMRMH02zJd~l`CZ#Vw{qqwyS8+D8uHBS{I6H|6gnb*qhau5?By4 z&W#z2u^d)p6dz|~T}dt4CiG@XK!bt$xe?N%cmC0(p^Y#6DHYjEE7RJ4*zaP zjRCh}u4X~irAF1-t&sPDh9|HIABA_!(5iWkv#GW$lXY4nDNA$dP%b@DD(6i})UoKU zMaQ;tm@{l*l(%(zzmN&e<6fThJ5y|GsGF)Z>#nfWIx+1F?RyAy(xNN=g-1fl=01z>oXrH2 zJU({6ax>;#^0?}FyWc2Va{T<3n^BC9=NzMDMO!}rx>cIU3NHpntQahHMQ|+#Wm+5h zI&vX0q`$AOw81?E?FBR%-Oi~VK4sdfH;3CXeuQJ>`s^*KJ+*^pp0K=%D7IJjDJC}H zVt9>6za(q?=&8$K8!7M*GKk{l*o|sF0*>0DVs0l_p4|CjFRrdutRAniQVI7vnlxPbpJf>8A&`PwZ?#~O-Qn`yk zTwwG_UFFu~5}cx_$Bn^5iZHU@Zd9`8HInHxmehKyiIKcV+2vHy&iKTs z-$PukeqNgZcX`$7qdQRa+#8b&X~09ZoSPK2RSHs9mUlh6m$?Et#~6_|O_p{evxtkU z^Q!7rbb94oo)et+wdsB~N?C^%fjkS(f}*vrl?Q&m6egQ`q&V~?n@&VH3OD?p4E7O& zk%gMBnH(c`((u&3X0+9Yc1Z62$h&D+i3>-ZF--}{ zl(GJvg~gHAq&Mzx=hlnB6O|O&vch|3&>jm%I5PzgQ{Hcn$6xgZl@AhjE+#+^a&6BaR{NKs z9b?xZGGum7oE`{xuAH4k{;A?-&%~;Vk$bY8SEy71)v`u+=F|U~B+$M8u;UZ{47j!S zj3AuFyN1~(t#*;H29!1vMbg$3yQWicC}ExPyBadOQT+p$o4>)R8;xb~q^y&=qAHcL zXa4=NyL+9jnb7g>TIqV2Wqs8Ls<8OAX!>eyL8LbMp=vopRyIqtJ4apU&iM9jWXrD< zHZ#_W27vxzbBg?_W|3Mp%#tBTzlv>&eZY=o@p~ARC2|STLzDC*9j2I}yyqyT2P!Q( zs-lvfWdMhN0J!~=tSR9?c9K3}p4#KJ4W3vNt{bB6A9ygKarPO1X3+KTc*%K&4Fhr; zB5LI_gWey4X(gf#9h%>@#v|xXP(uZ&U6tifsNEP_>;|lQOtB-JxyIjz2luh~>4#xQDh&|7XQL zrb36dHaYOe_U+2KPg`YDiH=b2QB9s;wRhnN3lsVOuys~ZZG;WCrp1c46etj&NGR^^ z6nA%bClItag`&mXDXzg?iw38-1S#(B+LQ15|Fh1`xy{8pYh}&F%${dIdy;{RN1n~G z5@*nk^Gu+y~%HMoA5p_&xIa0HG zmBb7g(Pp9E+9^IcT5##VcP6X@4{O-^E=yIpaDLyA)0d4oiqN;w)x(RALqod7k1Gt4 z{;DXrHw?N$a$$7Q{MY8Z6QL3m4_W$5TYY8J&MLKT_L0EFL zd_T3mrtvtTQ0Gw;(^LkI#R^Yr<>QY2aNv1H7dd`B*7GPL8gq52EWFt#eD*=PzZN>u znY}LigbUlrBW%wZ~1AVKSetEzH{or0;1hrTK!jKQKfx0{fYIrjEL`~8sYTH48 zOSYmpnV4an5K7Zw#~7vftn4$m2RdTrBQj=JOGt=0P`3nv4ax0Yhxp=UNvedzg(rkX z>NA?7pdMYOJJ#r4amUI7INg`Gl<5TcQ(}E{)xzebj3^G`3L~bnfO}@Td>ywqX|X?| z#*4R`4lb;OaoA4a7C7&|T)q?WW=!JJhr2&OIkoc(ldQfX9a9-L;zoz;q2qXap7~Hw zuORenXo$T)SVy7}QWu>`FYU&JIK(n1>=#>tt0two-&0yARq6b& zoMKKbOd+oZ5IuC}*~)H~li8Qg1R}_wS|ZloY>v<=u}g#Iw7FV2sr#oM%$msg!{N?H$3P&VD!Ym9z&Q1749 zlMEjlRsphMOMjb@LyTX8e$ydT zsiKqFE(Sk5dTb8zpu+GqDSZz#OFF`IUvnQkU?A$j)kDlO7-#;>C=xBL2dw3|`oWV# zL26>P94WjHEI0J6V;T4F8`*CHTQSw7qBy^cJ}%KL9Q7v=@~JoRdz4Nd5}Lv%qv&j} znPyX9dY<&uezT}$GRJUIkjb&c#u<$|AX!@;AhW1?G^w?yGQhp@$dbn%e8=`u*gI5r^0BB?P+tKvzHUBbnG zrZbNn`w54A(5+>M9ig;i09IxVmS6%~SwQCW*ZRHz zDIl1=4RDoY_y6j`h=m3Z~zYUSzE1 zP4Bi%`K}Rdv|1%1TV(e)ziC38{w@|oxE%+c;e~K|b5wdEC6dAYm9iiTTSukxNY@Xz z`CZXJmK3?(7ttf(5{QYO4cwM&envWYpE>%X)(i0UOvWIsztu*V0x-06w~khHi?3p-~4hveLU7jZ+yp z@3`D#(0|N-S1aJj#@NDGWZT=Z4lew`5?_@hO72K((8{z7emH8W=EQom+Y82i_n>ED z=q8_I!>FW_jxB+1?RpCDPt5pRc~(G7dt{f66`j1YxTJo}F7Z!!eRcenifGkXX;87o z+;!Oj?h<3mmtymgbLfRfSOLmkOJaZD zz+7{!ozD>WAC(dvi)^c1or?5njU+TNsQh+acwC?!Oodq8oDbJ!~xx}(&g2@g13AKwSJI(L^HvK#zv!}2i+oKZUUu1D>*NloM7mqTD z%EGEabxN!Fjw(;_XX}%q?)KaxkMBvaO0C?^aAADr?(D58eNI_rFGyeKTZ)R~0u{MubvD+FSX0L0W` z7K?*fa@F@m5CcsAtiGr*^il%F-t)@KR^}G6_NGR6CEomIZ`^|E!Xi2V7{8IjF2*sO z-Wi1-$Kww8Y`17b=RMVUPK8uY@)+YydyMBRk}dWv3kDOAQMc}C9JM!$r|?W<%rMZ~ zJ2sS7+exJsT!B~Z{_ty{nh1swpD_S}IicAYAEUOUm|qf9xqJjI||g#nkLNQdp`bdgI5eaQ8lt%nu7YZKqdE!@EhSDXlG}uBXhflwSgXV>-+T^}?Qq+H6 z6q`OzS+T3(A^0a*pxFgJ7tP(Q1$cfLS3A-!f>2++GeJQR;y8m-FW)nJir?YIQA$_c zS!HQhx2erY0AoMweQe80+z8Z?CI48nImJRA`&^|;#{W4WcCgjC`D*yFFPB3k0xsaU zGh5ryarOU)An>mGg9FI;E_1Y*VC#}bR_46V8F5tSCn?UP7uB8)h+U2mH52e;$*=lH7*}*}-QSJKg*S-#Ny}NLe_iQV!W1ny4ExeGZX} zB6#$oziqwg4#*5(nol++5U5yUq`;5`mfp(1raw!c6>4;m*&P*t+m*cvI4OB8i9Rg# zW6M?2;|RQG*NOA-tRlMp@hGByA6&#;-NV*nUx7v}n{Pf&y;8|1o~{!k$`Kg&o+G!7 zZ4zK?LBpOlNHVDN@|rUmkK3eJC9XBToW%Bccn?x)se?aMVf1IEIRLp~4hoZNC6_qh>3=OYqZOi&T4wWG`h-Y|upb;aX-upsb48v$)NPA@Jv%)`Kzv$S?mqRAf zF7xZhg4DyQB$=pEc1WIsO+F}dcp^dw#w_>8K|<<)wryzRj ztH;`k6qwF+qjoj=Q=h-xZwak=?QU%ue$N;|$FgtM8^X;{5)l$L`*~-27@DWDu=a<+ z0gpX;{d99cI|9E|lQF_KRQU^@0Yjd!mgHh3fY%jY)Q7Yw-6e%IO4got%>F~8Sih@l zRzFQ;eUbo$Mm zXCA@4Gw+^W#lkiG+mZAjc+gtPu zovG_&0PmWb9*YvnA^jIwL2rjf-v15MM&(mc;sXbH@U0aeJ`P5d%1slRCiBT4=WDUF z(4?^r5`MqEisK>tUF1-=dwZ#Y>8K0j&)8L=Trg|IZfVL$CyM<56I|AKJ4;hZDu6B>$S$;LPPL9n5AICiD0NAh2-CDBYa86sm8-zJpsTgcytAoNn~eXH?)l)GD#$s! zQZDdLO%Gn{n7`>)#FVmfxWabrhHE{c?QTfd6MkjRAE?=rj-B zLuuLIrJ7r-Q}UxKa$iphu=H>m`;yC771x*=@B0%0>b40}yP-lH^;-JfP@=*a{QeVK z@86xa9!2`{<#oiepXtlN*vX*&q zThJ@DU3p2p(C2Y`E`UNEatdJrjp@<=ySiq)#t#{+`(uRI59rDn%5Re=<>cRbP6%s~ zF!Uh$$Ban*O)3TbNXRKnK>3Ro-*Q93>*eh2R%j79j9e4<@v<7#ll~RO9K_;FY6!&|mNXx8^8mw`q036}-_9^j4q3XH;akCa$#MI{Tmb{oK z1x{!W7v}37*xILO56u4SPKU`Fu~bwW#*;5GfgO10H_=O}(mIvp1Eid}mpU#gQ5ZKnM^x_00p5D7CS6 zHePMaHmK6u6?{9P8=IF@2iZO-&c`S<5;QAu6{p0f6G;JL4~?>RTa?tra}PYKY>f=k z8TuQg<+wiKXPQS@>yXJ%2!~(gbyZ_acoqnUTC!d-rEx_OL$VnT&wKIbHK+dIdOtQF z>>oTE>fgd9{W)|8|*?iAG<3SQ>eMOlsE|pKA2W`sjJy91&0pK`qoB$e#fDk z%oH(0GUVd*mVq{M=1^8Hr6zQ`D5zf57>@BEOHh-S$&pi&gJj`csV6W8onZo(&-Ztw?a(UU2Gnu&A*!#~ zN0HB|ZkivWoX&pRh1E}&vFa7SwTNqLQ^=o*al4~yR*zI9CHI4q8r{{T;Z#+{TCN#Z zcs4WF1oh9!>4J1G?Voke1VvuKFBgOWe2>Q?OJ$PRsygx5VO~MfEd70=ZWBS4TytNOCr$wmlZti zLcE0Jx5>b`!uVPwI6$`Y{y!&>$DyGCO8ouv|e@=jdR`B?tMA*{HW424(9jemm zHBXpS!^I$fl0R)34~88c=cEYz81WvR&j|KYJDQt+^WHK2h>7-^S0lJCL6o+*snT{X zChm|-wRom(TzGtU3)j3aHR*sEEL}$I>A5xESFaG|$~9;)nm=R)1zCq4Rq{48Q#1nv z=o%4JyEl}w#o!>>HB{QmZ$Y7ont>OULz6$zv&exn*Xz=XZ zn4;A&Yf49ZSDd)n+~#wxs$vRf$YTF@;YX7X*Tz7%@bNC z@~lEo!wp1%wz9T$vGgrsNMS|OHc05(GOj9RDAIfX;p6qI2dxqyGGQ4K{*&m9@%{bX zt7Z7Xftsv*^s!n4gBkZ}NZ~^eud|QejDj^FCcjXta&f3sRikaBI^zDKfD+!Hv`D2CG4$Dp`KeRE}KN^xt54I!IkehVSoK% zYbQkN`4#x)u-mb2=SPd|W4~~W(b0p%>G$=q8*0Q19ge@so+e;Fkx^I1k04eZ&63;- zucHTD45QI{Uz5jdHPQfEre~KEryH{2mK}IGO?_Yb#`&K22C-4fazZ1D*f{h;Pt244 zKvv~aBv7H;a`#eb_YG53PI^lpN?zl2QTCQY<$nK9~qebn_jwS*|P?4T|EY!B>!AzBnugOHr1h8+kfy-T;NXeWbIHd>| z%ygSqNqm>5=-XAoe;)3ru1Z~CBlFwk4{<2J9bOVI58vGXCDsxzw+UTQ!>x;}3T)uz zSN4N$%C0|ts}FKZbN%AQ5fvX<)Y|wBkf7jdF7O^+G-@TV|DNmN2r6Xy-B?tTBhMgv zN&TY*fT6tL#7vV1_!ygB4%H(61%KKfNqRZ!AuluZ53}^$>VBf}U(xAb{ES|eLzOlC z;(9y=Zc4avY^kPfbSuog#l!B${g(6v9fM>u?}5x5nGj2kT!vi%uGfz(^LrOFgDpfc z;7Rw+wxMj`28hdz+Wc`^XP!kUU4q=AmK;IY+Aj1~y`y)H)2f9j@E1vfHv;`{TWdz| zjSB3VHcT@~F8cYPtecv%?XP)S0`~aW+{KT$5x15==Y==%9B-9718nice45TalLs=&ud>L z%cDpK_AY~pi1Tz|s+-!97L_p`%UdxcsvTs*W(2s9T7-mHXO-7`e14lIuh<=(@MYJy zb9B{T^N(9KvSbCY?Re#aBgT}NgIi>}1Tm>;tvcIHi#x_;J%$oXi?3Km9ls_CANi@2 zt@5{<)oR!mBE(3Cz>PD$_#(3vr97Br?Mk&`Y}YL8mOfH&SxSnHaO|_-Io-nX z!y#V>(lEpt=)J_3DfFGjH%h%%%iLI=n3IHc)S^zEwER&!Q88-1V1NO<2e8Fr4KvV- z*{IRzHfH7mGz6VWW$X~xhw@nm=##)@WM*+%NOQ$&9Epr)LQ zLy%xVWEgSKDnwV}V^3|_5TYBn+e>RE`+}l8xuaGGcCZq(hE=Ajvzx_sP5e-=QlzG2;%BqnD}q`_bbbE=WRik%l^X2De{d@rpEkk8P6wWVac#9UfFq zgpNYW0`4+yWwTOr9FvB>Asr|4;;H5IHG_yhu_J$AXimZgpZaTB?npgPPz?+t`hE|& zo%n}P;!VC&@Nq{b^9#~X4A0N%X97ZW>ZeWGoA~9j$b;_-zqhGL^^JzRDCq1A8Veov z()G)Iz+=?M^wDUKwu&Qj;9&tcgeA?ChK{MC;1xAVOGuMhqPT@-pdmrzk&UElH|$+; zODGI-om^kak+)q1L){XSzAy063k`bUJs1X6qZ@c&Xyy>d&k!(#;s*rg_Qn&oXf&1? z&O+MHr~LiP-}`cZzPq1Qt}=j?eyAV4*kN|PdQI{Grqx)ql}`35Jcvqz2O77^3O!bt z+<`@%O_vBC`=uguE=xhGk2A4erAD;!;p;={S>~xUO}0J6^je!Axd)mOQV|CZFdU2C zY$rj@cfr3Pla9^Wzizfr@JW?u6IB!N7%(MT34fzr(d4}*12g5&+qR$C)$Op5sx+32 z%aHq4jp$d&zh9sAE^|hEEQubSX<*zOmHk7wk@MWI=-!E(GRzom_i}Hjl5ep6+mwCp zirr31Ua~8iA>DqHODWfcc(l`xqE1K2J>eI+o~;8QtejQ;M!;?GVL}w{K#Mg{-~Cj~AFTZbThh%1=2n-KkT#=7m`b1Kq& zRbt6mnv5l4P#hKhdfIltYIs4W`NLjnfpkCN(Rm@E74X5GuxQIr zPJi?pAt7W=f_uuEh~cfbJObOU>?Fm(*c-}>4Pk_hocA*pu_2WSi|p^O*si`fqb-iW z0%d99`BZ#9YQbnm>8W6lP%{yFhvvAn#^W+uOBejQoK(KkUwtx`faKgonFE>YE&0|A z?yT^yXxU-i{jawGtv*{USYNt@Mg)qy!@FD6mAztAqvC?f1$7A@o7z;ns~=&6j)N)$ zCC0X-N)l01Y6iyQvRBl!jshU*)b~}Oug<>`d~)~cwB{3r0mHa(f>cU&AAtrT@j@t6 zR;cV(r+sODg<)s?_$&um*FdFKP*M3Xk(Hto-9!ZLpPVuAsF5H&Te|~C270f7<2YUe zrpekj8aNFe5|f^e=Lq`+j8GG_vOeYHFY@0I<=y%T5G=!wOR2g6)r)rG~vxt|Z%|*I9I0d^*m@6YRNIc@6H{BE@2NomI7L?M_GCk8k;$zTSFvFer;3t9p-q zq+Bnx7So&>;2>ddZ)ex)=|8@ASh}^eBw8KsYR6Z<6EnKeh&kq$%IKg#zh{KWN^l@f z{~y#Q^{A1*^-NniNIM`7@ya+@ zXqt?Z<*lp&*TpCvx#~eakGL=%kB6v@`&}n+h`#dwn`a}IbdEXS+D(> z<)R_n`S>L)WGj4FW#r3LzZC;V)>khO|0(T(AyaI;9W&OXNc~R(E*zakmap|sO12L{ zGsC{kS59dz$))_=5w^R=1w_KKX_m_(<3=%G2hDd^Vh4r@gT>_$sj90Z2*&b8q=6Jm z@=jbC`5hU%&x6*FUdOAmMuwNGc+ESmG-Ee3jJFF0haov((4vkBmWPN5nxlbSfeS8t zaEb0gNC|Bn-2~zKkCw8p2^kXk=PXfLbe<_OCeD~Vl((NPx9uUG%x9m4#n>_xU=Z$mfR&~=GA zUq{{SF+jZmto3Qi((=(g%@ziBh5@pCHo5VzReHb<^z=(!)cCdyKjpo?P6<2J9t&Xg z792S7unDCT|C!IeghaV!7YmM9k~F)9Fr=r66nOjP5ua4dErFsp1$$wao%H_@$SaHe z(y=v-mWJ$TBsVvN>mt>qBon^wwIhT9QriWT97%5-?NB%>7#j8fNo}8Pg^siy*Y!GR z)SV3~h^K4wb@mznZ>N5gHK^+JCudmj>&^U3+jP{5L#Hblb6w7hvV}Gk$a0RRZQF$w z9ClM@#T-o({MAY(MlR+*i&owAx=!KRd%KGpD|c)-<9n2*$T-!=zUyimBfJgMV$_dk zOVXuRXTnpb%2q_SC#}2Px-tmYqxzJ}Z1G^c^E#7QIT*_@oh&}L-`ut_;&}Yi4}HMi zLGo!I%2sX<+{Oq&7ns9N9!Pn=75SC6BG_k)ORMZjOsIsIPt)ro<(!cbXS*^u*NXei zsNx-yo^7US+Nr*6VPb1f<_NsMYj*djcH3sDL+#Y99G5gUN;Cg#qsBkhQzyr;XAN_8 zl(!tW%BJ)7L{z!~wWpjgR_~$?&N0!=2}zIM*a64#n5{D4;hV&Tg1lm_ktq{vbud?w z=2z2&L`ng*68;Jzbp+a~8#|EG7(waMu3lzA`YTQLRd=b;aDcVQKLn{)Fbl)f(t~3P zkGg!I#BHdy%N_f&y$0_BTXKqQ&dQKeF`3nX9ZS5@vW7~6ssYaJSQYw>eF|IF(9DwW zcJl~X4$tIDHkS{6qTU|IyKyc;)~rJ%?4nI}_nvH`myc3*+sI7lo$_7h1%e9jM8ScJ zDk}<#Gv4|#T`A5tm6oA93h%PeBr#d+Ea01enzE-Sk7@b^^#%5}a{#BQPPPZPMHKV~?^^iB?C)trYCgplOf9q(;55r0Fp3vI5YOW*> z&eXOGCVDNKIXo?!ICta0D@hMkk(|?~N3X!l7}39BTCD4*vFtdIl=W(IAKJ}u{dB@M z%WQSPD%dW@LEF{Oc*R`YcZCIorJswi2qy= z{hqeSc}OB*bEP@2s)%iP;b`0gCbO)K6gXZm@GCT51|(Pr{;>=A;$1)NkDquL%knA1 zwuA_WAtQviPq(HrQTfD+Y;s#4wkV>jG+>CO2ftI~u|oBNiGm^@R%XY1q`5?3eCAQM z8GKedd(y7ho)?F0)#2MZudOaWi{ohQgv5E2yFL0D#W806(1O8dN+^1g?wDEup9@(-8&TH98njdH z=~DBu>UW6nCFv<=Dc6pO5{_+hvEH%fc=bk>ypFq$wQjTE{X^LAs+oyA1?%ob?ke-d zt}0I3J#Ub-ag;oQs*Kmh4CgfSyOe38t*AKo5=AOYG&cXVJF1S6%Q4jCO!yjsaClMx z0!*4SSmHY{9lqjS;_)%7lO?a z%1X%xdMoKRw^)2ePi4PKYEDRUL87TskEM1-nkL2R8eDbRV{O)G#&eL9v<^tKzm#sW zay@At)@I?PrR%b0e(}IJ)J1Nb?rlk!K~rD5!7H;&Ra2Geh&ozh85_hJBB*t>PBh7g zAIJan4?*rW>2k^sbjFfKW)9FSyEada3QqD9u^JVGij02|;Q>sr8)SQHbj;UDaj7TE z$CB~mF6-LXMJBQPi5a1e35V}`XO~Q|cG+C#E)AbZk3p`Oow&49Aa=X$p3p_mq@!NwW4#Tb=+YwE=}s+jxjmVU zN}dXp-$Bc|yWZa&8)Q~1A8KMzDUK4Aql+jonBV0WFZCZ_LK);TPQKaSt-S(Iz;7dJ z=IFVDhBf_07G(}2?@K|Wr%%z^De9D(pBU%AB^@Z6C3}1*-{3(JbD(MaeM*DiIo15^hi+_enD{Uf+N5E?(NA zWyT;!lBBkgq-~eHtpSDu`G`~eKaeC{=iprw=9)ts{UOKiV?Bg&O> z(6wbJ2X+*HY*@c9&Vf3Tt@{Gz7fXe>)0a2YEIp!|h^g!x<&~j`%YBRvG zXj@zLs^sg!itj&!PTSOZ+~v`st!nYb=k7)mwZfa|aF|<5aGM5dLPFs!xzqCxFzer& z@{O^=r|E~Rbj#-Lks6Kg6Q232s-oK!dE4`?RDBVMn%a+RI?*yi0n(;pDlbbRT2u;= zyE5NbE22@aK=+AtoD)53pL^4i!XD*zIb>(+ds*tiW!)pJF{eD{A0MZyAhYqisOaLK z*))Y~X9EVle5E00>`MHz^*BXfsLvn@Mk3F?6^iwTn!`-j!8e;?Y^XD;77Eb=yhqf6 zBiZLA7AKMgQ^ara3a3 za91GQ3++(fs7Rpjf_=@?^bpw@+&a0X0)oW9dnb;3jZFKRh1P4NQq!@ zADVtIN|yqA0XAqJMmLctMA~Y`!UMSg2Ms#NUw0#e!UFS`*U$9A2S4lS!-QP2bX4MC zkb5~t+pF_g{QTE(bw2MfsEzL5?SZ0=QMbk=|-)_$I{hP}|Ye zTnXwh{>98)fA+QO(C3UE>I?|z(AH~J?ztpo8rD2G~Cd$wB+2dlZo@y zryTe01 zf4&SLTiInC4J&-?+->*}Y{>#W&4_I{6szisT_@s`je~$4uSU73^{56{4xE=um4kZC3Y#rbqnUv#391NRY5o zb;&{)zREW33tcPAm-qNqJL%0xIenWV$@G({`0WH_(fXS{?GVU2OH*30pzjA@tmyfo zlWk=X)exUPdb?&w;_wZ-b?W^OvI5r&r0ci2^Q{<8+6_m^_zuTCdPZIPSowS+;raYL zU~B(_$BT${lk&h?(!;uuMM#f1N6qf~C_HA1m5Wh~{K+ni1L}XMW`J0+`}Oh%EMxsc z*d-W*`5S0IywSOeAMR&lMY;T+-+R+?JeQM3!4gV z2_<;Dd!T|{R1ko+T$a>MRziCZfa!mw++l`Mp<#)N4y3c*bxx++P6lC2u(jY<2dmtXH5(vwyEO80PO5g$PcK%r0Fa=UAD)cucEAioMa z)ZhRewyO)wZGQJ5WhGY85raB8%H(6Zwv&fQ*w;(E?SZ39&s{VE(Ax;dyrb{`{(OCE?&wuCZjcY+hlC zrcs8)IpYACg7ronC%0@>d@DSeR_Y5S0}`3Z+zABeRV2K=ZXhW|q8-Zut=9<=Nsqp` zcqehc1c95ke;|b-k93|>(`%2@g;R*JYxv>)YV>OfCE}rn#KvBg5olc+Or*S;g$^FK zn{VX$&o-=8@lh<+PzsmN7X)rZzpb79CgGqKG8jHB$YX#yJ|4Qln`m9y`@M<&?D;Ki zJ%wh1lt4YJ)9ju|2%Y3Cn-{~1apYM{;&hRmc&Cs=E}Bx^a#9JwFA;bXo5W~v!hDB@ zbRr;`RwCt{<-3lG*DS<)H^f~#WvG2_bFMJebg|Za(+Iy6*Xejy0?g2b%&L=mpxjh@ zlr(!5Km+OPHvPh?q#G(!p+C#@Lx(bs(cc!Bb@d_0g9M5YL;$XJ)*Ix9li%5W`*J zTV;+j^j#q+L`H69N%$XvBU4SoytG~tze;X4?G^dSfLlWNXHrYh>Z|o~6MzBZ#flBn zfnvs-oFhB%AA((M$Lb+*{_M&qu&vX*HQ|#N)1Z9;s+}IS zmCM#4wI_G%ptSPrO`Pz6#Ol^gb3OrVdRgW)2!{E*G6@m3TsYcElla z-??cswvb@}x_aDRecPlPVX|zh>Q%Ecla{CUpub4u2zZ-DI!N|$qNIzbvbRRt&)}%} zb~D4tw2{f+eH9_{r#My|7E@T6Q0$m-LpuywlEK7%Ce!*kU9#MJ60323{R+U3r@zWO zbFkASwsp{`8Dt2Vtkbi+hZH@4*9QLzsx`%%9m*}QxK)v)oCB9*)CQEam_uS8vpgR5 z;Nr;!M+L(R^hIFYB7!^GCma?d)rDkb*Rxoelf+J6w>>Wcr*zBI^x^`23qBOvH0Ah2 z<858_E6cU*kEf&>&8Jr5HS~#Gu35S&ZV7mT?QfbMNWf6S7;+>#R)l@j-Uev=t~o=k zwRwWj>%8c{u%q?jNZSzHn zXuhS8M+yspc1R#Ftx^XOH`F`tE;I_aEv-?xM~GUv9OxMU3_^ ztPuAUzpq^9Q#J41Y;>7t%?Bj=>~))YOYNEXtH=Pd+uyVz-d!a0KbImb1bS7NiBbTM zJ&;9@6MUN~Xq>86%)iuk(K^7*A2k9Wn;mDde`mLYa6O(|2CtorNV{?jyAOIg0e@hQ zz29X~&9MIl3HG42kjHRzTI?2|nCx7sHgE@vT^hV{0qxez8eF;!uV*&2=k9QKYOv?vGCIvOs3&&XO8?CGzT$uhvhz zm**WYriEbZR8jo{!Z|zn^Yy2EBiCsg-Dx&w0#Z26^-z@B+i5ho#e}Fw(q|gJz#gmh zA|yao1-XSe3Eln8{~zPaCDJYZG1`L~n(A|)?D|3Tf7K}mNC-0Iv>l<;m1a5Rd(y4Gk8PMPSf8dG#@AWe)9(-nfgbnJd?5L!Qh^52qzkJI3#F5ik zZS@b~dDD8)!#>Bn#$@ZKv#wH=C&|ncjZxCFyaJ>!Pue{OoeqMdSfVifbJajeyCh2M z&)&D&x3~B#y!p}PDeCO}0#EboazcC_axVJ5#E?oaa3wR5rOJjUMTGG`{x5Q?&+h$ZL2E9!E+Sow58QSk^i?U^8d^0!2jG2+MAxU21py@D7Be9qgs5Hly}#4 z!1z%YF=B^bj{9-5&6_ak>k?DhOt+58;@kR7;O(mUs7>u0d6vtNgiB7vo$`R}0etyI zgno{tAv0V*gVo}P8>mtk6V>=JY?E&2%Kkt_-1go6%CGC>K%ZlNPjob)>AZvIEIq_i z&vGlZue2xvvFnWv5)W9cFt%dB847=f_@si3W*}9b(!F$95vuBC0({BtBAC!>v~>6G zEH>NJ(gZ=w%dg#ftq$zmMx>Uehf!o`ORs7vq78Tl_N$9rj!<~}70;yK ztA$d-n$SbUy==aamX@5sj4b@f7EE2R7{^2AZ+MUUw=fHm^<@4yPqvUFY}rHh@M_li zlc&h$0)s(R=jcF>KPi_Bsr3CjHQ!i*c!NFgeEFBA9f9i-)7o%Eh*(Tbn4COI*&OwD zc9+%s`WP&b^eI+}M&eY|ib`leYekxD1Mh5RLr(HG$^-WyA>A=gM#uRSfyN^x$mcqK zvGDb*W8dP&8$7BxGx+XJ{g}|9!weP&WWr=5(bUIW;#gV?cc=;^N5i>^X1o6rJTLc7 z=b`sIk{1~lHtp7E44_@!-o~^AyLB>6J1)4z0WrJH`~uP*%KN1+9I~cgR@9sfC?Plb z8y%Sy^Wu8{+1?&r(Zq=CBvzwa>Z%W4_66976(VlkAk)i{H`J4+$~>sIsEA$)cepZH z$K3za(Tb=dUYnb^kor{eD4(lJI;rratu%EH2y+Y7C0GS9t2hEf+V=RiQIp8}_@H)m ze=bFQM1PtY-C4!OpO)#3epp^_{xPJj9P$7ztn@8lXrZZgy{ZbvTY<7YQmfWLzn-5& z#@l?hY^jzkt&>0vntry{N-)2-la`Si9d)J__K9x}P{JRLNsh3L&ysfzSs|qK%)AE?f!rRt;e}fdDIvvyK z&aLaM27$!m>)$*Jy^Hx#0os9TK6pFzF&=+4O$eZG4z;PHv@yfI-4%rSpeuvszeD@f zk1Goy_R{ioJCO6_&(C#5_(=Z{hMb36lSNluXYgG~vscO{N#x2=R|#J=Y1I2nx0_1A zDaA2QyutISGwbJV%YgvDdnfkc`8)wA2uy`+I!hY6qt?Y0nNOoWZI<_)v1tB%$pVEO zRSQ_5LDrERYnBH!1p3iE@jtMWvuv89PO@Rz*5|-4MMJi~${kq*=nV^h0Ga44^6@+j zj>Yh2W;eq{{I^0nxTjb+aHoB_-o>h!O(>_p&34dAGXOI z_G6~h^eKL!>CJkp*9!7C?PW3e9!?&`=}UQu5`MP%{zS8!6;}(bI9gYdwRt`|P&EnFBX3>A zHUi zh@i|oT;@&zn7>+8N?LglLA$B6OpfApSlJLmPF|reZraIg-0#=Kd#Z+~MNP9}mS94C0~$Q=8O`^L^L`|4 zJC8V8cQ3r<#P4LDyW~Ew4R>zK_PaxSqhC=Z(p2+C@I9>B0BdsZubOFr#YgxemM#$uWnN>66%q`k$u18J`SQn_>9bVj0!v+2ossu8~_ zqCG~x1ujX0@LX5k7u4N}5Lb1~nObYsj@_ZNTAA>D5|Xf8jeX4Y^#GtNMpwAcx}SXQ zp{KOSHyHk~>fI~d_m?P|>FaPlN4WmXMxWX{jU{w>#9u$CrTyxG5$FkJp;Qi0ujcC; z^86ADxL(VJyX58A2)iaYrctJu0<^;`*7$AJS}yLRQJavhHQ9vq5K0TPBUbxA3G(q5 z^i42yuuo3%qA(h{KZK6-{yScs6BQeyH;(B!DSLpNhadnqRc!e@{PHoJ6PjG|B#MwU|1GHt@Mu^ zi!1Vq*$vaC;5#IBl~uW0gPBT6|S-6HchDE)G* z71@Eu2#5aSm(|fCHcm}6I$rfJl+zH#T(4r^uEm?)*6?)u*v!KQ|6;ty`U*m&qLy#< zmsBCp{1|yUr+)|p$3^b}`+7WBeI{DF=MhfQ%GWe6t}#nb*beUDR1waM`!GGiG4b^Q@9Lp~*p&Tv?g?0&@_ zBgcpDvjp=SMaB-3>}ieGZg>T?SICk~x3rbt`jtAuL?*d}orwD=x~4^*I2lL@#hE11 zma}mptzHE-!5Nyyq-ej5`dcMKigZJNiBt%-Sg(yRIi$xbLUVU;q&st)iBsK2bBuFM z?u)4dN6qexx%RTg1hgqiHkU|$j5%>fBrOPErrA{i99mR0a{;@g4}4+Ff>{b9Zth*` zHyF>k!1cr8R36R3zK>(>Z50WfDiar#-Mp=Ll8f2i1C1<1MJ`pY^+ZDqKru4`VIuIh zP{z0m&Ei^3)_SIet^Fbp^lf#A2WTH>OZ3!|iRPp~S4Qmk2+D@*R`9kyaGk6oz0fNW zZ;eQNH`Ab?Rc2F0#$T4})EvInvmC6n*PM@(xUD>}u2s)u{AqkCZ{?;99NFh$@6Isf zQl|CP3+%^RG`Ta_GWTYnE>ps9W?=-?W~4H`Z*>&vk(A@-D(jfAOW`~2nPpO#< zwHx0)6KucD*R}S{5TY!$bAg!eO5JG|xV}+38lE&51MSmjv=)P@pt!2>!pmjvR|e#? zk@0oi5ZNd5Tt<21yxhmx^hm|$K3}?3Qj>^$?4CaM-&5g;l3y0j9UG=x7O;B;uG%?D zGrNLFyfG#LC8Zr|eav)C{OAnXuYFlmlpRA}o#W@Ek{wVk8iYU3&hQ*O?>;7W?W&|K zdCC8mriw*La#p*(_2585{5J>o*|ACL>R8h_$-y;)Z)}kkLw-S#N0ZzcwfcE?&wH*I z#XNfEv99>0$IjbSEJlu|iTfzkc0MEnGkywVO!bUpDFknlT}8xW=42z>ePZYO zQwc0A$HdgOY?JaMZTM2Ry<<6;=VJ6hZdCz|xyF8RzQKpW8CDGm*E#j-SCyxrk~MYL z?6|)(Ou0WJ=3On_3kXkCbBI5%Kj=LBg!Fw)y2_!Dbm4&II%Vh|b<PGx!b7{u1&qf0iaGwl`cU>mul3zai75JZ`d~(yEjD{^N*Ej4Noy$>V?a%$jWNhkj4Fy0#F||GD1Ko({YR#@xHs7tv zpC-$_Q>rk6<-tF?^2qq1l1X-JMYg-@6(s3v2iet)Vfqh5x4MU#Yqmdi4m6koCODV- z@a9MS9qJTWv!133dKNH9mSdIwAt)n>18Cx7>q<0&dMo83=|#rba*SHrb_29uvNEEx zFZW7_2gY!iNmA_n+w2|jL$fswzGV6+@PVNDi&rsgJc%Zd0tE&~u1~43=Lu%zbDG4j z9IAh@lS)t3RMjULR(@}0O_-1j+KT`em5Rj{vg()7JaN}icFY-ecqAI_(YB41t}7H8 z{vjkNi11hM3Sf-TGJ83GH;!KBN_omK*BBZ?tYZ(nQu<1s-{tGhK{hq6d^@4DMQjzL z+v+v7(wF`0T~)EkM<7yVkbh8!wj8T6K6AEOi}Akq=Chc|iqFjVlz2mN=5#TBQY$nZ zV18G6V_T~y@9B4qD+($VCs!eX+vQ7CDuUz*Zsp-dkgaaPl96=wRvW~=sEsf0198Z& zl_E>-8@&B{{W~7Q;7vv+@c9hd-3o2FcaE9Y@UAh@p8r*X-~vY5Z8*F?EMhxdTKSjB zCX}>HC#;?U(?@lonD7&eOuJo5Gz1aKHDU9@XiuVEH{Ulq+Nj?s=Vg(fmbGG|B{W`~ z`y}ILoZ!uD*odPA#&&8&oX?gWxHhJqHjpNcHN{9+mFRsKn`I)e?Q9t=x84u=%)Q{U zT(3!zJgv=ajywHB>mG+ZztG>GFQs8exPCdftfR!K>H-xba=2#Y;NG$ef(FO~_yIL6X>StV7Ry00_I7#k5 zjCbr|q+*_FQ`kn0zk_tvZ9lQ^$OXfZ+k?6**KGA9Gf{u6k~`tvZ`0qY5q8-b+T3JftK|RF z+*?M))n#j=5JCtfSb}SC3ilwv-Q8UZcTy0X;O?%$3n`pJg1bX-C%8*+&#it>zoXyo z(|yJn-@SK?@9!FW>}7NBHP@Wad>+$;%*3Ojjq*Zlr`g399wIQ3hl?yPkQ0x^&f4qQ zqX@vL;iQjc6JEpiF6|sWiBc8AJ8vQdqp?(r^pF8k#(P=@=Fb+%8RgWUaUxDu7iSdm zG7y=`R2Gt`5V3`u9(G8&Q;E5+@2q@s%@$ST_s8iUSN4|2WLXZvS6Bca=hb2Z{VfQDyWy5)3b2?)O?_`W+xFQfn^UOWQw3N4ms%;9r&=6D!_+ueTzzVV z!*i4|$RQ2^HSE$a+*qV*IzPqkW6R?3%m`B7RX$ZSHR(jf$%iPh(mqZNrZNIejada= zA0<|``!-UEvAZ zOhT0&Nt@c`m}0Ry0xUBpkMj3gnK@(97_^HO3p&^Uz7%@e4#udGu1{LTD$A{^*D6}O z!jIa2tsloJ-#Z~45h&R3`H{uB{ao5jJwecBaY{1Kq%d-HW*v5CPd9g0U$U)pYEXJG zKb5M1Q*C27oB`q(NnfqV3%{eCf#A$C@|JXS5~|ZKLW0Vt>dAfB&B`+{8*7`Zr;hH| zUQAOhO`6`ge$;Ad9@(kTvyYIfQfHy)4^PPlpn>ypnf`@1gPXR59;4^%`?3Rd%>d^M zCVEdz@~B9kaP?1j5JOH=##zWN9}t7FbO)TzmGVYLBr9RA);CD#=N5tV04EV|Vs1Z1 z$h!lK`a-lqIvIT#H4!}-jdyj0M)vSbl2G8bU+LYHQsNkpDc?hSc)meo*l8?_3Xs0awJK8&fF#ncn59vrBx>d;3xNs7JQ2@T9B^4mB+>zMvi&mZAt?Yn-CE{yE$=%&PT%c_d3sBroP6Cc_ zUoVInzb}nPwjaY)7GChCN~`92M?PqYIn(_5>Sa_6dbdx+hj7th=IZB=R`JHEH~l+3 zJb5>y(;%dq$v{sejC1~dL~%IEpc_NU>_P2i;*jJ=14-Jr*PMbWizKs^uiQ_4LM2|ey7+{nVL%eY`6gPb^b^N{H_2McDu z#-6B?H#5*>5W}S8Msh?Z&OkUn)SydY1{LJ@y7XIO1z`svDdk)@Ll>+_hx;-pU;7Mn zd%8jq+4WJJ7xb`1bmn2g=DY7yqj(Ioe0z}A0 z&oV{9SEA0DB00kIkF8?StYcAaQvIe;FypGki5b0-;-BLgA2wFmM%tTskX)ul92V7= zC>;!*+?bX0g}9^YOS#wcD4Wu)+#h=J<+A9@m!ry zz0>?&&bv8Uhn2llb4ai9`mu98xK?=2QNsJ)=T)Y>`4v$6TLxO|YlN#&0DlpOJ)0p! ztcN4ezw&+V?00w6qzm`^<8C%9n`q!TqruXzifWAQM2Z+MqnM${%|zxO+}k!9=Nf7B zvgML#oXEzBF(0PN_K<}ij(c3}J{W!V6HJoH2>sdiVna)k1&>OTGA9;RkldJHQm5x* zBS9xbOcxsqov!5Mi2g=GDxXxnuK2ctxKnZN?54ED0kTVxETFCE1-g6iQL8`w_3nip zoi{SywZ;SG9XOZp$d`R7G%`qG1+e6n)eteM=;iAnh{;5EqKNEO{q0_A#r~~y74*tG z3nL&2-FToZ8&(tDFCt3LQ(b_4PU;Oky`VkW1(S5_))a1oa@>%gStNYS{sUHF$*9Uw zJwYF_oJMwdSAp*0)vFe*xS46JjgN>6bbMY*0Bin+^^{aZhO8jITzMD5RG_mc5&6~H zJ^ExzU(J=Mzpo@cwTxchBydfqCI>&57tXGbe`dWe-0!uhG>Vh%o!bVHQ5=+QWmLX- z>UcZTH+;}Ps!kb-K3~8TJ${UTX&GQpCty!@PP(1IIb0I1kU|uAFKBBI9&oaEmnAF9BVj2GWFo$MC(+nmzqFIJFHG@iDK8pq}Fvd{UXg}M`($mQ9&DBAa7mu>9w;j&YmEg z52#qrCNw((tN$V69{m8OXEeUcMznf?G#a!;A7wX9PZW(xA3qaeJb@o2?6(dXHB<|B zl4D8(Cvv`VN0uRuO;%@9@SISo!xOlUGL-ve=kuu9jL_da5bu%h(V>Y#bb_Sj$ z9n51B<=@KI*2O0>BrJyMuQqymJ|<=pY%<$n~_{;6{KPvdW0K0=xr zessV4r#@kiZj=rl({&M`QR|6a-$;8akRd>y5&R1G`i+-zg}j9~Ko$8Qn;I@tSOR9* zw|`xUscuQPbxTkBIrqOD4Bt7kBn>J7!oD`+BU4!|8Jzqovaqn%R-=PQI2idin`U)0 z5PQdXk3SuZ)}08DT^jjS|JmVf%yGJ_gj32|bZZ zM9AHny9#8cVv5i2l-)jA`XeB=CKD}u8;mtdF2)EGv1lADJO`N9?66H3LY%Ml?1Q`fi zH!3H+L_S8i?r^eD5i*U|^J`Kuy`N1QiF^~uQE-E330Rxk%hKVgyxh0b;mD>YH1e2; zjzn@fhb1s#fLL5NHgw;`X%DkzLY%U@cV0gy3sk$IQqfxp!mh#r8lPjlR1iW{eAIFC zZdZ{~kMsmH+HZVUbz^!WrhaOTr-bCYQf8&By?E?le9|K! z!(BOl`FdB!C4Wkoc4E+ON96IAI0)tFdXq7x4$wBK-9(lgD2ai3XF%VpFo-cN1; zn-_~~tM~8b4}_#BhD|&@ocM0VQCgmJPtchMNUo5xB|tDqW6|jsJkPf5RnJNE)7ETy z#>JaM3B*;dw6yyGm5|SskY0qQd%K<&Tg1_8ybZcig?JynljJY`D%RyOdnuwGIgFZ2 z^7gs4FL`qnFi%#;f9v)15g{05Yqxz@)g)-$M;wlcH_8u2)i#zwIGo%V)fYo!-l-#6 zDI;5ITz>;!!>csU_ZzOZ%Vne`5QBg4S=|hbqsSR-Xy-TosMyL+f7H4iT9RfuvGfur z0v%95dl!T4LoOTmbhG>`j*hyPYJ{}y9`fy?yu^5G72Cy_4QwyQ^*66Ae==^hOJN~d2_0|Zz zD{E|3G%$4`TEVRhTvuz`xuV9zw|Uv`5XHmt*!8@#Sj53#JqSa7y?e@Je#PMMhLYaXXV&Q53&rvK0HC zIB#FY5C()quE%^3XL|W6*6r?l^fD8_fFp~lgR_m6XXfAzPUo$uU>0d5B=|l1sy|cW z;eg1d7%GoW@`RgRAg-*EjEbbP&ayU1$-0$stgJ`torjMF!WG9>b6_ByZUUZRYr=@4 zOI-U;q)n}{1W}#tm@!}6eu@$xnZlUZ1lKdBZa*lMu^hfZ7M0QS{%jd~Mt<>;yt2vm zxmA!XeMEJI2Z61T^s8X@Z@6buNkE zRtE=++CL?^2WhLxH+{QAcrk1{q0}$7lGFP-9kQEuy3EH9w!)XT1Y@T=f^UwLt zeS4HDCR7W?d4~;ynJ3dY#6CAtH!_dpG@z~Qnr}Q78AU0nQ|;;)6k8YC*+Iok=9!`T z-#ScqDDeBWT(+Fh6kNxoNi2b)#2kdH{$&{m(@t}FN>z)DbI1#rQ$}kN!@%d13_g2>P1|m7d)J1v z&Hj~GpyWX0=A8<#rjh5qho1Q%)~|mDdF^hpK;v?kEOc0@a#=BG?j)C*7g(d=V|mJU z-%MFQolq0I#~<^aqNz>dg8cP?$9ZPJuO+A3@DRqrfEXr~JxK*)e*wa)M^t9eC=+TD@NhW@+aQ4Sqdu9K$8j&?SOi#TIbLk}c0cm@8AQh~OljaKEWGy2J9QnPWYT_7 z$jC@bM&}sY3SHWPOFHpQum=>^f<8fF741XL7mI~G3GLyQno49+l*pvKYER!H(m=P4 zvSLy{qs2$Xod43N`YH?)V}NLhf=hf1<)yIiWO5wI8TO(J7!af5CyiY!6<6g8<^6Tbw{bZP(N66nDmiMwe6c`hW8v{+H%hwy4UCGssU&Gk0l zLgq4ZL`+2W$YfrLlP16%&J>vckx~*_N3Gy=`6T=O&WDAVL-{Nru1%`Y1FJ**SaG|m z1}3dv)9+H?LXoo9m^Y||4Zb@r#CgQ*SxNgGcr&n{7nkw+17e3AP39otM$izv&_!uJ zpDLEb$E?0>vw*J1lO?pouw89Q7-MMLm+`~ja9B^3bI4~fx_u4_vm@0ONfex1Xs@+< zPh-K+$0gIQ*_)vSM?&J}-*7rXlsKt7XwH1^bL!$je$wrK>pOyEeK6uZi3zC*(eG_=y#zvHw1 zhC2dNKDd$+gj~_5TjJSbGAna()uNVv&aKOgUvDsww5npE&(aq3e?-oD_{| z^-ltW+Al0yo4Zd)HwDmYTf*OP^7tJ`WxwHmanWa_=N{|+$TXfaS+Bn{FJI`FSpd$e zv3}ByC%T(hDXi1hIM>#3qv)y>!OCw}h65=E1Z+DK9O$7Nu|K&M>8iFSCivxVxI9(~ z>U>L2I9A@VVAB0@CXKffqh4agK#vX)50(pj8Cy_EKM<5Sn_S~|5WLLBMQFF?`Q09O z@*7!!226)w878@X9*I8AF_*)0uom0v0=puTwGSQdn&FGDKqWoR&kMAcSLa8d^_lk% zCHt=LvwhS;&}VFDqJl6fl;Zrryl^bA0{nOdMIFg?^?whQ`{xYy%)dDsu_sSt+>wVt zeg5byI%&qaI@&|M8hQO4Mb^0NpE{?`S3(b>jbFX>ENi8mB8pe1R!`IiMo!C_hzH&; zx=(;jd4onl{)fWmPObQTmy>fj7AfqDVr^E=ExQU%%kS~Flb6KwN67o9-?~s&WQAR@ z(|q84pJ2r#s?BRgY})C3U+%uodJ0%cz*qLrcg&Sh!FZ<&3-mH9HR$Z#{*Ce~UJ4Gr ziSil_emVYcgie%j$drC?FpOv{!U(LPWOP*@#F?%A^TN7Oty|&)em{iG$CnLkZUvLXK$$rFABY@}o zFIuX$ZpWB^NZ&-=fv-md^_xA0x+4!@0+Xp{k&VXq|#)65y3cp%~tY-3T0D} zwT!3M`Sln6+JPHaV!NVshUTLCj5oC4x_^s4g>ibVkno+anJ{ROB+$u@_D2!$*|^`K zw^S`LunZe3@Lp8VQUPH2-stXjMC=*c-*EHmquDvInnYg;>g{fZ8GVcn22NE&9_0?u z4a#s6WMcGFUIdz}Zi2NyoJO;LWF!h|0J@oDS<(E$<|spHABWLYZ%z2Nu1suTiZ&W0 znO%OLkkX!$aW6*Ti2$kge&tK24 zDt&%pUd@xRv1Z+CNU$I5%igKWGxEoiPi)Bnu@Aq#Q0%499IXJpH|w(&8=9QHUi7w~ z<=wZkS%M`Y_m3pu`@H#SVKq#xfcolrdedr3ga#9d9zU-zc+tBry(Z1Zd8-0H zd1LN%hi7B=xAfn4-1)VRflhT#n|kQ`^TLp36iw(WsXHo>7m6jG0X zGS#XKZuE&i)UZCr6W9Hc@6UgD9ly~pW&)H{4ZH|vTmrw802nvkz`z$N-;)2*+nWF8Cxvi!m z_&!kx8P3VyMT>?bBJM|f)T+)8sWfe)E4h6ZT!Ca4uEePk3yp~^RUlC^13mC1sODTi z6XTm?j!C%KAC4)KJqloG);K}3k9ytdq+Gj~!H#@otbZx-oDR4w5_!p;>}*UW@+qu3 zZ@>wfsiOvs-RMFQnMM}pYNY+sTh`7+ak8{S05#U-QaHk^49G|v%%cuo(7;}8L7tly zu`-^Q{p1xk6J405Fry`2??-Yru@Oho^*%-{k>C(nB|{|^2PQJwM~@GQJHHFcng`z#z(0AmtvMtdc@(*E*ykwH(#Rb=sJ3ze%2Sf!DZ96hDhY>Ll=h7eggo zR9_oNZ$2DaP-r}e@$PUi{8XDv8il_fpZi#w8>Tt}u_Tj%Nj+{AfD57?Tq#VqzF?;* zsKxqVC94|;!^K4LS=Y8yWEL- zL+?1wi5tHtc+&X%8;(gx@*(&)T>9pnTDSPfH4PQOb2I(szsr!S0Pv4V*zj$Zix}3%ZBWu ze=anAjMgMYaa@s(i|7m{sc|E(1PJW&@6x}q7S?n?0V=kVoxN~Hp|M|boS(Q{QLe?r zK)(za6GU@fpFenozwObSl;ngzi9GC-hZ$+%=d!w>NZOCKp=kCG9)2O~v zrPCn8{b2VG6t(seBU41AFs2cQ*XWf}ns0MZKH7Wwtb z<-R3ZYaAB3xQ5l!_tuxb36CL2`7p)H^Wmh6QmUpgy>I0{CxH$N9H!&_Q6N)g`K+%H zsk}$P*x6TE!*%hJF(_Co@i*MGuR&fm*CI^gRZ(i-$^j*6lcDk4T)~7ix+4CY&Y@Ls zn5re!2dwzGM&j>kin-(M=_?-oA0MkVkW0pVhaLN$nkcYen-Q(=E8r;E*Uqc1fs(gb z34$4h-OT#D|8{e3FsV8ETu+7i7}&@Mc7Q%gDv-pD9ezDuyXuwJ9lqvA-*8ge-mSYK ztYDVxt=3EKrDUMi%L$sfE$)z+R47iK;l@B?+ zFw7`{l`~?I8n^F;e`Qm&3a-!!dh3hTONW!!TBy%&lQ1Zv2E$7w>m_JvZm^xIB+TGj zeh4g~n@_Mni?c#sKsbX_HD7MOs~ElD^HG0k_IPx`pNK5iR66$=qYxCNxn8bmf|+4w z&$VaQU`Z~Vsj`?(jOf53)}or-uXeJxZvYGG&N$$!XKM*k*)M+POq z*oI5)Zc^>lisDG}VP!KUc&S7(qyxctGOJj^3JE?m(tR1{;C^bg`hM*lKZ1CMqh z_fqgqbG_rXjM#yteP9tsQu0b{yjs!Hl4)eNDRd?>+l2M2yu_geABuQ@(smOHd74;L zRKJrGInM_$%W@hrViE3#V)L$0dj1d?8EW3Azw3YeS=2GjrR}5UY9=KnVc`C@iONdn z2R;)m<$x2ae?8ai0~k&kp#lEeu|nhpUQo!E3+pXDCpAnKnVc~)f(SIXzniC~QIO;6 zbjfj}25Q#TQc+Qi{1!7Oiy z;)4)M!|SXm5+fe>fOO;3*>9%fhiFj#vPOeeWs@dXNl9jgE|*N#<8)mcOJsLWm+HQS zq=|9=DrMEaoK=hG(Pw3EF!xECOUPGi3)V(1!lUoK5cW@ee#42@ zNz&D~4_mW`EmC0gm*gav=sVJFNu?0br2?41dCk~c6?&J}uTq7ozV9|@yBl9C z9YixTC(6~P5Yz3DT<3h+ZpINGXVT48W%n|8fGZkf)cFRSK5iP>*;%u7(Vnz#U{#EzWgnq> zfthgNuxFN~0q!*YHuovRb%S@y#j09dPDeP?=*tdnis|yAH8V|;*Pcc86j2$$4~Xrg za3OAHmhpr%urTvGEkno2K|8E+b?yyn%YzfEjVq9z7^ z3_f-7`RQ@p54sh(QBx}@xNBD4U~*KhrETb!dbfeMZ@Bd<8lbdkS`%+KMrL`85~&G= zOL{U)mWkBPPM~Nu1z8*vlVSk8Y8Nkm3eK!Mc;)7=+&fbNY#Qm{|Hh4GGMfN=J-RS* zx6w#_S4v{-cXa!5Q;C~NYWdiZqn zvafd4jPN?lRBQG7xqG2rtG>S2T;@5&{7oI3AqyUfX^Qj@fL=*&v3>kP7_5#~qv=h) zt(ld#HEm^fj=BD}9dkYDtMiSbF_B1y&kK*4I_0>FzN)XFDgdY56xzZ#bJoZP}6uLx=Z^ow~v+ z@D*Aw;)c-~vL}djW{)MdlT#M4amBqez61qp7jrg$v>PEo){HwaWKB$Axr#UAwfHH& z)3zq#LrO|p2f2+}*3$ucYO?86)1xM;2aVFY7uIy#tv6m<2z3z5xnA+j&*3j8D9jaL z-L>cm%q^sx-bcNcVw1HnRu^rpod(D0k7$FvanQQNx;d#ow!@fg(YdsbhM#r3n{-r% ziaZO?tL~3&u0J1SLyZWCeTzBMU95bf5Qd$eJzbud3w{}uQBGdDNGrpmSK`Tq+5%XK zLYF`%K@52%DYc9`kGmfhS8x}q*@AKFwDp$uGoz%{8KX0%4~JWl>WguH!@VK^@~Kkx ztjVX(jm1p$fpJf*MfTh1lGKs7Xv|hdg5-`u`cptE80A6P$r89S1;ds1#+#!Ftm%?szr`Z z<;|C?_)bAqZSdaNdpqi;NmgiVo9fjnPsa;U-3U5Ejjz;=W(tI*+ir^vzUs`avPWKiokpcAJP%rcW zOIYDs9)zZDbzC8R+cOJflCEnP?~H9+xCqoAC_K>}`A9qSscL<4e(((af;q)mytq*! zBiabU3BgPFXlu^l`%Z4ItiYftWl#^Arc4Xg%uz5du&(&_;L>C|cHh`#WOe>e`d1Yvjbgk;xlr>}* zNp(ZF?`cMhaEo|_jWf?R!KrOg`=_;IKJp`mv>Zg`rrH9c*;c){%y*g;^GtwZr}}e) zsyu)B@7hu9P&-+D)tgFlHciH4H5s~$uDMmc>Jh=EVkGVk)@YL^uL)beh0&qp6w9o( zYHcf{@m~tMoYCLK_s>5u1G*TNMvlnDn|mp@nTo(tR+n0k1%8G~Sea_&`QVsBj*D=r z;hsI;HxI_428PTAPd@$!a(8?=DferIP{q_z|DlrnI2}55iz= z5`fQXry*tnWtWwiT^CopGblNC91Gvy74V2K_G2c$&g$D*OFS`g%+wE0O^c2(C2BS2 zE>N`cDUs-|Zayn#fBX%nYNdepq&tBzaA>#ZFwQ7KABou;&Y7Z(&v;+!!A&?-f`qH9DjiaaI$k$x(0c+g;9ln|>&dKFK*b8z&kr|adKe{|9Tu~U5rp_8Q( z9g56EJ(aQ02^Q9CGNC&X6oA~?Di{odh$dyt$|rVd_>``krapTyk0w0H-=#YYgy zD!ZtJ*>%L0D9y(oqLRB{7J#}z+idH!2t6XrZVEjmeyV=X05PNE$yjcA6POWvFx9b2 z-A-NAO;%DKt?57e;zR?~P<~qKEC}Mc><^=MCiZT4#Am}I6t-d_sa=Nea}>fq)&Ahe zzM2oa1rA4Q&^jv1{5Z8YnbuP3t4-}?to=o$JUxSbX7iZ_YjUEqoK){{}k>Lk7wM7Y4BOn zSf8mesih$YhF9>*Z~FOM=jmk?uj0|nb=R=JoRL> z3w>qY@vjiEzic$D-Cq(0UqhxDIqekxGl>qf`_ZcSI>fA4jo8|?8aHCe2A^*Ka3AZp z`T~{T#q>Wmd~fexs;E4GwnNO*yX0<+YmW2jDu8!ZKyWf0Eco{8BdDNI?1j`OrT?o} zSMkCK2(MC!OsfCAErFS@QzO)inI7FjjiTz=PnCo*TFu!TE0AYZ4>;nzi7 zDBOpY#K`o4l>GH3XI8aT=Ku7zKX>lWsNa9?_g|m<7i!!e|GT}8syF5dJry%IOEwuG zQ|!0e#Tf2!{{kr#W`Yws5@l!y%Bjp; zN_B)?(O`*Ax1#Oa`T{&aB>cN61^2B68&8wlzC4@TCTF^8gtQAUBBY$43{d}BUd-ow zhzMWBNR?GUSN)8nK6O|&N^fN0lq^{7AeP8o7YP32+nh`LlWj z1b4tS_bh{LE_$g0ffS~>8F=PPrxGM+d93_Y9azS50Fjn=PreIIvd5zM5`O0K^^tyW z35=dd%CzLDV)X}f;6DxMkD=$sns`1A#KsbN&qV zhL|31*J&~Wvti;{?>{b-T3X>evBbA6bQL`dyyqMV`@GrSmH=A0@qje-iR?5I$nJ;S zySIZ-Rm9N4vti?_0)_(OK6mY}+XwWY$~(?M*hGVN3~d(xB^@0nOPP*&Mu0NBk-J~+ zvUdzJe&3T7eWpkAY&N_0AGQkU=(>DDgh7jpZk;q$3~_!>dNfm6u zp>;;ZPcC`_CM(hcLK8PDnrmLD#H!`F!eyg^=ikl_&R<>W4RX$^L91xG+?|R<(hQkC zHOA{Gi&hs(f(rOZMClRfMY=SCUc7#ZfkIpSANwUmt$rr^cn8Z4ufSlc;fEiDF{n=j zA1HQz!)@QeT#B>Z?W8N{^ciV;h^AL4WM!_`dFT^iaIUo6fV_^Vl~k0;G*77PDAg7> zfjgPyzSdeK_RF1kwfEVVG5=Tv{K9{l>p%4=x(*fWp@wO!`#!Xx(0Xz8-v+MjRQ`r@ z>l8=-f4!>zH}pjRLl=hRy}WCE@Le}NzIjIXud>UI%| zFvp9q?u>p+t=?hTwAHE!nC|`ws%cHkek5J2ZQl$xuW0VL6UtbIU!{MDYJbcrxxd+j zGtz+TDF2I%!G3@LH%$6}yOG%OHs!)=%jPk^;p%;1u(`(=ybmPx{_uywASl1&(<>{1 z_Pv!cqX9x*-XU+n_szW(ow`~S?)PP$mBYd&QMM;}ZIkZD@kp&6io`@PCQj65SsP?&z)RP&@R_vKXqaBiNI zZa=?9@)`T70~vY#xg4GKaxHRJ-1r|KJmUYqoAMWX|CtvxH#bl2MU{THM6CxTNp;qM X#GfPYix8;Hx)S@n%u#?rBNzT3q7)Hu literal 98189 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 diff --git a/AssetStore/Assets/screens/3.jpg b/AssetStore/Assets/screens/3.jpg index db2e293d1107774cadfce8f55f5c108ef4250fda..382ba57463ac33e3bf2bafe0198e64550fd7473b 100644 GIT binary patch literal 309458 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⪙ac`|z|M9_5=(Peq$`3Su8HI9N@-Tz)wEC4l{)o( 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 diff --git a/AssetStore/Assets/screens/7.jpg b/AssetStore/Assets/screens/7.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9b7e097d96ea1e6a8623ccd2645db9643370e102 GIT binary patch literal 368306 zcmeFabzD?k_cwe12}wmo8U)0myGKM?q`QP+2w`S`p%GA2P?Q!BDGBM2?ogzpyFmo$ zP*P%Mo--KNb=~*<{GR*s)<3U@&z!UN+H0@9_S$jkdluLc>XKzei^04|;Sb(FP2TEbX0Y>_TVlr7ScRZfmofRA64^|G1;)DD4TUIB0n2|iH? zK|U}~LP$`8j}KG@5WL3wQ9l+70I%_X)q{WkHNh_$?-NcC+=%c9e%ea(_x9j%{?#5l zp1-#TAMdvg5&Yk}nKFN<1C+oc=$Ri!>{Bq2X}lKeCoDcR|BROIAT=V;HIId|p^?P>Dk?dRb~;$Qc86l7!+loY2ZDNmiH zq@+BH+fknVQRMW0qX63goF)N0fY$_gYykdgJc84B*h#RFq}UI55YS3OyyFct7`G7s zc=#s>iHJ!~l9GXg;Gdaz06xL5%u@i~2|NP)6ZnM0L?na+))m{%ykl-hxYinSdPw$O(??JPkmAZPK?+%g_bt^7ClU%JGGR zy8J!S7eh0jgy+ZaA|M2VS@UnH&_q`$I@&!^h7q6VZD)WF->#b5cC%4@=$262%V7^$ zZ$0=pfvmm5ibuvIE%sb{yqBWfF}PQzLtInsvA|*qbJRnh5SPMe(XoTYQ+W61*C}_)$2KN( zZmWHsMa9q9*<>sW=gW*vvdkE6hw&`OBA`p&wJK9&<~7n0Bu~N&F{m@Q=9HxTG>@n~ zL(JG}i!W5N2>U=Uq1b8SgJN|%QH>-hGbK*n&`ozNaOJwoF2UM`=Te1Hdc9@ta6}vy zC@acY9xba8MU7WiprDvI%}F=yPcp-&7#TT8q7ypZds*b$UWaF#D)@5P#<+fR;t|K~ z;WWwwjLz@5yL`NTl0IR9c)tT7ztVZk_E9KCnf?U;1fT4?WOrtz zj%CWsGnbmiRq%D)k!oq~@OuL2XkOlAhE@!2|i*5qVBF%Kr4<+CI(_S|hl?CW^<}m`S zSJcC0RkLf=G3u?DWIdbK?AlvcAaYZPeMHMJaxP|172C78yyT+q8m;lUJwMQ3-pl_E z+@^Z}jg|g@{Q)mLb?u86Ly z7~we&4EQzAU;(;D+SFllX(L5}k2k+qj%s_4w3a^Xc!dR&rq>37N5|GbrXeM z#{xnKEFf+`#cqZ%x*BULnK1_$Kv9V9)_s}mGYAj%X{;n~9 zWoM=&MQ~ZeOl7DfEGeN73&h#%^u8RIQ`lM$hCbcYdAjlvx{b8ac4rUhoFLLIp~-?@td>?<;yUJ1DTr~%0 zhKMX2HL9b(DVGssK!j?YDoU#=-zp`xJX(BS9Hr2vQ~NUH3Z9wTtKH#;G*T303Y&Yn znMlbMD(7bi-WZW)#BKzU_GeWy7ovjiA{d+c?Well#OhQuPl{UMiLY}d3^Cz(-r8hk zk{*=-CX4Zv#EAa=LBAd>@JQ?Z2iuLjYFhj8$8cFxxN#EEe89uhxX3%Z;w|=N2i_)F zV2#r?fN@&0m|AhnA$;=iNe;@5KSWz(Xjra@o%dK+77MBGUlPE zH?>w*VPY)XySEhw$V0V4i1Pb!X-IE5GQ(1#Vf5L}fOSVV)mewq!4alK%=+Y^pU;Ib zEC91^Alt!2oW#FWYW@{Djs;AVV0<;9ruX4oJak@5#kxJ-IzT^nR_dC`3RTMPMB_FVxb472J^!|}8X}&zm$_5T+`%{W zlBS{%1MM&CJ}49Bjvk}!+ zd`O2r#`}Kw2_byn+wK@yxhwaTIkCXPd3xGS=6Lp|voUU%xzEJmiinG9pP2k4s~A>< zw{p}e8QDWL!}CIewt}vkty;*jpJBLC?R<^KjdG^()3rDD9og0-XpI63ASC~r{1x>;?&RFDf=xzF57*lOed%-e;4q2Okm^v?bZWuW`-ih z>Cj1yn<-kRf)|T<8*aI2lx+LvJQ#)c+)zE`Jx?C}IWnj@;7m?bx*afw( z+#SH%3yL>#u&#eyj3INcghAejj2TACHK`-!@1LZ!vrq1V#vQ1?S=S5I?rvx~_hnXQ zbEwgo@f+04Pq_P@AQs@vAvY|%J#+b+0$TswHRf3T4bk)q?->0r1+r2uIO8CuYY@ptAG7kkGYv}CRBrU-IW&99f7>Tk(Y?tOi}qP*X}?qT`JkhnYpTi3y4 zl}CMCXylm}U>`DhAbAMZgx5H_%l8XXx;39``zqt54l^W`K@9GEA`*beW6rzn`Eg%B zO%NEntx=sHP`>2$abiOi!#mZz{j{#ns(x7V_UEC4?RVUgyFOINax6e_+pMs%3ky)n z2SYlazxr-_Zyn9jw|fYV>9qb)Pv5mlBJ<3=SaL)N0=*XP6}*cq#*{@Cpj7J(C1v@1 z?%rwcp2`_7&Bp@fntZiu_Kj=Yj>LAZ+ii}J>zGh9Q)wj@*m?1yvX#evcY=8+knT{9 z-qoIdZJcg(d+d-)Z8yu&t_JVJ^XN0wpMC0*`m8rPm4_>YLUn4ygf@1v!d#H$+kQ)- zXNzecMC&At-a*aM8~}uFYP@Y>Gm#zj2=B^u99uc ze8^f8cF#}VIZ9lF|4X!dh!X|+;-HcvvNG77w%ctjY2nRKPEiN&mB5G1Y&WuDdo}-r z53kQtSIc?frc2nq4Z`Y>2m0;B*+cUX(kf?qNPO11aLvB1%@$-K2jHW-AYN9R&k<1S zZ}R!NEi;c(KxvK;{XqEKmxj1u?H)g9lDhc^ks!gxwGvwxs*BY|ep%jrH+R8nlBrjN zcm;R785vuGN&Nd{AoA_!*>j$Ej!5&;)!qzEKU7@qz-X7FAxFd*vVoh6Xx8oKQTu{v z_uk^`y|QjvwXjJ zPhIX{Wr)w#C&4pTyh6`VP0jn6kI`yj#>KjD_w?0hnNa0j-TG}vGRA%weKDTy()FnU zzdY5iGhzIl6dW8>o0zQ$n3fNuv~EaBYs4pop8QO8b=<0RCRJ^juJ$OD-e)kTBKoC! zX_Dd=O~U@!ep&eU{@MnKC-%?EpL!=T>wGzpy+ z;vi|)fUhwB5XSI4TxME(3BGqZwR~*4@o3`S%d$P<^GK%{uf&+F5QScz=ythUmR`6` zy&t+PytF|Qo*%YhH~m~XBZjIMO||0PzhEO1k|@CcHZJm>eF%%eh%n{EzS{<>Y%OEp zz&@lPcZaJh=lP)#kB?rvBP}78X3(lvp6B@(#4-1_$dc&NiS!t zA&Sf(t-2dhzU4O)sr*CN5_7K+?{edpJKlyd-14(vah86A;Z#2yf>c?dS0RU*?S9Kc z-wS8ny&q;)D)1ExBS8THej>ZILx}16ZRI%o`1yd^ZoU!gBTwH96uIb@@!IZHo2;F@ zJ}+*(v8Up$>ZfLorq|PvIx7kd&D*(}wmqV2uIuP^1|zdMZ`C7ZEHIU`9t-h4j~Q^r z0tcnN+nbGPWy1k?IeOOxn7}m@i9Ugr&9_mi%||897{2uP?z@8!q4_C)@5RT z`bSKDU!%ENr%%n)UEBV;at&oc&lwQ4{CVHL`L-(WN-bsK?c0(9Z;dm3?omPX%GPZ# zkHC8kbN%dT&mUz{N&#BB!(rj9Gw9GH| z8F-~)^pckLyCI_aHB(fPTq3N?iF_Jb|6*e<$72TH${MdNM4(NqaZU=t1^Uc5$S?Pk zRag&w#UdMQ%kLptePWNM{X@m9Bx7wk!`L?zawx~0e-Irzh6xJw%d$zE#3ZODEhp(Y zOGLwcAZuNyD(G_O2V~mEZ>=xe-jr%qk1gh`ZWIr0`>C0KSJym$WTn&MQgeyCyU?nf zJN5Jjv67Mb>iuciGLz2d2UJj&4K!0-Q;%1Ic)8V%C4qzIA$R48wjc)|<|m=a#n%Qg z@cJ&!X2V+*b-vQJJojEHMisI9JWRhNKsf8QEVbKS$ zU7`r-rm9dETes@NyKl~lq!+b3)ZHs%A5$Wjm|xHJGTZ3VBj7r`f{>ixkn=I*gh=jp z`!4u#Uv5S4gfaGBEPaqmH#Sra6_w6Lx@iUiZ3nLJVVCF78yfo_Vi>phW){EupV3z8 zjGhrg}q=xadzIhEs`tupbrfRTl#n0LsNzhka<`jRUUpb zu#-|mO6Oz6)f-u&885FtV^+yGrF6aFs--w`Br%M&ee#q#>Y5%R+(Gy(u^M z$|v`;WuBE^&wa}Bv(XklsHS;d9U6`sq$W5>dTy(oMHSFO8Z^Cqkqpu@y_Ec>}w;Nj>2%l6%wd$*2;JX_hDNC-koVjQV#&kDgS2Vs_V%n=r-2@A8lL$uf<1b7nO25)uNS_=$!t7m7>X za(qe4U-+PaQEx#!IZ|L2xg@QK7R}La@(3)ueVyw3Ij{O^$cmuKb<6X-`ZQP|v}5TR z?+)w0{E!jl9!-LGvAu~&#=@xbquPi&i?1mYRpMJEhAA}qMv6{f_`u%ywr}U#jsW3< zK4bO@2_;=)w`VI_qh3f*ueNugenivnXbHr?v~8-Vdg>X==Q>&vudJl^_}msN$JtJ=u*WPBJ)DWw4o7 z>?!O7AE%rb!c%Cj?Bt#I`yvH2O)LOhn3??j@g)x>14Z&|RP!30( z)8KP1l1Qh92&aa7%1$l0hyzJ6zweh$yubh1o_5B+<@SQ6CLp(43eJx`N$|1Ujg6yM zZhC$5&-jhuniYK78Uq2{=d0nt!DZf%cNqniPE&@(Ju=g;)y{@pnuMnMEi_8sROO!< zXPnUqpth$-&$vBHHR2Ag2sKy$eL0BX$=di^i=qW;V-vBLlgwZ($X?~(M!cq%#!3vW z<7S_i*lqeT-fFEEh({aVe1IN?miC6~73Y+T`t|I2M{JudNY%xhvgn?amvdhbE;3&) z-qIAYNQkTQ3|Q=jTN7^@4JV}}U;!&Oru(LnCfDIN5i-4)GyBa4a7z`1kIe7kFi9>3 zw{Usc@dw;K!OtMl^&b_M^LduUDY>~hv$&<6hT3W7y?nej{-Cs>w9nXpo7JBs6`Ye( zUt|igz{M|qO)mmFq(-*QD5o+`1=yUndTbTmQK}Y^7X|+SOGV+D>ID-Ww>Qx!X0vJzo%G7AFZSORMM4+1kH5->J>E5k&Tc1~j z-=^_Wd+xtS5i;poy#)96*%_Ih#{#{6kMx#cR54of(Pugl;ou2KzilyA`tH~mFWh6` z)JoRF+O7Q#NGAr-j65I}LL0X(c~W%dH}?nMp(sB6q4qE&PCjoJV&xSV^4%s1 zWo!>r-K5IsoD(;uJOrMovcBg}qz~K|pQ~R0FIS!{7S$FIhHy}N9OXSy6o1@lN7=7& zvpJ~-v}JnmYC^;~mxy$JUduKdpG*A~|74XO<-1uoU7IZWi_fw|w# zKqGOoH-p(%0Y>`CfRSBzLL9j6>jW-_8xlR8knLy28?Q}8Nvn5)H=8+w6{Jtdzt>%- zBfUP>qG4>DI*`+2L3x1ahXo=F$4wqxDb2GV*P*r^o5`A)i0)RyAlo%^EEP07cZ~97Tn6+#RS*Iu`H!jTKDHy9O#`K zb6Sz8C{29N?Owe#6+2*HPkzql3YA@pMGO^+ab98?*{5U~HXN#)c4`tdj^$ox>d{8! znD4?SweZ~*nWtl}m*`y>jEsg3l2XC*@qzk;mx|$FMXZomxe_tcqpzkI>Ww#R=nt{F z!52C+11a+II$NNs*JFqd*AFO)x(~);Mkkf*;H=D)6OJxPY8|I-%H8`gDUtl5M)upW z#suzinY*E>6g$%TqTcSl%POX&qw3XkA#d_e1c(Gs(=*8=M*CdC*kGd66IV=o1t`*D zR$XF5ErQ3qMWu~e8ngYGX}fhq`*-Lk>)IxU;Ib=_O+Ec1Llp?$7PP}p|Hoo6wCr5S zzZo#`Y8-W;lf0;`hGNatZI#zP!935n_R^XT(+-r@vSem%{3-05M0UaUw}7$a@kMYg zhC!2_FS%zOsDIb}e3I*1O9s)AoFB>`3v9>HF!P*oT^k)AJ_wsWUL6&xgL)TS6D~(Wd(1NxDC{7iKTA^w#eo^yOSa zunENrDxJdzV$H&MYm)~GhvSsfSRiq@bLraGedydI?k+bejgZ_sRw=_C&pm}H1f3g+ zIlbMe%r77Xz{7M+sl zx;;)NX-uCF#d~A6;x|_7T*&&Rb?^jOXQND^f#y9FewUoPO%IGS$M&W!mUxeaExjq2 zXzm%gWU)QTO3idQ>t0#Ef;m6`C}Pm4UJW{9sM-{~ZL}0f!}rueGV$HUu6ONpVjOr8 z)n;h^4R)_1f`30Sju|<>fFAYh^}~*0*Er|?debb(!v~1nP*yu}5%<0mICZ@L+wM3| z;+XN}XFl$YF947^I)iVf)m>d2U0uK=?$tP;fpXEdL?RuIC6o~^Fc`uWj?2K&xTBnd zGcHYaTvpr811E9A&IMNnm;FO0%=xwj9Ht|0paZggRQ98QhBFdrtqpT=byT;!3k5UD z0S&+zK!ShP04tykzyKG(6>!9<0!STyOM|InH8&hw5I-#sJ+ckNBl4l&{Di12U>%JEC5xE356sbQmm`ZX$WG)@>i;>-qa!K{C%`Il;SKt#lUs#Y87 z@Pn`6483lM({Q|d;9EbM>W2o`bK|1k^ue<$zQ7dX{m+W@@d z6b@hW%eEiB<2&XMfVhnxX`Jmi3EX%)_Q(m6W6sZ+jDH3l>2XN{ zWpMYS{kSB6_X#X>A0$WtT>t^DGIrq40bFma0B+!i$H2^g*?vw+92Zv>r{ka7-voYV z{4^4mMz}iQRz+Nci7b(>2rJaT%yy^?KbVIbGyraj{2qs3`d`K|aO3xQ|6zvK@8Nvh zEFzSH9TbMrbGU_@ka+*7hwwNLWK)Ab;^Tz!&A-(}Y~ze{b^Hg52rvV1HldNFBfh@!z=Qmd6X|zwybyF1Gzw@#9&08CMZ_z6OUg_`>62zU+f;h52II}-Evp+bqKRB~LII}-E zvp+bqKRB~LII}-Evp+bqKRB~LII}-Evp+bqKRB~LII}-Evp+bqKRB~LII}-Evp+bq zKRB~LII}-Evp+bqKRB~LIJ5sxac0Nwb1#6eZ2`a({DJ5U5cmbif{+O$U5qRu8xX0wv)g&33F@0;F+lUN+Wa z5f^)Dw&Un0tOjZtta3fYnoQGdnTueZS3m4@@gqKg8mtTmRk6(gM zT!N3E_2m`RuW=-;!q(mQ9f=lr~r&xh)-CATg+07pIa0v%x7s~ zEyiylBL1uVO(fJ6*YmjYKPG_{5(?`0%POci3@RXE0pqq5wt{l=^NU(=TUuBOaa&sn zSVBcb#rVPBFKs{YK^6{w*NU^s3e+eJ6%!T~fC_SpiHnGG3keHbbBhbX1h_?ntSv-D zK+{0=xY7Ps&A+tBg6%_r9gX@qn{HUx{G=T0WNzNLp}>FhhP>EKK|v7#Aq9C^F$Dzy zL4H1QK5-%b8?sWoxak54vi_ic6z2V(YdIdo5=wTsT0MW(r44iXT`TMHxRtPg;t-_L zY*5@lgjuouWZV6RKKZX&|FgV1h2 z`A?4e?*{J=5B!^>{xLKEFMH`{H$ZJI5H>LIWWvjaYtHdF`Y{N2|8;yE=lyMo{v{5s z`#AFV2}kDFiQ&)jj|cvE;ExCXc;Jr*{&?X3M;`d=mKBBoFD=}`8&d3N{72v=zPW~$ zx`Og8`Qy86d>7pH77kMl2R|1AzX@VBFf?K%o&d-|05&xs0i3shq8w#4G;ZPUnE%5D z-l^{n9Rsj|er}vDYvuh>smJa~B}6K*%n~kK|Dnv^S!7n=4JUXPj=L3yTA`qDkahrR zE~uk3_&pKcOOWPvcX7ngtss5Y88i^2CvddQ4;lv&KWlkR%gj{749&7Nk#E z{-AN7@>4cHXfYfOUUgZ4GD;xL^}_~`0+H>%ZhVeY{}1lq4z6H3k2l=Y4RRPlR~tOy zzTsd5Km54~KBo``pHql~ABo7ifFA|mB;}Bfp2skGR$0)qF!0d;9Q=X~=FG*ajDYeS zKM~-=$>I78cLabft>eDHqv`&OhfD?ladz-SmFIu)ETaLSyaoVhKmNtzNCY3cfFHA! zb>S|`f9M1Ec)KV5Pid63AnxNJP?r1#_<7$H7Q4j>K3|Cd0CYGOdzga7qEo^8!9Htn z_*$nofpGw9umL3eXJrN0&z;n~L1V!ocwWot0j*{DMY-g{ube{8q;&6k zg)hx$i}-(wNV%zll2;H_gkILw)2AY+>IBUoy2WB=?GG3zbYtKt$$$|_)I z+SuCNb#wRd^m-f+_~dEOi>Tr1uV`wk=%H| z9)3E|H=hMk=`A?A3+2>WMyj zd~ER675W!xCAcWHQ9r`eURKn%7W*Bk_OCFtN(QzbPhMtLw2mx(7gsj4^L!ecRoOPW zw0~7X#pteA(5vjKk7LUR|BNPEuJ$?MS?#qwx9^jhHlk-oxOzVzYSwO28SuIG2^A1h zSYEB}(Y6hK!b+m^u(iG}0PdZ^x#s3(>^5Fu+=MuF_Id`ZR+^4(@j_ySXZ@PgRwZJ* zZmnj`UBJBE@m3$TP%OiJAqkzgv?e|YcN%tVpzEAt!eSJWG40U3C@s#3wjjIn$S*_m z1r!d{^E1j>PWdUK=2Jbxj8xsF@r|8vrnUJC7t^=!5qiBumksU$J;SoIy27;5NXt1m z<^T-G8S3<9ys%`VJ@o^rN~GNN+|sPfH$+|~_uMzPMhu+-+Xv>0tGVZbLT=Ud8pZqG z4N@l$+OdwiB6Y=xCXe^@(WL?7DT#^0y^h_z^NzA7&fG|Q6sdM{o2!O@X<^806$_v+ z#uH@;=?8~?6~(n-M6b?gr3_anybJI-naS)bO;{UsROK!^=_=srhCHKRk`rr{ju96N zsy|_-K&>Sf#8xSB*Q!u~9%k`Qboc6r%-7w*weSJ~gZd4P=5)Sfx_eKE17&?}593j! z$nz`%@OANhcP0K}x&!jadk#KQCqKF9)5$34REOFk$otKUc`h}Ie=-(!z6NG24?deTYiCp>MsKXoNbUSaiFa7mUm_h^f z2j3jy(Q4xxD~eB5Lb=754bCn`NG5dgWihl}zbjd6H2l3vs1~(p?`*-AOea-mDdi@j zbY;bDxiwPO{JNo*g(6pYP3G4Y=O=3xXrGp&cWcp;LY$YmxuNxrbR1XT>966(-&>Sm zUX_{K*exg0pX3>9xyHuv=={Drb$u*R0(ouH=E{ZA;_pH0nR()Oy;g52@?Cw@t9|>T z90y;G)%W@*8cLsp!pW$s)Zg-QADWi0>%~34*Gv8EWkx@<|5f0#{jGouTN#BKuPFDV zd!BJI=|yI@D`UAXJ(B!>f1oXdm5-_BWQNl@+Qq<)$)ypWRAc@4DZ$3*-1J04e%R$N zWO9VYF|P=y&!|!J6KLY8hNDpH4qwn2@DXYT?y|EXQ#lVJ1{%0-8-Ou<+H-y8rKk2@ zZp1m)7#gijPPWqr-*#ofPxr6PxUMrYR>Amm#$#wMy3aSJ@M^uWc_>suC-Gr!$o=y- z@OD<{-pFe-y&*{2Q|2%}xUYQv$a^X&Nhfn>#lMMxfj55q(2NH%PEBh*bwBI%%HYb= z^q7duF;8~ghXxGJeE5g6rM*6}zKkPDuxAw1SGkN~eC28@;p4Ti z8)d#(Ac|H+e$S}wIdD}8HOtVJ<5GFA!ykA+OlW-I8$ryxikCrItGP1#SXxTyRy2F? ztvP^u|Ah1F>4U?Z63r`~3@ToUxj}s*FU}!ldtwT`z;FX>NmulX++^Gx`z(@$#jk!; z5m8aGy%Ei!u5N8ia_nlkn<>4%;VLwI@e z>sEgB@~oT6xu9#P0W>vbgK?^qqWOJ!c+YQ9)lHO^PmdeQ!(4?_0*zCXwd}{P=g}G1 zNH@|h`_64t#Yk@vb-Md-ekmW%iRvrnXuoKur#U{>>a8rD_7MDD@aA+o+1u!dH+NQ< zYBkM|MAz-Cg`!T)nzNmL+AQT|mfLvE@ZOxEY;8Sr>+E5p^Faj`a48RZoTbsGQI{cp zNW8YVYhGzCBe6b+iX?JnQ=I_w340yacErvgJO6J73`|_kC?yYz^ z>jyiIW!_FvzGQfbB%$?H2GXQo#Y>R9`d%+2SL zrdX4sRJTUUrA>vEuDBP6i2jl`C#SPA>?A|EcoO!T=N5ZD*T?AFw};$oMzWWRd5Ms$nv(-Q0saGoHW$e%3GD6#bzh^ zngea&(x@a$wR0>z{i_49*~1sf0cE0TP5tj~U+?Lul4r0LVZ*d~Hpb5RuMf?Sbvwk` zJTnMUmDfu>Ge@CL8qu7#kmGH));wKjjHs_E@3JTg>id%H3FplseW7{d15bRUe7_Ms z-V$-8*X@USqJ!sFCE6_)2!NA;H<~ zuM|GXU*Yj29&uAbHzbN_&3B57oEm;ha`qrz)REcOlq3;p0j*5h(_2AxhzgS0MVMz> zA>S+64x~cJb;2ZasKOFLD-VqkI{OKp-#w(EA1#P&$0#LMP+mk&fDAqD~l!L!xX z(7T`Py#--NdZtQwH6}tHnQ{ir3t4Ki1Au4j29=0+)Q0=CI_j_lxBh38t?p_V8O!qQ zSx_8Im^GE>9zGiK6)L>7Ui>j&l$-H;@eM*|{tI+jYgQ9ktLl?N-sK&P)fLa4CA?o= zc|T5>N;NIq z=BXG$)0#eu%(Hw?P;)cNUPcHDbI7oV*bVTjUMMq0mY=ViL&W!d zHSKoVaeu7<6{R=K%e$lJQdS(I$q{axbM|@b7(TD z@>41DbUrhM>P~s_Qs^@8!i{HA@6L(_q_Pt91u&k2o4PWQGt*9$Wxoo!Kb5%6U1gm|Um7Ri7ZU9{Odab`vv<43RzCuX0)yU*5Q*zdh$% zBNpHaY02!q5nI{4>WmlW{dRNp+tLa^}1ST1b5}cehV_Bp83faXGq^bCiF{$pxIk6X3v*5 zqqNIoRl&*iA{ajkwHtl!lp~w!AmWAw1W|8lxff5LB-o>p!X&knyCu~q3=22qdWW}^WCy9$A zw}u_IMdmv@Z|?KdPw1S~ee%&W;v{?a<6B|1OLy5zS(j7Ma+lSaK?BJz3Q zaHyl*migQn#}JSFKwR=5kC>Y^to^jaF^xid9hM&I6L)=egEe^d8i zaFS(bqs z#d*5xMEPTQgRky6%xys0%2DZY6~nnOIda?qlildI$k^NTN|c!Pm;S$4~NxUH+)wny>V6St=A6Mf_48J z<8fUE+RrOlrBcE!)i0HoZ@7gQjqzuC_M(#UP1Xt{hGo zCRHcabc1IP-4~Lq;u7~d+*U+Jt7)wwSbLYlPro7PQT_(~nAV>~7Uiir&b`0tnG;2` zOUv`z-HcJ7>n)8iYmM+_3VRKJ(Mw;y+`@9Ni<3qzCvLP9vFDZ*$56>nuM!h(>E`9N z?9muUSWYn5UF4%zPJ{e(y|)9%%DOYXn)Ib7Os;_ z|B%_D;uZ5_qnLCrm1zI`#H8l5T9p#{JJ+naFSg3I>|pBJW(PlWYebqcDU~anv4K2x z49_%LJ^@HAtJ&>uv$WJXB`V)^g==lcC|kOIs|l&`WaGH{y?fxa#p;bXrpD&rnOk8k@s-Be{&lXf*8lclA0Su_`vvgDt%DC7XdyI`zmu|i0qbl>LQ%>KMffAk? z*5`^(bJfW?)5K#bs``W$Qt0+Kdk1@|7=xhz(2_W)VRi%^Z|mO#2bJ86*`^A1&If#xAES zY#gOz5&I=LDvFCodanBts)HdfbkMYk(OHR5&%Y}01EGN3^TfC6apG(XccvD`)=cLQ zJe39pQ}cz2mW6-=Dw*o!rQo%YM)`zP}n*Qq;+Qr< z(yh_N-~u}u@!1fS&_3T8`Kx3T*;23kiI7d0#6e?J`V?(Z>-7x!WsJ_^HPOq6!kdh* zVFelc-O4K6A)~bXTGn5loejUd$q489Wb}M4Tdk(>b1!XF#StI!>+Y)54qRkD&O!F$ zY4fvLC(R`8DsJUTs5!Ok(+pAh38pMLR$Ugh={_;Lxx^^Z#g|?GPT;(zW!IZD=uY)= zp&m>BNEo6M{MQ1S;OXzFZv+@8`1Hy?WrbgA)lGYutKR;y`d8!8+&i@`)xMiAf}Y0g zyUyBQI!g89-IZ{8y%La@`05$c{Z^}M7ca1&$lQgIXmZd`{$zXtHC5J z?jia9>Cr{;QIzCiRXO)RA|S)N5z}$pyikF)y>IHw3D>jUv9RyXX7GrkP(>BSrp;|@ z^E_t*pZllnpZk27!nZ4?1VU@o+4js!_g%aC%XFilTaT)r_{2NhF!E1JY2z|v(dWNf zNF#dSP1e00^``2!b#dH>=VAKlPBN*j1>J!+9<1dZn#kj?i)?#o2Hk&s=GLBNV!T&W zh41Bc)0mhRjRClnugwL+&soi!lOG2bIzpP4LvIc^me>;$DZV(N;V1J^q}#nLcorGG z<@$WopoKGYYPI5~#=A7!~z%t9?^+dVDPZBS-2ZkCgb<4}?4%H*}zA@;ypv z`r2ok5!KxOkqmWNS3Y$;OB{cGtzQiTJ8bv;b zu#^!qe8wXI#rzlB1&v!fi@fXHO+%(w!2f-(){K32H4EcL_@ z{}(gnNt$NuYZ*e`1@}BH@*Lc>8TE*(q>5NLQi>R#(AmGlMDl|@^=Xjg5)A~`}aBq0R_JtTxSjEt53seRHN)3NV}J$xnZ z=&3e-#yk2-TUoEUl-n+?GO0}zgRxGvSIx!_zHRJz#+md-=mBjmK(!PGn?TisL?N(;R&O=#RIdU~ao zal%Kg#GL&>%;`e!z_hEI!a5t_sbe}66<@_o5Ip%3RVp8MNv>Uv<$Nv`1d)FLyW<%v zf^nNnE1#g*@EI@nc6nCbWKN_s=P1jT68ao(VOgTdbR~Q@xM;%yJ>6E_!aLQ@&zquH zrEK|3nY|?US$rW!%20{4`s(Ct<))Cwz1yQ}QE@A_Qi75>2RF7(zwurn&95uUH;tF*XUB| zJ_IEsOU^n=YAbt*?M=n2eHZG_78~xi;PIt$lis!54wj3@wf(bO2zhX zu@ynIbXs@iu8z$TNtvzyEb`VDZGhN4c|V z2WOX<?(VL^Dei7Xi@OJhwzw46;BJ9p3Et(m_kH*7-MjxLnSW;T z%rkS&=X{SFNbX~E>R+(EK&u>pS(iLgNun%Jc5k-nzV|A!(0wPkH$T**liBa3QicNt;!EyDze9-cWhZ_@ZQ12)u-}9YslgO^1!c`!5+RgjEE{y>x zYRM6vPvmiu`|q}|P@?o~944N-n`qh&HZsSzCIzYQv!?Z5i$v$xo&+jn`iBK^+IvC*%s2g3|TBi*qV@>xayC)kPz7 zv)qyNbEb7?7aNeolZ#-`>t7F~c3A%n)>xnLt?GuMj0=WKHE)aVR9j{*na#KIKd6?L zei*3}8?*(HjZYCB(_;bCqdwY1K;vnjmUV;Pq3$ujK?Oz@e)HrcMrvt%;%phNii;ac zF-m)%z^=Eo46a-&OU1h9UApsK4nHZ?$HjT}>dL+HZ@wo?tzkP9YqARwfEN|{2eS3L z`Jl%!*zsQEhLn~ke5UhSu2#ZlB{&A|>$7yqy(gQNYqK!SELVqa59+Tdc!*kKZu;2F zXxixwau}^o4}1UM#Z9AMInTQ-wb=dI<(cfjajJ z{8YvLnw$-Ot-To{;a{z345nK(qVnD53)X=yf1V|D5T5U7#A?x;@+ zok&&qz%QnFC7JmQZ&xR9-Gb4+FkRP)_=lC0m*jb>S{%|_B$O3J3=s<5Ug=80SSc1Z zre5|?I33CB+L3rMy_kCf6GdAXLIT1jv9pcIQS{;XsqZ)S~LQ5&}&GL>CxbhVA)9J;j1N^aI7pL-L3QkQ6XfQ#tDry(G$n@%jFXX|f zl{5|>>lmz#ks!o9IF?kTcf#SdhT%eoKYfr%Y%Vib+oj9)4~`tjwccB~WnS=5XT#=9 z4&#BdqKZy1DG)!#Yz{nX_abvj_y@<>A03OsDO+0O3PJiT)F>qou`;~`>~{IRBBBhYI66aa_@g| z@#6Bobb$XB2I`aEy@G=f>Joq8y9Y0enmFBEbOM(Z3mD#hssE;6ylDder-bm|AJqRx z1{r8XUVl@b-vopuB0j)dmqj~S%n4V3OnvWJ-Tz;w_>XX5<`E=X_MbyX{#(*8K3?~S z8TKxhtKcvHe-HaHaCgx`WjAdsY!>`T*S|Tx6_o{^w@KRfFU8Js6rInq!3t^(f9czb z2AaLqf(CWuB1?TsUlIJNDB@{Ja zv_h2ck2Z}9tlL7VuRNJdnY2ls1P*S$XZd-smapoECIDFm3s>j%oQL|{xIHkCgZVHC zaI={+^G|a#GbHf_=7r~S#iyx}_f|yR!!y}0tvh?#B|Vtx(D5}?Sm&XhpVkhJFjL1_ z$k4&rJ24W47&uHf6`B47W~+fsX={lyyEBYNLzk5Aa$_N#%E_xg~Co3>EQ29E}TNyRSpZCf8*LZTm}u zTmz*imK+NYZ~=GZny#l*T?fj(E6(lR&ZdbbXs=SL7Fok{qPSiO(WKIzy#j>zwJqG- zXzsnm@ul@O5#@tlO*2kdF!U8jPb=ny-p8&-|AZ1JeP~|j-F?w`+aa;I9`5Ki zfw&+UvMpm^_>OM~;R~L)GaL_PHPiJO(bef2xUe#3+4wY1mQ#_L%$0p=$Du*;18bg* z8=HpEjnG8)t@8Ahs?eU-*ry5jE%M05H@)*+aW)kQMDpAvK1um=q+P7LtWe0ni2555 z++bv%nRs$0oa*B;B31!Z#njw;7imC!4B2>oS4p)<3s+MYPeHoiKx@i7-lohZ^b z0ZIrv^XyN(*t~)R%-|6)-ag!N?Z5hfJ8f(PrH1Fpi$fOa>yN1IkiX%yQc4#4I9#lg zWVqeyPnIj^Z(}oTpaQ;BiXLcd89z6XA~vx$*DXNTw0y1bw}THa2b@bP`qCD~k%`ax+tN?3k{{>dF(* zTCGT}@!E?{-@E)k$3MTZJna2#(UCQDp=W`fW<+qKAJBAgeatr{vJN2!gJ_-bTKRAk z4RH$BkcTsu+|JYtcf+d;uL&pTOX1Sb{BV6`KE1>qh0w@%fe+8krlq&!zoG z#7L^|2%=^%L{|r55-w%6aQlK`m$o8CN!$Q74xMx!;0evUj~CJ1^DFynQNs+Vh>=;c z!1!8%$5y=~(}}j1E5wPb#uWNe0vBXnQK>(jYJ6pxLDwOm?Dm!JWYvq%YZ^|n2^O!CJzVRmqDi_@=1 zbd{2V#7BkqD=Ef^iSPP?@=27suaa!dtIoil8hbDvD=TuAuZzyMCB;>YTYfuNeHH4D z@}tfJ*cBZuZZM5(7pqY3lY*u9E2p!Yx_RD-Py?!@a{uo?O1T#o+iq`OdO6d|b3-bzaPXW7-u+sp z-<)yj?w#h50fDzvXq7PK1TgjT;`rc1Jc&;(lny37Is5!E+kl=$TebCD!f}<+0e_o-D=Qcq)@UFQJ(r^Z0e!&!VU>_%?Fk zmnOmB1@j8cn-1@GU!8gvB8Rr=Hzg&&h(!@=)rG)>9A$7;MPI=!#4_Xct!&zuG#v)VQt)e=t^n}FmobV>>C=&-Gl{e0=Ew&r8}!(yApgIAu@vlY0tEnUkXj)~4+idI1_A@rT9 zJPeswyErLZgFztlB{&XPe{vCY=|P76{;PB$?%0!^%Ie8-C-4F`4sC9}p_pD|NfG~h zLTSngD$Ehhk}SZtk!q=OsPe8CMU9K?t6WrM`jG=yASJt5q1f=T0Ycrygg!LT38UO} zR_dH=*^*x}?0#e6dWfm|s{W72~^Y z73FTy1w(pMl|QLXvn}&SQu*XClVU!R=Oo9$`%J_la-PqGcQ5&LouJKK-JuHJ>UG%# zcJr7Rf`NwQMd)qFloFVSpzX_}yrY(-3zs_gKR7oPC6bVu=0A&A>ycWd3v3Iiq9d#M zpgT)~)cpza!e0c9&;6^%*u7K%mU6Z2JdNGW#8>*ZJ09`Nh~y90)1{lszhRgJ0u^a4 zX4aYYx|_L?tp_xzguE5isYuM!azqEM8(DElHi8L9bX^f`iMtx&5@SCg2nhh48eHJ5|h#_anT>EHp6)TK1 z=1z0{?J$tq&qipsUE9G#x0`6}$BT~%@_YL#Vt;%#dskO{Y`~xJc8{Y6!(?gw@Zx0= z)Mb>6i(v30Wf=Sg1HbmFnt8rVmMI=`ur4gLhE>~Z&3O_@kd$Q%#WA)uKq8wCz&Uhb z{K;tBndJ>fiHTc*Fc-7NB%cgtYuu7TR5Oh2&jb+Nu>s*lVsig1(31_njs{@$y-j&o zcJyh}-ThcmO?TV~Kn}wN;Qf5o$Olcl$v7X4*Ov=FQX9G9e#xhBujnP;;O{O3f~lI) zZ8@5EBfG@J3?Q~DEwE*u(hZ5?}?(nt> z9e?xuSua`S%gdg5*X7AoC-iH%^=d?-s+{a`tVfgy(xNOAqur%Trbf(}6zw|7LtB}{ zdP@dGz~W@}X89na%%k?Z%_ick^5iFdSth)z(pSqOZ=^f_5H^S=nf`_f_leNO8t_}R zM4`OK%whQXG5@D8&O|`R&&KBl_CqArNhdbT)clL8ELR9+3Of7<^~Ci*&#IWDDCl_T zjoY(FbUyA^AC4_(2-JORdsiy7a9s(&w?ce!R*Lie1ol*CcGYK^9&dZ;JjrwM;l~@^ zIypLk3TE4EELK?^A8vl&PtDBN{NjmuD(v6 zw_^16t<8PEt(mIpMIfM=;ws$BAbjBsebeu0l;ZV%6`dIMau+ek&jyvpq6%mx>3e2b z!Lai>Ll2zlyiqCMFC31$A_eMpHlU>(B*y=lzMozB;;6k_x&D$u4=Wp0)fggL`?C*I zh7QkYT0AFVN-tG5q@mK!O)Q}5^H*0DCo7lwS-8W)vs?t_KEj-cz($Fy%;Q6cEp4%D za^W+dy9CNUaKyfgqeG(#O~*ss;&g{X{s@79FAhxyPiH_YyN?PEOxk8_Uq-%U(CN5* z%fO7skrq&MGD=xl(EJDI(#C1fZ8@WOr9e;1AcNrBnuboS|NdF3l)A5(a7DMV6I$cC z@nC$obF{%m+ucpfiDHWRMO8a291+6{=RBb0LVLn7&xdWo%M3($5YH}dF;vZiZ;X^+ zH}}c&_7xWHww$GSVGsIJZohW!uB7rTpTiwx7~eVvaBB_`W;nZt27^5M*#NwI$9rL4 zMqED31c@bygb7}@K0kTFGFw`2Hpjg<;Ot%94ci=^lmfbd4Rz-fb@4-Hd4wimBQpaZ zi-xnRymNG*Ynr*z>_#i@Bne3~*mmAe&ITJ7J`}&tA_kj<<)~#!ugb8g4(6ZoK|M&g&D zq#R3AxCIbG+>_ASB`;>~sTTM!l-^7NzKUU5^nAWVcx^rxl+cI0sk$kLhNCT`V}&rv z_%XyYA*rF+V@^Q_iAeI^(Q#KlW2h&6TY`PkDs~9b;_O8@MklXUNbB2p0mnA_{If_e zB2{Wb?uSkVyKi3Qy%=J`0`#JMQjw8z^kZXTiM~albg?C@_R}9HSf%0q!L{sL>b(a6 zOg0%`E}Yw+3Z&M4y&t-9`OM2`ARD<&nsUQ3QhWq@;@trm8U0aAFwZ<7PL?>c);7eK zPp)+p6^XAH_U_5+0Y7~Sf8DST-0N>))AP$`N_?xTrF@g!sz&>tyLj#1+U_m>!Qlu` zzrhVwA0E|SvC7_@|JFB7q~7@Q|KhX{(L7>98J>fFYyh?eR?bNHKt#J+Z{?mz?f=08 z{x7fCrkbH|{(SZ)hF3u0T?kxi;K^xSsZCu1&xO4gMKxMmkI%ccXw#r}KowjVuCxBO zF18P&XSn2Y4Q_^oP9^oi^W(u0(Ocua7mn_y@_`mSu{oU2^v^3#OX0(j`L^5=CYS|L zwGwZg=Vd%(s}Ycj8+R9TIDwA7GCuOFOT}i(YE3VhOhEQmgL)T11XG+4ta8lTrY6uc z&O4Rcw!XfXveEnC-}4dM7~_^@NdCW%0F|h9t6nG4O|RuYdkvWow+e%1>Fg@X)wL|E zgco*hZeMcF%5z5naG%?z@=jb9%@GV6X0Ujuia{c4zT^9M63sZojBju1Iu(ZM-VXL+ zeeIH^XWa})nxEkFo@M7B9+Ujv%b!vJ<~a@o{zapE>###W@ZnFTbrvSQnJM-Ap_yc!dB#OO~O(A z%#j!l172nY!af(h!1|cR{m^@)r~Cl$z;bt=PW>et^SXdt_T5_x~K_YaP6ffo75$$@Pl&I9F?ln@b%990PW z-v9Trb$y2Y_+NWVYhT9C$FW*th^^J1G?(ayI$!%P+COmO9K&htR8=}$qg3o1qQAFb z;+Z=G6wJJ@IC#Y>S+u^y;QqVEsl`ac3;}R5#PfH!>!}mMvhLWhX#Z~*Vt|46u;Q->6A=P z`d5w<|LmFCp&5=_#Hrx06e^B0n>ocfxlX#dS#G>Z`O$jWIv{p#}2l zx!~sOOOUtp-}NVkYEH5|AIM8X#yI4qEiS<_i^oI`J6ToT;*`0HiBr$wy-!6&s_vYh zDveq7;8w;t^?GNVB^b16!JEgr%$TNluREK-Lj)gN#f`NiCq)-BBHkC+&N9|B#L#ZM z1@WQWj`P=*@g!l3pB%?XJ2AJ^wfMyOJBeaX*Pds&BuVAQ1#|Hq9C6oHU!T@_?WOos z_x2yH!@qf{zU|WZ_;PJ0rw(UaerUPSl)oe|W9?N5K`clHd(|}=R*^hN@1C*?SECM9 z-1)mxdz&_kHXV8IVp6?KDpTSIsiP5#a#{SQ!-dzqzN#klV$%k_Qr_eAi9Z%MA#i~py{tK&QCVVg-`Kxe|Q!aHxu9wY2aI=5` ziojq9t+;DR-&fVZHc?O+;_4Wn)RyU*_*=S(_~^`(nli-nYig}xf|tv{BY4$zZ8Vwd zCzHu>GWLOSBH)OYt~MFGrCZxZfDcF@A(wOFZz$t1F4j1pu(91wv;FyXwjtA=(f#wn z!h-GxE-|LB4p`mEW#DHOkW$>$U-q1kA$d~lO#e?xkEEPry@|xSi{I4N*;`IGa*C%g zgEmthC@Q|CiAGOZ@RfNJ+Bz_^xTk9#O?E;HX!lB@HKhT?rDcUlcu{!6OQa-{Kta&D zOPX_UW1+cRj}}_|uL45sL0e!9rSIIYPQ=6*8?c`+XsRVRDp&DC`{?#JJMKv<#75m{ zIGi16uMhDvcFfr7?)OH$SE>veR= zBcNZZDPo#xm9ChW{u*7Y?#7o$Jz3AIp3Tyw$+c_ZrabS^ROce=DYvog_^6rUokEH}+eF~&j)?O#vRys?d4#YE6Ni<0Ap0T!b|KQNis#Jf7 zR|&IleCesDBIM;vE!VrdA$WMdYp4E<%Opc7QS*!Py#Ye7WfrG6+s`gneF=Ah$H3O( zOZymThg4f@t~uPZ375$ykpj+Etp}sR6fn-=!B3rK^$`k@{nGMS|5_tU=Vm%XRXKp1 zkZE1K)d2P8?h>O@J)m_H0@7%&o2s?>+^zbBIt&$V<{?~CIjLdUX7fS+CJUzUz;=|g z7(bJmSk8wPu3OA#SGKIW(1A!m=2rUz6_Mv6E{L4qA1WS8>T5P5{>f8@je|&{M2~L)C zQ(bRh?az8S0CI%6@d;(Pk`k995w)8ze7DU$JcP1f!>Hv7isn2%POfYSd8tXMe?1Y= z@VBrVlA>H2(>W=KO|Yk~l#lh>v12-;Nfjk;Pg5TSW`Xdpv-q6?@-GZ1npae);@n7I z#1wS6?e+}0RKpVM33pA`=G!CL_k;bQF0TA4z@r97D}(O5h+O(G)4xIn-&xABi7FlgT3F z1(K1ycTmKjwu48#1w?e#I2?f4oi~;<)G7`}ZLDJAwCK>oPAXCU8p6I(^|0}{Aryb2 zcQM>?gBWkMJ>^ZcAFYqX-CeNm_ z4V{CUIZV3zi<-Kt0Jb66BOna`^bry)#?b96vMp+dQ$@$YL~>t1U?^$2nm@Qe*e{m^ z&fFm%mT$BfyvuS}b~aO?u++>Z4ZK3~Qr`T1bj>B*Xf6nEd(}K)0xDxk85*{*&)&lu zsn&*lSQBh;67`at0{VeEy05gDO7Ujw@Pri7=&IQJFh^@WY<^o8m-0Y9bo8A8BWxxG zr=at|Hm4=Byq{>s@+N0A+ROm;E<5JtjGPae)G0fo1HzbzycNC*`$??RN~A`%uTxdA zC25s8tGcb8cSQX@snhA{lJs7`6?%gb*SO1u z7bfqn=T#2^MK01-O09PkH7*ZGOlishAbAd;W=E?8JEV1zHyGVLMbE}i2 zR5qxUXy`KzVr^Q`H$ti1AU=!ZVwxZtvF(LdF+5}e)J>;k1!|YAN&P5}59lMI3oIs$ zuBReo&OecK^B4@WuEuCvufz$0NX9xOzi@UF%=sbYJp~2M-TtDDUHdqoN=lm4xSS;G z{c5~wd@KS1dTiTQ5h8wmSa4;yIk_O`ohhlbGX*c=bFL$&O$c$`xUNyURgWAKy9L`O zTs(aiXz%fN|48+^6o9}gC=l(Pp7)93T#JPa(=Ui8; z!LZD!qMhu_PHx7KKYS1ytlne4LEXIDf=(v?3`6>Gbl-Z7cz@vhCa!LWlJGXN78qxr`S z;z%9!W<+WsnlM=f1X;e-Pp&W1ForCjjlB(28CJxN3tF%c|6WEz`vUFBg;hd|F%$eE zMp7l+WJ*uU5Gj1+z_LQ>we*OW({nyIOFiRR)0#cvK%nG&YcZ>ng}F+{6x-V~tY&q< zNecAnIbRV3OjwK1<=-9NA@I(EH|~oPqsEp{Ihda$u^-!()F~MFlniI;Z=LKG1hCF< z3a-3;QlJaf5pXR3*h{r~!=>azwctUtnW+7ZQY5kyLDZDsEQ3%%BW9<5%Bd@s1R)8N zTtWG(Gghl_PfO{~(57vZ4gDqWVj>Ouhw%9(XDAMe&LJ80yYD!abwOHR973`vD|&n*=*~?+e3w#1>lqtP-{(tE!Xk#gg8LJO0X%UMGAuL$q~P@T><}_c|IVX8 zeCYQEyYRNPH}@obmnE*QgiB!Mv4B(@%?A&=+~oDYqDH@A{Px1(fm#3H-1&c;oBRdI z_g3u$Lb3neIxQayPhSOFQT<2VD91Jd)xT{0A87+cM^viI&i~l`$bgr?_Gc6W3ODGM z@mW@{=h&|Q8yZmm|HciV{WwqlcXkDhn(o!`a~MsLE~665rlLcAg?quypFH!`Ef;ak zZG~Q^MXGd)eKr((PeQ>|EKkb^D)Ir9V=&%lMN!?0^)}_r`vr<(zQI4A4?5R z`;RpN=SwTnVPzJjwH2FAI^+d*7;&to!?HiMKBiZk-!+Km8I(s}6&L6{mTzPK`qc_= z%Ov^45xZP2lCddh&tjI!Y3A*-{pAgkRc@z2oEH0$UP?ZHkBz(UY*U zmE)wr9g)CPdU$;ij>x(w; zr#i)(c-e#b#Z8jH50IULjfEy{YvWkIN;l%e#P2dfSMuq$OJ9u6BB+Dbye>&Ec6a|w z#hBodWG8Z~FTl+so|FYLsl|UMN5-aD5^U)3{v;pJvH6m>MX({+1psf63wC$>-N;-K zzQbY`s-M}+NIp8AHitX|mn?0IYh>zQi53=9TBOJ_T)g6IsIn9+Lm|76lp4u3IsQKm zVxo)REs8X@hhNt8Uas1puaL{jEZyl0?tBv+gLNtr5sl@gZLr&szM+%I@j2U%=9X@6 zwg#Orut6--j}gst!>GTW#Z~ct;_L9A76*mPBDkMB0{Rz!m)9O)^Q&I&!LQd1w-$?< zKj?_kNG^8Ag%sCS5AgIW*LYOCl>dWM`3u$TSP*KNZ5^P|_bccGHfWvUrvZcB&?x-3 z5K%qlf8jt~FzuZ;FsSRU??0>%ttFWh0MOE`Z_^Ld5K|cNEep`++L3yt%5ZY%a=v{chn`SmY zc-Zi8rt;YG!Q|iky0h}dYV3v3Tt54Fuse$(2g=LQdS;3y_JUes=L19cb3wCg*=BK4 z?&ICgMmN{1;Hcp`*H65Ww&@!G=l56+Kr%cxzO z8}o^jZIVwG1qu=%{>(OrY=mjkLgogr>o^p3(dHuU}c(!#mH1-efa`@#({fGwy zd$1*VOyMp3*Kzs&SK8}h7wqxxweLT;uP$r7p1?x8KpxHDF*z46L5lkw1S)7nU2ww( zhJSGVWYEOMsSThWZTcX6svB9ZZ)rYFtbR!8Px6*;>GMN?BIGoMV-)Q)2cQj1>9qMi z^AByktbVf4C?O%Wc34RdvjFVz$~_cCv7u&yWn|)fx-g3}Y-11n!r$W$<4AZwZR4eL zo*dPg`F;W3*v)Eece2>y^lZBqn9LV3a2}zM@}hT6VW^-_h{uy?u6Y%UvTZyh!!m0p z4-X9J{`GZ}yb0Gvpr%+)OIJm#j?B(&*9VzdheG|6zn{LW&C5Pvsy68|*N+oZ%??Y9 z$%bT4=>Aef7w&P8_<M1+NW7N*b+rTC|qBC2fzJw!~odG@7O);;#=(#|trDaG?%B zOd}`0Jfq1cuZ{jFFLXOgBonzkCE3Z+BW{ZV`nHq#OBKeAmi3%NYi}M_Zanc~0X@yo zc++>S%uLGVSdi7I7x1U24{@(N7d19q>aoE#Pr|?#Uq8v0x8Pc9a9+J+SG(Jz9N*K2 znBdK6(7Z!;+K%LN|Ma3tPe6g_Y~IU>KPC(|ZdBIJN#w?_>t*ur!>p6*V9<5b z>UgPxre4UD;f|5#IF|F~HuF=a^6JFqN~$h@<)yd|ZqLi&0AD;!&B^lvoozFBO5jH8 z+$zOuq7(TnO#x=oZaayG6q2vdm%|3X59vjH(7ntL?uUXggXRvoZ3(%t9B-~=ZS%zE zTGwGT>KfTUdPKYl3! zEcu;TIIje;*tn%H-zO*D=Vy=)>*&{ph7cKaKwTMN z_Ob%Ca#4Bc31a-TdV4o6RZt?K?rz2!F_fd(sJFkK5-G?%?29SsKRBVFpnmpTW}uJR zgqEa^X6>COrKAGi7BNww?j02P-(S9YCI0B*6;}L&I5I{alE5Q(P`(7u(K=gAWV?8-6al$~b*O($F`_G`w70c8 zl7xC)-fiyZ$d9=4ZrYg2@W|C zgdMVYI8hvI>`z{8Y^|-25Y)oR%q88J8goy{+?U30LR~}1zWaD=t4AVDE$>ykdwXb! zd_-+p8Drlcg0^NXdbOz`#r}*NAIja=b-Uo{SW_$aZcdY`X9T3^jntQGY4Pt!5fD$S zO;TQ8=ZLjzvaI{1mo$vW>O~jrY4eEW%LiSoy3+o!w`vm*mJICnJM|nW*M9Q%_wtX8 z4Z)u!HywqT7BwM&1({{)01SSC=5MOj8{#o|2Y= z8xt|lX~4M6Tg(5suv_D*=9ti85bc;Lp#-Y*A z<#`v3XU%0vt0}1}Hh&KGUGceBA9gzPinNv;>Y?70aliWg{^iRIYbr4$odYMdoK~Hd z++Vlg^8CYJ`>>^lBD^tu@EF>C8zn8yac-$ara#`g0%gWgJM`XCrD?)GC04rMabR@Y zo-sEW+36#+e+EeHfVxzQBX&Ej^|rx_r|6F#3z9O<%NKAHlG_#3I2?WO4wwc5Tk20m z0A2wbaj6@AJtF9KHe4<3e5SY7+PQpHo2z|$#d5{DEq2a|1bD)f;sGg9ctt4Zp3~fKPh!thW@q%(14SR$!1H)CC{vWjkh?Kdeeqq?-% z`i6eQBeE#W8@O{o#ZUHjdp~&1^VWH;l@;9wz`WWMI*dM@yWG6p0p7lc?Y+(}2cNW9 z;hPDS{(}oOxvv1dS@h-pFVX*Vd;dL79w7blqbdr-TQqC8<7COmVj}%h?gOO+K!E7? zsc%0BdC`3!9V2*+@1aY5^Ypqa9ohFfcxyITXb&RnS_p#niWJf}lP8yx=IVzyIi%9~ zp(XnEHeA%T8CL>+4Pa}Ty(-rS&K@+CI;a~&(0^NgMNYg_yTV6hd?)Eaa8i<^)0xGqg_e>wi^(=yC5A{+5X5ZtN_GO zmRm}0iD5~klGvA4KU39S=7Ul!9Ice$>`h0_cL$)mY_Sj8uz-qn46{h-@M|(#)$3S%g!+2x{vps3P z)!=j08TspO7D?!+>IEi%t3?)M zN}lEOKtD(@7o?{zZ|TS$npI9$c;bxn`_r5NN@DQByyVA}kHZUWB5(JUhr}{gd6zV9zbAfWlz~n1PClgr^G$!eRSSuP?A0=Knh4On~X1R8HEn9Xf z??Wz1+*(5J^3fUTm+ipdiZ0C5y9jMv?B{ipo4bl5NHg;(xV&QQhv>GjzsTG#MTC*~ z2?5Y-0v8?RCs8VoOT#^IcGZWl@}ns1EhZ=`r_yP_fZx7B1uc3TfL5Pmx2;L^~| z(1$i=o{`)vNx*~4v*;{ST^tO43JJQ>&LVnFY3FX5RX)Rh(J%ZV9A4mUY~I(oc8(|2 zBda%RCeO$$`~`+RQLMAa$JX7yG!)#ca=`?(cnY$88%6l~;f%Vs;vV#A;)nfP@(fz| zE-?I=LNTb<=i+~x7V)2`M-xAytIYD-_`(K=sKHs((M!lbIDg7#|C+yNoB#V1h~EDi zOyT>2{W$V+w%Iiwz;J$s5v$MQ-|<0!xCVT3OnW*33~?ro1A60^&Rm`S?EhM|qg<24 zbOk)Xc6duK4g|zrQr2wc3(x0|H9t+DYqSXX&^A8>H^N->jtV{R`ab#Z({DT^#I#*~ zA-^xr?F&E_$*o`_M4JbNk;W#UeT(I~kABI=pKx$vRDI9E5-x_Rn@D&~`7PW;f3KE| zw&>N-vwZL3y?=O%2>bN%OVw6j#Kx7Hw~Ds+p@zR1Rf~t`s^QW*$NCkB5Ib_qy>HBr z&~75NQK;wqNIyqRZmX~}O|T1z*h#9gq>f0desE2aG(xKY!l#ujnjl7)qd{!c2dS$G zwvD%ufA1=AHM9)6{=v;P=xE*@0KUYhYyFjqe8tvd*qAtsEK)!!F`}P_@YEp1q(!Ja zILu}Y!WZy=$*8JWV;XsptlDDq|3tgh&0r2OboLH+)^uXOIw=6Bg6QI^Cd73V7W2*s zdstj&HPm(X_7huploIWIt*w2FQpGOfkrIg1$me-{LtiP=4A)}V>dftf?Xer+{FBy% zaZ}H!k_(9hn=ywZ<9^&9lp-@hUN^T9(vSR1CM{xxw&q%)V=W zD&wXMTsN#E{idG&M(aRMav&oMYn{8PL{DC-rt{-D^w}d5Mau|(N1U|+bkp`eS?=$z zyVhT9fR}OmptW9k4({i@TWRODFzfS#yQXV=ttHDw!Mz5~Rc1ZLnv(3(%5u|*9q)*C z_GMM`O(XkDdp+;7Jmi0HQh~a=Uq};42p$lUUH#G93kT}fh|r&tF;@SurDCIi8smOu1(pPORu>b@u!@c7AB=cW;a<{Nmz4a2`zCv#Q6v7 z*Mt?{+Z1n5*xFC?v}f}TwD3WkU*CA7Y=gYYUF{j4BJM}7b-baEup?*aw4#&o z%Ur}pbpxm=4U~RTsaUI;tWz8Im1Hc?nt#~W85G`(`+YQ98W1OBAJn~$Su=?6f_&{W zT}C>&{0xW1f09`uvRBR-ZTibnje<6z5=5>!#hGD#6KaHmO4=LI$@>q^mm}P_-vXa& zJX)NgO`PD1VXpnhiW$;(cE+j3?g>52q~LXl>$%eR@gY=V62k@}zE8qr){{O+f`n;y z2diRyxmm6|)g|8W&iDgUbUC>bUT-Af$vK2?LU&sZu2B7SfVW*eD;if@YIoe>nXit*Gr$TpR#UJ1k$RTwy+X6$1AX^nnXgnInaLD|v6 z_L42*LBq)X`>6>^4`xu-33QH^c?%79J$cMV1j&7(@BE=FQD3w9sOMtt1W~{24md5l zv_Romm`^*9S0m6a|3>wB0f2Vf$JV~_hrjQnDdF9u&7b0fI*t>=#P4=|6$T5KRu>TgLVt=hg-YB_zPnTE2SZWlu` zXV`mCb57l0vm|%-*TkYQTSB>cF>Y9DDJHcB5A79YFUp<9DJAlT4>lo*7x&yat^8kh zk^HYId!3qXQZj||xROzsa>SM(cFhNcUU}y)O2VpeL^G|eO`}XJ?j@t+rC3P4QFK={ zPPmYZ)n?be{A6t7K>tN)L0L3rT z3`ml?aau0LMgVezFiE$B!k^a5C`TG3(5r@&)2az(dnyI|=7h?NVK0eq^52;(Ze)_wzKHSoY zU(wr-y%V*6Vd3qnbeQes`qmY4Z@nw;}!N zW*UszHn@~n+_iwmtj4a3hDxaM)>(bsnjnM2xl)Zp_Brw<`0i$I1W|1`OulQRs!aZS zfdkXW2m3R7qf=&Ux>5&S6p)KsonN1phR3xf za67IE5P@7gC0tx~I%k6N(l7MDBg}GpVkBZxgeBC!LY33;te%()$_vt-y6CH_p9)(l z%KunUR(GH8;x7g!ux7X^X)pY3FV{p0yK(STL_Wl!@e-;T?YbJYPNdlHDlP#?DXkq6l*9O4?mB{+G8q(8qQ8oth|hX zUbw+5uDz7amr5E^iQ_Y}x+w017%kGe*lGzs`|qE8&b$?tsIPlM;x*R+PETkyHz!6> z{7>Bz19k0VzD{?V!!xzB-!%)PQ%pE(xe|qi$F2nf#fX)bv+&)w>biaUmk^5;BnE&AqL9|5lCNYx%)vF2aE+q2pGO)&{J6j(&POI?W_E zr{_#$^=is?0qNQzRvC7?RoeOr>BC=h!J#m@2l|UW4P8hR=L0f}30R-%U^a0TmeyG6 z=0UmYW5a`FDLXM_Vgx|dQo&)|`sklm010ZDD(4g)>TBN=Nwtp{n;YY`uED00QWo+x z%M{9>;27O&Cf?$Myx%WRX2H?>!CC=S`FQgHTt0w&<324Q!^Wa7k;^o}vc?@vh2PLh zeg_Y)`-U;~c0Em8zfR!vWMxAq&ImhOfVPKP-H#Ry9pW8E4vqhVuD1+}Dr(z?2PF&y zL0UQ`6(l4_L{jN)rMrg|20>an1qtbHX6R5l1gQarZWxAUhMMsm@B4Yb?>nC3`2Or4 z`&fIeYsKE{+UL5i^GuwihIA;Mt5R-KyP5uudHOn*ZnP>(owAX###-Fgrc z<90UU&iC%7DP$gQR8^>3Z>5*|l@8w|e0j-^_IQ4lbjaXTi92y&(T|+P@O8KG89Cko zvv(kt?xl0-?^nLn5vL@rCZ7-$rP~`p+uZs;I|HHK&{Jx?zW~)&Hv-Pwxmk)6?#av2 zx%Cz6IsOXa>oYX$M#^aTXEF7shmM*47`*3nYDxSGi^(uXx zkdR3VRfaL9rpgCug^vGd^^9nqFnaXMDZ+Kzxh%>%-R1khGd>6K8$D~F1#~!@yZFjk zksMDG3RNX@<7b<(P~nB^u4SllNPP*q*Zdb?ytKMhU1*~d*I&^qJfw*#Eg&5w`Har> z9dV@19C4dN2RM!kyVFVJ?nd1!V{Bxr)cDj`TpVRpIwW1tg+3?q+Ykjd7#!KbJkEjF-8*&fyUgygn&PoJ@)_TWVNTt#^?e*DmHRx!YNf3X| z2qw)X(`6~Ba`Uw<0c+l_z>im4^iBx;oC+cIj|hndLp4!klRDdn$~!}hJ5Eb3eCQSe zLmsx2Chisd)Hu0rs;IX3ZyQtebE?NPW2ER%MmrTr4i8xqE<;&U;j<0Zt*?Xk8zT?X z>EZFN_eJ4_h0yyOPmU|J&xix1U-&-@jL+6O_{E60UpuLkQkfY_a&IDT&3r@8dSDck zfHZ}D7y$iwnB^ec!m)|LYsdZZ)uOUd{P|k;!aZ26__GVoI?pg3zofuGUZqn-}2RVzw8Mzf70QT7nJQo1PbscnuqMLllD* zjDnWlba-HoTv`J#{pd)HaE2QQcf=af^T9djW9ezTZ;!|in z^y4XvA0;W&JVz}fJS`m{;UrE?OVv#Jkq`)sj8C{YTWe7fkkEV@$v{!SBok`^S^2@d zaMpL-t*JDf_sT+Yrr?Q0a72@dni#!7#>h}rX5hI7(2R)#AsijkTYudDH zI-(fVvdtgD-BMN!9AFX7>>nDM?Ac|vnx^@};-UH}UL_6gJ5+c2(IX%kq^dGk@VUAq z#LjNkpJ{C`s-i@td6V*d^nCwM<)6XiQfH&km>XU-Yq%Lw>{Yc3IbuI3U+g1&dA)DA zmF3ePvE3Fl1r-YR#hLDt94&^{euoE;tC7KR&5soCL4uz$wrGE=-|@%u*Z<*|NosM#k0J;CYD$TNd}J{i0ZH)Diy!Y)v}QQhnjj@i*}m8k z;P8CR7&63%&H^=d(kK3+fRX)N^{xAvR8ZqfCzm8eAt1+-URIvVmD)T0x`yQE$qYro ziItlO#l<}FXJrn52f9p&Z(r2@^iJX*j})>!o+Vne9+isv2$>H$Yx*+cOwOIrh@?u^ zXq^Tqq*+kQN_=Jwt57RAatyp}-&S2mSg(lgIvp-3;{G{QKT<@0pp>B;*=Hm!ZLI2+ zqxiDN6QNf67qIeZ<@Gz+Mp0{{I94oED`L0gzUMB*6|sW?4NKF7=hgKb-m;7#)1eOa zO!a%A{#7O;U4xz5LbuU*E^*JN0$G7@N5S|oYiJHRQ37Ax@GHwHShe|{r|%@Cq5m(C z?=KS>E)QgT1kx_m2I6g9xv%>WAnahbP8#T)+YuL={}y=v$>3^e?slcPye z7d#_gg*|HX!t3VGseq-q@k_?vmu%>JxTsz4V@pV2OqB}JXcD!}EnRYwhr60LSlFI#Mn zz#povJ4Wfdq@EAjf9B&cR`&QAR%WCvW6G5KHMhbievqaHorvQ;q(DEu5#oOSGB*=P zTC!vdYuqkz|Cbb{uo_6zvMtpgan1HWz#QiPrE%TGJiW!k;c#6zfUY1wefIhw;AFq% zS2YGv{J#lXX7|qi@wk+oA*x*mIv8m-X6zhI-(-6!o--jg7~n4e26wtIUBVz#uf5LT=2@YB`SdTK-FPMQv)xRMjt$@7r_VJ8 zgDphI{MfG6JHd?74qB5c)g(knM3f$^l&nNGQmnJu51Y2L($q`!Ma1!RZ=9?XA{mX1 zF5=!X!I}m7$r17?u^o$VESdb=D-6e)I*54%KsbL4@}3TfV>(T(XRwTO$IkyKdRJn( zMyhMTE3va?H$YnWFjP>V8W49k>rQ+8vCL={5>ldL=UgBNk$sYxJ2x<1{LNay+HSa3 z93jLn@mPyN@oY0)>+GsM)P+8Wa(S_E(95X5XJzHqFV zO5h-$BK6&;GSPCf7ryElxr_9wo!Et83RIP>MQpfi5+!WxNn)vHUqrT=PUQah=C*L zs`QW?{kO46Z*v{C+?!MmcZY|!5(-wrQ4MyT@QpODn$kO6jb{>r#g)^LNb6;FliWLaA) zUYSqYq%~6xnN`3xxyEwZ7X#XyRwXVs&wN#Lv(q`u;TaDGN|GWZ)hQJu)rOR299~lR z`i)>NR2tnyL+S5;4bd~M&K>C;TVpXEp`U6)o(8mOk{-@$NJ#PHa(4UWa4e`A`H&Kk z*)3Ixu)sEy*kVkU>G&dv+e!{&z#^F$uV2&?GL6-7W@aNn0Dn_!6`QuQ9*6MmC1}9k zTFl%W`Dk2bZV{eOzf7Ll;*&NW@l-Q>abQT7xaE5wJ}DlKYRc$C7#}deus%-u%yKE_ zRSVH#HE450j-x7W<&)Mc(?Z)YTGm7hTR}*E4hyXf%WJwQ%KeXUjwQO`>BBvG;|x=w z0X8YE2;yN7*B49t1X9OT=6%A5ACj)#AQG@(6#U#^>_RqkZ1z|DfYx^H^SE%MGT1Pc zQ<1Z^3}duNl;LP9<>NjpHr?S6ve1AG)<*Knq-@jtqF}v;MihYk>O88#XA)s{_cmi}#pEnLRrayJLyRG6=2@?=~W)-Z=fpf(R@$h)YT;4wcEf=<3E0u(E ztJ+!dGyxn|l?uobV&!gI6HzOcXe2rlo>mFXz$U$GS#N4iT2Qzy&67{=GnngV%l;EZ zrH0@EII?i)X0451r0w_5ikPj!lUiyDBM4Isp1I$B*4XruzIVZKEx#t*$e)|s=((J% z48)L5n*B!bUrJ`k;WFZSgy!?(_Rl&Dc%LUYA_maoeCJ?<}nM*0R}lQ?tQ3G;t?M-=5QM-SG@6h4SVVHsXSw6egHV z7v`#Ud##0aZ$h6hPpwJ%Slh<3Q>HrV^TAaz#n%fAInpBabagDtve-56N74MGm5*^` z-GdTjME>5feWvI2`Yw>VI9ci91!42L{ZhBr{YKP^$CArcmeb}62!&ZtZOKma<6jM- z&5tsWkZOoz3puq<4NGlAl1sNrCH<~>ttnnU@C)BCAld0zP7duTg``a`b6u1GW2XPB zlC-=Tjt&)NIX78oQ-X(b2Y&G{H=M$nifYh@L{+YlQpay%bK>40DC6}3wZytU=fb!V zcbR_Jh7I|Bjp*7@rw8?dM1b)9(ijf?*XQ$2K?>14iJ}(Of!VPOG{e#INk9qx=y~?y zL9HP*bNxh19w(hNwt01-Q^sF)&gg)&BUU6d=Sd{Z`*Dx66xaJ74AKYu9_~FTtvSP! zm6iw3N+Uk4Kz6T4y)$pT$#pmD;eDT3^MVT4$au7MKRNR>mX=8aW<;!g2yJq$bvvA& zSf3KzmHnz%SzOr{U6K^{T~p$fzrvSY8F}r3BpkzG5Mfh9y6C&OPsdeI7F*I8so#ks z^xH4kKkUoh7qPB0r>YHgY6?7r)luE zBOedrLoJr64Pzlyc4gi|AAZ^g!vd`LpBYk#6M!W66%EKn^+acl2VMm2rE#Mq148oO zdOgD%l%MV?oHEkA8~jYN1fGjd5`&@oCYh^a1n1$bf3{yP z;N+4R1+r@RwS=Ad5k%WB&-R8@2RgWCG+ak9>|~`%1?k)d<>mRqk>#e1 zrPmK{*xTWUm5bk6>Svg+v}8nAY+hg@k)s}}XX4?v< zo2neplp2BK^d|R?Aw2<()V>+FwrYL`-(9>`#T1D(6+Rl9RSTrLk9W1nj5|ep=iD-o z>Ag3L<-bPvGBl>C)6zUSPVo;fTLsMQ`oGK)^Ev!};B{gPQFBQcF4q=+_j)fnL5$~u zLU*#qRDo`m06zwNj7su`Hwq_t(yI~C^`2i%gl4*z7~&0?{2FT?S(Eb|d>U(vVZ3MF zb7Lk}7-gSp-qD`mv>035erw0%+iDdrhB<06w%rMRP3 z*fy3PP#@pdv9KKu)W6qtlC;pZA?=~eoe{s12wv?q`U_aaQ5~3DNcwrF3SUF?7>h%% za-w5CXN%N~l(8ClK@Xqq8%upHdYr_EEM$7as6IUxAY@!s1Z@1CdUj~W1g*NmkUm@z zixUPLr&m8ka7b8g=oX3i&V*;*%WSf;tE>C<;G2UZXqrcrl2Yp9rcJ_~$ighVgT87= z%m#a1ZQ@dGQK+P#urA;MwWU13-2yO#P$vr6rcAVY7(94S@2ZsfG3k%H2fKH6kCGY0 zm#;dennXuq6?1y6glaWDHgvhLFJ~Du860c5I@hjj*S~Vge8VNYej%(fY;DRHH_z5_ zL)I0b4MDceZbAFk50|9;EVY8t3@KjDjhPfEsD%vF+dL|qrhKg54x!&+=wI@$hhEr- z5;6hmGj@v2yeU4u8vMFONwk-lp1<Iu_}aQseU@*Yon(@)|nhM7#HEzmOF+h;P)%JIWvbvv}*m1!xAKWfu`!vx+&T*;Kq*Z zYYZQ$2jzQ-xH2SORe!38o~)*psnHu|N2NpjtCNR9LS^(+tUpXUo%Sh?i(XFE3{>YG z1ZFkVf-qa{4ru5{O$)AHA8Kn-VxC9uBWtvIl-$U+S$S?o0`%m`6%&5HpQI?%%`awU z5l$xPJf>e8#;$r2TtGRHkKw0pe%Jp|jNrKV8PcV9;=rU%V$fp;xYs+zd_sfI6Y4VO zUDA=9j`FQ4Y5RZ{D&G^TU5#vK{jBa2-gv@}QS6r22239_^Q55Iuo6<`(7%8LgU};d zj)kg%nkgj1%B1aGtk9D5^>@ekbWJ1=)7fLnzW_TSL0s6qvp&jX#OJPtQ=L5y*kHls z3sk_GuWWbz@mgd!I;>*^?7Of1x6Q99`#P%Q-8*$3pe8DVzA|+E^e?(YS4!9UCIS^# zKV))Rb5zBkdc~`aPw9aBOVD&51=lncczF=TS~~pN49Vt+a9jLP8tUGxUaw4ai&0An zbS05_v_sK6Ruop^zsP9n(H23i7}-Cqk?F9=t6}M|5&o(IQ7}qdoM`l7;-~$+gmB*@ z0?c|1s%_lqe2{#_OZ9M|CsvL!jqMRSZY^T3-vW$J>9Rxapc3Y<#@I97wtN$ECEs8%TL%F)>j|K)7<5S*$qhtc&_OkTpvVV4;#@u{FwhlPe)Gmej;{9 z#m~k|3+Y0ImRZZS3A5S;k6?okg+Y_I#=#f6e>e}|>?uzp@D0czv_@27Od4-~J9T5^ zj}E=#Z=Q8c#vg-Tyws?@y4YT7vsaBX7>o!~?j4l#~~S0EU=%?UiNh?}Le zGg;i12y?>_V0ey5SZcEhQCRPxq{6Q@3aeCKO$5>hpd?TYr-*no)ajIDy*nf*Z);cf z8Z0M*&B4H$a@AU~XUKe~wg|#SI9A}C$^3!~eJQh-=YP>*y9JZ;LIxyaHoH%HnEG~Q zx)4|0=&HN0DymXMI=Tc0(2gsA#$Eb>xZGRmn_r9_`e!&4BD>}X7dl1r7l18A z9})Xs9F14U?ZE-yfq~D!wOdQ3|JaOsAm9vVS%nj>68ZnugzdUPhfDjTcVLPjWbW0j z8}RCCfE3*tA8;H|qr)$!0y;W!nY}%fdW4H8_l(B{GGT8m08h+1)=6<)K_OkQc8|@k zE(dVV9nNvpz_m;Up7uwh+i--ss2E#zkj{{s|$5Odhi#SRd#9siESn)E# zY&yskgtLbUXAk(li=_iHQWAw&h##o|`+NU?I_m#F_fTE8=LXMjZzjO7Bha5S2Ep~` z*YRf93+MQ&-CFYlkMq0Owg6OouAbhbUpNAy4r5EKzZ5Ap=ot`k)M0;h;q-q;EB-&D z#e^HJ1;rY(0aJ!4NEfbCOt&$bxT=GA3f=dMLZXwgHS@5$t*D8=fQ*QLPxwE-#vHa% zPk_`ZKeevmY&ZXp?MNI-V;%_m#q?`-pY}duw!35n?j4Z-jO+F9^-$a(L4seZCFk;8 zUHs2v{kQpllQoU-VsLk!f#9+oH@gF6a{Hgjq*DWTdR$8;NS&K$#?A63J!iOXJH667 z+9Z^+*`wC`$LJI5Tb1gObN8%49ESI#jNwws2!cQyJ#tCZSOL~->ObKxv+V~M5T9vggQ>%hp+a}+u?^L(^3&J*E&Igo3IA6rBm1|B&7YwukFzWCQKE)#c%51kY|U8bnIn@^1<$#Np==M~Rd+`VY<(xGzdbah=g!V15<;lm?0R#tk4g3BhxtTA20U%~u>l5V< zf#mGDP##7tE9d9s+!W#37}Cxlqp`Y0g5+BpHnm5r(M%#AM`?yv3^^n96>f_Rf;t?T`vcyL|(ieZX8G)HQd|mOQL+;^a!q`^>`Y9HWiuY3pp z0^XP0G6bN9VK*vF7oV=fL|JC9pA|A`+;fY-xK;9x*Gn#YMB!aK%9Vt@jqb`OWvmqY z;AX?Le|z1-NaFpmX6V84@6lNCScAtVg%XD6q38HaRxi)w;UNwKzf;Y3N-7>LknhI7 z(&6HN^O~`-N>!RrT{XgGdU8OOKyq~b9-G9h8{x%TX#XI0V?Jd!u7`idx^?Syxn zr|Y!V3@vBnvgAv`<8{b$%dM!df40TU1d?d1!^=hAIFg6$t&Q9v(8?m8GUpCNbRagd za*KWs9kxr0^&UWc&}31rsAkV~Icshf27|{ej$w%hgPe=e!Nrh8q>rN=DqjN}Hdw)Y z27saT3jN6bRD`;U2*1#p?4cwO;gAw;^u0BCyiwPDEn%1Tz(IoUff9~Uzp(f-C0i7w zu8skzo8=k7Vk{r*(=ShHc%7|}$M4_0X+GY3qX)`-qsr{C{Lqf+CGckPJu7~e_jxt;9bEj*;oUqZYwhyQVeKa7Kc@t6I zx##@q_|TsHZFETa3={vyw9YR$dN=VGZZkdXYV}fabkEs(-X(mU94Z`AJD+iXhjZL% zUCT7$RpOn7M$l#rM0$k92%0#&65gh8=WO;@>SU6{vu>+qPCoq75b73fs4pvk z@&Wu{`SxHOkM12$lTd34c@yBA$@V&kq0fZ3J}arTQBz%Ao#Lr2>H9=^q20!s2T!;K zP3ePMr!hoLF>TK7#y?|a=4|mC&WsjKGI@Q2dD^23E&}$InXe}_xI3P7sXIz7E{#6U zAeWC~N&7v^P7Y~##*du&YW=APCF;M>1x0xNnU()x8In`s+9$6{>>$lt#GOzV z8?s0DCRn@$)sFjusNatZEFx33EbcS>7N5I6@|v!yB8F}w;`P~xm}q~Sx!B=CJvTpQ zn4iXHs^?DFZ@P?+rmu4{c{+v1gp?U{f#y4)+7GE-75FsIPA{ zJ^h+Ygk5oHsMqj|Sw|cu$eCnM`Rv7m0ZqhvFGs?&L&!X1mg)Y&^%P~uDR$q^1TXkR z*+qA++mZd*@ZO$a(&bE>7OR_xuJ8Nk_PF8*VWFq~pnwz{h1qn=S4%E2kO=dlzbq=M zCE0JGBp&TFaR|2w(^KXU)!!@B%;x&qR5a+MCC&!n%|X@3Jt|pzTCwDvvwouwX-z91 z|KRMxR+5mku&Vf?I#T0QrX@2mJ7(*-Q6k65kW9`<9@*iA@J#=Ac0kpKFAEay|`O3I!q4F z8-E2Jz$D0M`nswOiS$sugOD>`#M8vafSslk5c{IGw;q!PA%0UWMf0ix|QtHnwY|mxQJvsB|O7efBZfq zQ@iHU6Kd$E7z!^I)BL!%nwtdgYHJc%3r;jZqH)rRiG&YS|1>xfyon$aJuY@g=6m~; z&qJT%y+@c#vNOqZH}N`?8(ai|cLQX6^rvnh$NVh&WH*|8MnUD)PRVynXaKXzL6G|NlTAj%HK8@oMYmAK0!e<-w;O$7OVv`hD(Vo~-(nR(`$V65G{NsLz z9DR~PA(0@?1&JcDx)bIK2|Bs4M5c=lj8We?%P@L2JV4pMLeTPNJ(isq9mkffK)FmS z&s)eXvfI6Zmbp_Lo)qm=cxnGpfggR|U|D`D^75{q$3>UBLDNO?tWaePt>#{=dZTTM zSQX^($iIs!sjwGsU8#?MLyIs*^9R+l&mzZ555qrJ+fpFdeR4a}Awe6BqHUr(UCz*F zDO86QYcCVj_hUd7+rhE2!+ZE&@EJ?w<>RW@kRF#`KmXY}`IS^sny9T-!01|-WcSiMD;ptq`e-ac{9@2hiP*3Y&M_quEvB0En`8Vf zbuBoZs&{!QCVnwv__qHiVl+%%*9MCSES;x+Kd)Rw%rW4^KNMG9G6=%1EIA4{UbXsr zC>8iw6xh8zc)};{c+_|JdkEQ&9J)CY;N1EBk(`%d!HwPSN9n99a=6~yq?=MTWjobh zWY9bEWj3;Xo^XX{Nmy{)lhKl-{11XwF_DHc`ImzP?*re@2BF2-j0Xw>F;8Se;lBJG z@*&+HPUgnCprTl6YARm5&pjK=(Gg@JKP~Okc<9Zz7~awK5v!C(7UU>%Jvs7=__So( z*|oUd+`Q<*u$5*n*Pb-I*)YP}^scS0LQsTjLMtq`b12aJ?46rcXO5QPxAJi|h~c+5 z!;H=3-szki{Td&Rmo(P!iz8vDeuF)`a>w^?3>lSDmp}8e667<(&6(D^(e_6%CJx31 z(SSS#ht&L1;pzkrsRl%5PTD)?uK6L3?{Egh63gM^pJ)ltOuDvlR0{bc`wA53J5r+b zp`vztMZq^dM)5tHf^YY!@itP)jUUTi2go#ahAW-i*Lt=0%pQ9>aLYhF){GOYpICyA z5s!o<^`A7K4J%QG%a}+YMXNN~FOfkMl25=T?3b|}S+bHz4@P7$tiWHz*+M>zxC0v8 zsWR$mHV=v{*j*h{(mFi8DEjJ!YI6b~X1akx#Zp=@ z-@-33e{xyH%w`t@lJi9=CcUfo;azMV#=rsudb;Vx9B?7xCli;G%PURDL>fZt*G{Q; zfbpuosnHB1k_-Q*gOX_|(=m3T%ej0-m$5v2r8y_*>2h1wed`rNw8&t1jJ9x&4QqzV z1O;`%;f}NdPoe0e4>Pt9bu+y&=z1ETQMGsV!%1G4W-K=>Bwj592R(BJxjR2vYi`9M z8aL9N=lI?-ERr8zHEJUjo@I3kTpf%PeHa@aD*o5@%80@${)?cEJ?$G z@74IuT%J7}7i;Po#kd|Vz+p8wkmQ#7fghGE3OM~2K$;Ikjz?Svpdc3r9mY@;Nh|i@ z7bX)0cB2)Oz{l4KL^ma;s$DR2hl{&ehwLpIilhzuC=8IhhKrLr1V{XtGe&r>)k0gR zuSw@5W>c|bH$-MwvM|nHlu=!iD<9y2b=F&w6VHP+k=t~eK663sf9Z(V_c9Od_ zyZ;xkf42sF?^pa4$fAqs^e7(-VLHskiFCIsUi<|R8Es_a`qy#GMLK>H-RB;Fi{iKz z;J0wS0mj6mu$XmV&7}nTM)QUUC#rd`7yP?~8kZfA4r1CsVE1kV(2>}#LC_JZ07ZHR zf*pSa-tN1bUmX_Ua66fcvN-VIf1kZ-?Z0$-CH3)yEe6L84GF*XP``>fmcG#jmy&c~ zr-OR1F3sTkzjARVs>a_UN>$^ha_2?6IuKy9jw{?4@2J7S9xr$2dht18yAfcd;sHazrNR>|$RN&-=};yj z;khT)c9#zf59lm7#hMEKx9v9E+11}2X0;Xk>Nx^oYR2&j08w}qS9!CU4a zx$56cBr?t4HCA)nr{z9h0Jnoemq5@F6bV#&7dL@5Yc#G`GZuauxCxZH1{vRu%jAG( zaiLUVxFQ|@DN+#r6NfQ2e^O*JN7Kp;?BvdE#Dn~plz;rVA-ZZ^F6jPzLu8QkD6EBu zEOO)6y^%f;xIMr)C!~tK1&-V<>3qMv`)`#0{QB6L+jGKnb@1ah27WtmjyiYQl2=uq z1CC7z9NfQ?@~^g&UJJlqK#Uq6DQ+dYPkVQ*f-}%I-al}%s(Y=uFaB$AF3w;a!n~r0 zV_yiYTNkT2WpLFzXQ~DD)zQR+-f~d}JY`yId>g0Z_MV!a$$z#lOg-_G!MASG4fp|f z%%=lByT=!Zm>;6i(J`XXk=N0E3!kvl)dld>tOm3K-dT=UK0$k8bDoQW$Bq7@?*)_W z_yY;3_;4YE?EmDj+}P6I=dIUT-dgOc46aXE+;ga-RMz<`u7zfruFe}YQwc#geHoo{URE@BQJR#(vb1~O9 z`?49z)UtOKtv66~-0ASfb(_V|)d1P+@JQ6V9a) zef+wR)>QrDs4{A)D@!z@@u}C->R;!3tOG7oc3&RK$GrmuXOnSKvIi5yKd?`nxwtqQ zcA6!1ab{@99X^b1&tamB`DF{`I$p3p0VQwju@q$qDnhKk*gVTGvx}lo=Sxy}^fhAl z)#u;10fR1E?+93J!BzA5i&3b6EJ*?zWoG5$M@ucb*s&^5jR>HJ57e3>1(?T+x4{QgQM=ou_r^f6E%r z@jlC}y)Gu<+^_ZE<-UKYwZVekAB^#$WXqX(bJjibL&kX(2urM0Z04TQqb-h%RJZT% zSgX6__p>6P^g|;<+;z1}Ew$wz;4(8-%2OvIZP01F8a#l{#3y)EME8;K$fUgJ>q+P9 zsPLj6m6i?po{#+A##!lRxV);lSaF=GGV~*E7^qf)RJR7WXCjRsf(y3^uwWz{^s=@BT5|J%T}|m66gJ%S=0gVY-w;A_JTc_KE0}kbQh`bUPi$8MjZZJLz1`1v)+Ve%Dq_H1 zMr8$Bb_W2~cmwWJB)S#fSeQd2r9LrT^*3QvXTTukTh3fpldldkKh)1Lz$2!qg@VyP zVFYVoWf%Z(WJY0PM?zI*xtRuep(6_}$Ef4B6m$FB%zO)B`8&^t^tzxm3_l{)O16PR z(|*jdICTjPUdbV52~7)lfL{s z+vU{|^hAR+H(?0)ftG8k6{zCRf@y* ze5m>1CywN)ix9ZRLnI)+hGg zl~W9&dka2@V!KCl`OqG>4IgEvwQBh=?Ipfu%4LLj&vT!M$o#>&)JZ+ADXVw`4i*5y zTFdKdQQ?6jj@|^&Uh~(EShaQtqxl+JrP+gL-A#&|n?q~KaX^9y{9Natvjs~Qm`^0M z^lR?6y74s?JNn6K>AoavQd=$2$fz_}#&4rO!vwBU>5Z8rdhYVNsXB1%Qz|kI{oAAh zC~Rm_sj>}89Bd_+?5BXwZC+Q($JjgGo-i3V#$A;Kvy&FHjWQ6!?

u$Y$1VIL5FVD2XP2sLo$YKLi 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 FyY{ZB!s&yj(ev*?3R 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⪻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%0Anm4x64qv?(5@e}z@AVFx56>kS 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⋙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 uT>PW%TYsy>kM=*^tbe?i Date: Tue, 1 Aug 2017 18:45:58 +0300 Subject: [PATCH 54/58] Pull example. --- .../Examples/Camera/Camera.unity.meta | 2 +- .../Examples/Checkers/Checkers.unity.meta | 2 +- .../Examples/Colors/Colors.unity.meta | 2 +- .../TouchScript/Examples/Cube/Cube.unity.meta | 2 +- .../TouchScript/Examples/Examples.unity | 1280 +++++++---- .../Examples/Multiuser/Multiuser.unity.meta | 2 +- .../Examples/Photos/Photos.unity.meta | 2 +- .../Examples/Portal/Portal.unity.meta | 2 +- Source/Assets/TouchScript/Examples/Pull.meta | 9 + .../TouchScript/Examples/Pull/Materials.meta | 9 + .../Examples/Pull/Materials/Green.mat | 76 + .../Examples/Pull/Materials/Green.mat.meta | 9 + .../TouchScript/Examples/Pull/Prefabs.meta | 9 + .../Examples/Pull/Prefabs/Cube.prefab | 276 +++ .../Examples/Pull/Prefabs/Cube.prefab.meta | 9 + .../TouchScript/Examples/Pull/Pull.unity | 1990 +++++++++++++++++ .../TouchScript/Examples/Pull/Pull.unity.meta | 8 + .../TouchScript/Examples/Pull/Scripts.meta | 9 + .../Examples/Pull/Scripts/Logic.cs | 102 + .../Examples/Pull/Scripts/Logic.cs.meta | 12 + .../Examples/Pull/Scripts/PullGesture.cs | 172 ++ .../Examples/Pull/Scripts/PullGesture.cs.meta | 12 + .../Examples/RawInput/RawInput.unity.meta | 2 +- .../TouchScript/Examples/Taps/Taps.unity.meta | 2 +- .../Examples/_misc/Textures/Examples/Pull.png | Bin 0 -> 9274 bytes .../_misc/Textures/Examples/Pull.png.meta | 92 + .../ProjectSettings/EditorBuildSettings.asset | 9 +- 27 files changed, 3693 insertions(+), 408 deletions(-) create mode 100644 Source/Assets/TouchScript/Examples/Pull.meta create mode 100644 Source/Assets/TouchScript/Examples/Pull/Materials.meta create mode 100644 Source/Assets/TouchScript/Examples/Pull/Materials/Green.mat create mode 100644 Source/Assets/TouchScript/Examples/Pull/Materials/Green.mat.meta create mode 100644 Source/Assets/TouchScript/Examples/Pull/Prefabs.meta create mode 100644 Source/Assets/TouchScript/Examples/Pull/Prefabs/Cube.prefab create mode 100644 Source/Assets/TouchScript/Examples/Pull/Prefabs/Cube.prefab.meta create mode 100644 Source/Assets/TouchScript/Examples/Pull/Pull.unity create mode 100644 Source/Assets/TouchScript/Examples/Pull/Pull.unity.meta create mode 100644 Source/Assets/TouchScript/Examples/Pull/Scripts.meta create mode 100644 Source/Assets/TouchScript/Examples/Pull/Scripts/Logic.cs create mode 100644 Source/Assets/TouchScript/Examples/Pull/Scripts/Logic.cs.meta create mode 100644 Source/Assets/TouchScript/Examples/Pull/Scripts/PullGesture.cs create mode 100644 Source/Assets/TouchScript/Examples/Pull/Scripts/PullGesture.cs.meta create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Pull.png create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Pull.png.meta diff --git a/Source/Assets/TouchScript/Examples/Camera/Camera.unity.meta b/Source/Assets/TouchScript/Examples/Camera/Camera.unity.meta index b080cc30d..5c8bc3030 100644 --- a/Source/Assets/TouchScript/Examples/Camera/Camera.unity.meta +++ b/Source/Assets/TouchScript/Examples/Camera/Camera.unity.meta @@ -1,4 +1,4 @@ fileFormatVersion: 2 guid: 9bc4a96ba8ead427ab54f883160abc15 DefaultImporter: - userData: "2" + userData: "3" diff --git a/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity.meta b/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity.meta index 35dcd603c..21cb61b30 100644 --- a/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity.meta +++ b/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity.meta @@ -1,4 +1,4 @@ fileFormatVersion: 2 guid: 6ba58961df0a14cad91763f92bda13b9 DefaultImporter: - userData: "4" + userData: "5" diff --git a/Source/Assets/TouchScript/Examples/Colors/Colors.unity.meta b/Source/Assets/TouchScript/Examples/Colors/Colors.unity.meta index e00912d5d..f611b96b5 100644 --- a/Source/Assets/TouchScript/Examples/Colors/Colors.unity.meta +++ b/Source/Assets/TouchScript/Examples/Colors/Colors.unity.meta @@ -1,4 +1,4 @@ fileFormatVersion: 2 guid: c56b29ea5ec5a4713b65552d4a8bd9ac DefaultImporter: - userData: + userData: "7" diff --git a/Source/Assets/TouchScript/Examples/Cube/Cube.unity.meta b/Source/Assets/TouchScript/Examples/Cube/Cube.unity.meta index 54ac72230..18eee7b08 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Cube.unity.meta +++ b/Source/Assets/TouchScript/Examples/Cube/Cube.unity.meta @@ -3,6 +3,6 @@ guid: 179bea80bb29f49ab9d5761fc9d3738b timeCreated: 1451049198 licenseType: Pro DefaultImporter: - userData: + userData: "8" assetBundleName: assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/Examples.unity b/Source/Assets/TouchScript/Examples/Examples.unity index f6e0f851d..e68c675ed 100644 --- a/Source/Assets/TouchScript/Examples/Examples.unity +++ b/Source/Assets/TouchScript/Examples/Examples.unity @@ -1,19 +1,19 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: --- !u!29 &1 -SceneSettings: +OcclusionCullingSettings: m_ObjectHideFlags: 0 - m_PVSData: - m_PVSObjectsArray: [] - m_PVSPortalsArray: [] + serializedVersion: 2 m_OcclusionBakeSettings: smallestOccluder: 5 smallestHole: 0.25 backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 - serializedVersion: 6 + serializedVersion: 8 m_Fog: 0 m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 @@ -25,6 +25,7 @@ RenderSettings: m_AmbientGroundColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} m_AmbientIntensity: 1 m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} m_SkyboxMaterial: {fileID: 2100000, guid: a07fadb24ea940240afba3afc1a692cc, type: 2} m_HaloStrength: 0.5 m_FlareStrength: 1 @@ -37,12 +38,12 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} --- !u!157 &4 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 6 + serializedVersion: 9 m_GIWorkflowMode: 1 - m_LightmapsMode: 1 m_GISettings: serializedVersion: 2 m_BounceScale: 1 @@ -53,48 +54,70 @@ LightmapSettings: m_EnableBakedLightmaps: 1 m_EnableRealtimeLightmaps: 0 m_LightmapEditorSettings: - serializedVersion: 3 + serializedVersion: 8 m_Resolution: 1 m_BakeResolution: 50 m_TextureWidth: 1024 m_TextureHeight: 1024 + m_AO: 0 m_AOMaxDistance: 1 - m_Padding: 2 m_CompAOExponent: 0 + m_CompAOExponentDirect: 0 + m_Padding: 2 m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 m_TextureCompression: 0 m_FinalGather: 0 + m_FinalGatherFiltering: 1 m_FinalGatherRayCount: 1024 m_ReflectionCompression: 2 + m_MixedBakeMode: 1 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVRFiltering: 0 + m_PVRFilteringMode: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousColorSigma: 1 + m_PVRFilteringAtrousNormalSigma: 1 + m_PVRFilteringAtrousPositionSigma: 1 m_LightingDataAsset: {fileID: 0} - m_RuntimeCPUUsage: 25 + m_ShadowMaskMode: 2 --- !u!196 &5 NavMeshSettings: serializedVersion: 2 m_ObjectHideFlags: 0 m_BuildSettings: serializedVersion: 2 + agentTypeID: 0 agentRadius: 0.5 agentHeight: 2 agentSlope: 45 agentClimb: 0.4 ledgeDropHeight: 0 maxJumpAcrossDistance: 0 - accuratePlacement: 0 minRegionArea: 2 - cellSize: 0.16666666 manualCellSize: 0 + cellSize: 0.16666666 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 m_NavMeshData: {fileID: 0} --- !u!1 &15691937 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 15691938} - - 222: {fileID: 15691940} - - 114: {fileID: 15691939} + - component: {fileID: 15691938} + - component: {fileID: 15691940} + - component: {fileID: 15691939} m_Layer: 5 m_Name: Description m_TagString: Untagged @@ -111,10 +134,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1037999862} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 15.699997, y: -4.8999996} @@ -165,11 +188,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 16824282} - - 222: {fileID: 16824284} - - 114: {fileID: 16824283} + - component: {fileID: 16824282} + - component: {fileID: 16824284} + - component: {fileID: 16824283} m_Layer: 5 m_Name: Description m_TagString: Untagged @@ -186,10 +209,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 758236082} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 15.699997, y: -4.8999996} @@ -239,10 +262,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 37557109} - - 114: {fileID: 37557110} + - component: {fileID: 37557109} + - component: {fileID: 37557110} m_Layer: 5 m_Name: Examples m_TagString: Untagged @@ -259,12 +282,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1317055114} - {fileID: 767854197} m_Father: {fileID: 2032927211} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0} m_AnchorMax: {x: 0.5, y: 1} m_AnchoredPosition: {x: 0, y: 0} @@ -287,13 +310,13 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 62216952} - - 20: {fileID: 62216957} - - 92: {fileID: 62216956} - - 124: {fileID: 62216955} - - 81: {fileID: 62216954} + - component: {fileID: 62216952} + - component: {fileID: 62216957} + - component: {fileID: 62216956} + - component: {fileID: 62216955} + - component: {fileID: 62216954} m_Layer: 0 m_Name: Camera m_TagString: MainCamera @@ -310,10 +333,10 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 0} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!81 &62216954 AudioListener: m_ObjectHideFlags: 0 @@ -365,6 +388,8 @@ Camera: m_TargetDisplay: 0 m_TargetEye: 3 m_HDR: 0 + m_AllowMSAA: 1 + m_ForceIntoRT: 0 m_OcclusionCulling: 1 m_StereoConvergence: 10 m_StereoSeparation: 0.022 @@ -374,13 +399,13 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 96104532} - - 222: {fileID: 96104536} - - 114: {fileID: 96104535} - - 114: {fileID: 96104534} - - 114: {fileID: 96104533} + - component: {fileID: 96104532} + - component: {fileID: 96104536} + - component: {fileID: 96104535} + - component: {fileID: 96104534} + - component: {fileID: 96104533} m_Layer: 5 m_Name: Previous m_TagString: Untagged @@ -397,11 +422,11 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1784197137} m_Father: {fileID: 666412329} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -515,10 +540,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 174295523} - - 114: {fileID: 174295522} + - component: {fileID: 174295523} + - component: {fileID: 174295522} m_Layer: 0 m_Name: EventSystem m_TagString: Untagged @@ -549,21 +574,21 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1654745587} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &201561626 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 201561627} - - 222: {fileID: 201561630} - - 114: {fileID: 201561629} - - 114: {fileID: 201561628} + - component: {fileID: 201561627} + - component: {fileID: 201561630} + - component: {fileID: 201561629} + - component: {fileID: 201561628} m_Layer: 5 m_Name: Button m_TagString: Untagged @@ -580,10 +605,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 870787322} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: 100, y: -4.9} @@ -690,11 +715,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 299753859} - - 222: {fileID: 299753861} - - 114: {fileID: 299753860} + - component: {fileID: 299753859} + - component: {fileID: 299753861} + - component: {fileID: 299753860} m_Layer: 5 m_Name: Image m_TagString: Untagged @@ -711,10 +736,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1037999862} m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: -86.3, y: 3.8} @@ -758,12 +783,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 309713871} - - 222: {fileID: 309713874} - - 114: {fileID: 309713873} - - 114: {fileID: 309713872} + - component: {fileID: 309713871} + - component: {fileID: 309713874} + - component: {fileID: 309713873} + - component: {fileID: 309713872} m_Layer: 5 m_Name: Text m_TagString: Untagged @@ -780,10 +805,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1.6333333, y: 1.6333333, z: 1.6333333} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1402896514} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} @@ -847,12 +872,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 321008078} - - 222: {fileID: 321008081} - - 114: {fileID: 321008080} - - 114: {fileID: 321008079} + - component: {fileID: 321008078} + - component: {fileID: 321008081} + - component: {fileID: 321008080} + - component: {fileID: 321008079} m_Layer: 5 m_Name: Portal m_TagString: Untagged @@ -869,14 +894,14 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1449561975} - {fileID: 1241691652} - {fileID: 1894139120} - {fileID: 329812103} m_Father: {fileID: 2098255038} - m_RootOrder: 6 + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -938,11 +963,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 329812103} - - 222: {fileID: 329812105} - - 114: {fileID: 329812104} + - component: {fileID: 329812103} + - component: {fileID: 329812105} + - component: {fileID: 329812104} m_Layer: 5 m_Name: Image m_TagString: Untagged @@ -959,10 +984,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 321008078} m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: -86.3, y: 3.8} @@ -1006,12 +1031,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 341179473} - - 222: {fileID: 341179476} - - 114: {fileID: 341179475} - - 114: {fileID: 341179474} + - component: {fileID: 341179473} + - component: {fileID: 341179476} + - component: {fileID: 341179475} + - component: {fileID: 341179474} m_Layer: 5 m_Name: Button m_TagString: Untagged @@ -1028,10 +1053,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 574950114} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: 100, y: -4.9} @@ -1138,12 +1163,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 357107825} - - 222: {fileID: 357107828} - - 114: {fileID: 357107827} - - 114: {fileID: 357107826} + - component: {fileID: 357107825} + - component: {fileID: 357107828} + - component: {fileID: 357107827} + - component: {fileID: 357107826} m_Layer: 5 m_Name: Title m_TagString: Untagged @@ -1160,10 +1185,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1037999862} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 33.699997, y: 21.6} @@ -1227,12 +1252,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 363049655} - - 222: {fileID: 363049658} - - 114: {fileID: 363049657} - - 114: {fileID: 363049656} + - component: {fileID: 363049655} + - component: {fileID: 363049658} + - component: {fileID: 363049657} + - component: {fileID: 363049656} m_Layer: 5 m_Name: Button m_TagString: Untagged @@ -1249,10 +1274,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 758236082} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: 100, y: -4.9} @@ -1359,11 +1384,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 385551183} - - 222: {fileID: 385551185} - - 114: {fileID: 385551184} + - component: {fileID: 385551183} + - component: {fileID: 385551185} + - component: {fileID: 385551184} m_Layer: 5 m_Name: Description m_TagString: Untagged @@ -1380,10 +1405,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1004776690} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 15.699997, y: -4.8999996} @@ -1433,12 +1458,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 406504771} - - 222: {fileID: 406504774} - - 114: {fileID: 406504773} - - 114: {fileID: 406504772} + - component: {fileID: 406504771} + - component: {fileID: 406504774} + - component: {fileID: 406504773} + - component: {fileID: 406504772} m_Layer: 5 m_Name: Button m_TagString: Untagged @@ -1455,10 +1480,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1037999862} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: 100, y: -4.9} @@ -1565,11 +1590,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 452970292} - - 222: {fileID: 452970294} - - 114: {fileID: 452970293} + - component: {fileID: 452970292} + - component: {fileID: 452970294} + - component: {fileID: 452970293} m_Layer: 5 m_Name: Image m_TagString: Untagged @@ -1586,10 +1611,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 870787322} m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: -86.3, y: 3.8} @@ -1633,12 +1658,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 507770921} - - 222: {fileID: 507770920} - - 114: {fileID: 507770919} - - 114: {fileID: 507770918} + - component: {fileID: 507770921} + - component: {fileID: 507770920} + - component: {fileID: 507770919} + - component: {fileID: 507770918} m_Layer: 5 m_Name: Title m_TagString: Untagged @@ -1708,10 +1733,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 621592926} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 33.699997, y: 21.6} @@ -1722,11 +1747,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 558528359} - - 222: {fileID: 558528361} - - 114: {fileID: 558528360} + - component: {fileID: 558528359} + - component: {fileID: 558528361} + - component: {fileID: 558528360} m_Layer: 5 m_Name: Image m_TagString: Untagged @@ -1743,10 +1768,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 2076713667} m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: -86.3, y: 3.8} @@ -1790,12 +1815,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 574950114} - - 222: {fileID: 574950117} - - 114: {fileID: 574950116} - - 114: {fileID: 574950115} + - component: {fileID: 574950114} + - component: {fileID: 574950117} + - component: {fileID: 574950116} + - component: {fileID: 574950115} m_Layer: 5 m_Name: Taps m_TagString: Untagged @@ -1812,14 +1837,14 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1800191864} - {fileID: 745674114} - {fileID: 341179473} - {fileID: 865431078} m_Father: {fileID: 2098255038} - m_RootOrder: 0 + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -1881,11 +1906,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 595145115} - - 222: {fileID: 595145117} - - 114: {fileID: 595145116} + - component: {fileID: 595145115} + - component: {fileID: 595145117} + - component: {fileID: 595145116} m_Layer: 5 m_Name: Description m_TagString: Untagged @@ -1902,10 +1927,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 601448587} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 15.699997, y: -4.8999996} @@ -1956,12 +1981,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 601448587} - - 222: {fileID: 601448590} - - 114: {fileID: 601448589} - - 114: {fileID: 601448588} + - component: {fileID: 601448587} + - component: {fileID: 601448590} + - component: {fileID: 601448589} + - component: {fileID: 601448588} m_Layer: 5 m_Name: Raw Input m_TagString: Untagged @@ -1978,14 +2003,14 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1260024592} - {fileID: 595145115} - {fileID: 2001542684} - {fileID: 2073758707} m_Father: {fileID: 2098255038} - m_RootOrder: 8 + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -2047,12 +2072,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 606054179} - - 114: {fileID: 606054182} - - 222: {fileID: 606054181} - - 114: {fileID: 606054180} + - component: {fileID: 606054179} + - component: {fileID: 606054182} + - component: {fileID: 606054181} + - component: {fileID: 606054180} m_Layer: 5 m_Name: Viewport m_TagString: Untagged @@ -2069,11 +2094,11 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 2098255038} m_Father: {fileID: 1317055114} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 25, y: -43} @@ -2129,12 +2154,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 621592926} - - 222: {fileID: 621592929} - - 114: {fileID: 621592928} - - 114: {fileID: 621592927} + - component: {fileID: 621592926} + - component: {fileID: 621592929} + - component: {fileID: 621592928} + - component: {fileID: 621592927} m_Layer: 5 m_Name: Cube m_TagString: Untagged @@ -2151,14 +2176,14 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 507770921} - {fileID: 749901011} - {fileID: 842217637} - {fileID: 2088901649} m_Father: {fileID: 2098255038} - m_RootOrder: 5 + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -2220,10 +2245,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 666412329} - - 114: {fileID: 666412330} + - component: {fileID: 666412329} + - component: {fileID: 666412330} m_Layer: 5 m_Name: Buttons m_TagString: Untagged @@ -2240,13 +2265,13 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 96104532} - {fileID: 1412835668} - {fileID: 1778454010} m_Father: {fileID: 2032927211} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 0} m_AnchorMax: {x: 1, y: 0} m_AnchoredPosition: {x: -141, y: 35} @@ -2272,16 +2297,18 @@ MonoBehaviour: m_Spacing: 2 m_ChildForceExpandWidth: 1 m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 --- !u!1 &700544018 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 700544019} - - 222: {fileID: 700544021} - - 114: {fileID: 700544020} + - component: {fileID: 700544019} + - component: {fileID: 700544021} + - component: {fileID: 700544020} m_Layer: 5 m_Name: Ribbon m_TagString: Untagged @@ -2298,11 +2325,11 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1924054934} m_Father: {fileID: 1317055114} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.9607719} m_AnchorMax: {x: 0.5, y: 0.9607719} m_AnchoredPosition: {x: 0.000020981002, y: 7.3999023} @@ -2346,11 +2373,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 745674114} - - 222: {fileID: 745674116} - - 114: {fileID: 745674115} + - component: {fileID: 745674114} + - component: {fileID: 745674116} + - component: {fileID: 745674115} m_Layer: 5 m_Name: Description m_TagString: Untagged @@ -2367,10 +2394,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 574950114} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 15.699997, y: -4.8999996} @@ -2420,11 +2447,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 749901011} - - 222: {fileID: 749901013} - - 114: {fileID: 749901012} + - component: {fileID: 749901011} + - component: {fileID: 749901013} + - component: {fileID: 749901012} m_Layer: 5 m_Name: Description m_TagString: Untagged @@ -2441,10 +2468,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 621592926} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 15.699997, y: -4.8999996} @@ -2494,12 +2521,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 758236082} - - 222: {fileID: 758236085} - - 114: {fileID: 758236084} - - 114: {fileID: 758236083} + - component: {fileID: 758236082} + - component: {fileID: 758236085} + - component: {fileID: 758236084} + - component: {fileID: 758236083} m_Layer: 5 m_Name: Checkers m_TagString: Untagged @@ -2516,14 +2543,14 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1280257797} - {fileID: 16824282} - {fileID: 363049655} - {fileID: 1987127154} m_Father: {fileID: 2098255038} - m_RootOrder: 2 + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -2585,12 +2612,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 767854197} - - 222: {fileID: 767854200} - - 114: {fileID: 767854199} - - 114: {fileID: 767854198} + - component: {fileID: 767854197} + - component: {fileID: 767854200} + - component: {fileID: 767854199} + - component: {fileID: 767854198} m_Layer: 5 m_Name: Close m_TagString: Untagged @@ -2607,10 +2634,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 37557109} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: -31.199997, y: -39.700195} @@ -2706,12 +2733,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 801696179} - - 222: {fileID: 801696182} - - 114: {fileID: 801696181} - - 114: {fileID: 801696180} + - component: {fileID: 801696179} + - component: {fileID: 801696182} + - component: {fileID: 801696181} + - component: {fileID: 801696180} m_Layer: 5 m_Name: Title m_TagString: Untagged @@ -2728,10 +2755,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 2076713667} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 33.699997, y: 21.6} @@ -2790,17 +2817,106 @@ CanvasRenderer: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 801696178} +--- !u!1 &812982524 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 812982525} + - component: {fileID: 812982528} + - component: {fileID: 812982527} + - component: {fileID: 812982526} + m_Layer: 5 + m_Name: Title + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &812982525 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 812982524} + 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: 1920151151} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 33.699997, y: 21.6} + m_SizeDelta: {x: -94.8, y: -68.2} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &812982526 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 812982524} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -900027084, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.5} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 0 +--- !u!114 &812982527 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 812982524} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 12800000, guid: e423173afdece4d3fa49ed8e89391fce, type: 3} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 1 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: pull +--- !u!222 &812982528 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 812982524} --- !u!1 &842217636 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 842217637} - - 222: {fileID: 842217640} - - 114: {fileID: 842217639} - - 114: {fileID: 842217638} + - component: {fileID: 842217637} + - component: {fileID: 842217640} + - component: {fileID: 842217639} + - component: {fileID: 842217638} m_Layer: 5 m_Name: Button m_TagString: Untagged @@ -2817,10 +2933,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 621592926} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: 100, y: -4.9} @@ -2927,11 +3043,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 865431078} - - 222: {fileID: 865431080} - - 114: {fileID: 865431079} + - component: {fileID: 865431078} + - component: {fileID: 865431080} + - component: {fileID: 865431079} m_Layer: 5 m_Name: Image m_TagString: Untagged @@ -2948,10 +3064,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 574950114} m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: -86.3, y: 3.8} @@ -2995,12 +3111,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 870787322} - - 222: {fileID: 870787325} - - 114: {fileID: 870787324} - - 114: {fileID: 870787323} + - component: {fileID: 870787322} + - component: {fileID: 870787325} + - component: {fileID: 870787324} + - component: {fileID: 870787323} m_Layer: 5 m_Name: Camera m_TagString: Untagged @@ -3017,14 +3133,14 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 879805661} - {fileID: 1030186641} - {fileID: 201561627} - {fileID: 452970292} m_Father: {fileID: 2098255038} - m_RootOrder: 1 + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -3086,12 +3202,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 879805661} - - 222: {fileID: 879805664} - - 114: {fileID: 879805663} - - 114: {fileID: 879805662} + - component: {fileID: 879805661} + - component: {fileID: 879805664} + - component: {fileID: 879805663} + - component: {fileID: 879805662} m_Layer: 5 m_Name: Title m_TagString: Untagged @@ -3108,10 +3224,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 870787322} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 33.699997, y: 21.6} @@ -3175,12 +3291,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 962873577} - - 222: {fileID: 962873580} - - 114: {fileID: 962873579} - - 114: {fileID: 962873578} + - component: {fileID: 962873577} + - component: {fileID: 962873580} + - component: {fileID: 962873579} + - component: {fileID: 962873578} m_Layer: 5 m_Name: Button m_TagString: Untagged @@ -3197,10 +3313,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1004776690} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: 100, y: -4.9} @@ -3307,12 +3423,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1004776690} - - 222: {fileID: 1004776693} - - 114: {fileID: 1004776692} - - 114: {fileID: 1004776691} + - component: {fileID: 1004776690} + - component: {fileID: 1004776693} + - component: {fileID: 1004776692} + - component: {fileID: 1004776691} m_Layer: 5 m_Name: Multiuser m_TagString: Untagged @@ -3329,14 +3445,14 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 2008717908} - {fileID: 385551183} - {fileID: 962873577} - {fileID: 1608867050} m_Father: {fileID: 2098255038} - m_RootOrder: 4 + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -3398,11 +3514,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1030186641} - - 222: {fileID: 1030186643} - - 114: {fileID: 1030186642} + - component: {fileID: 1030186641} + - component: {fileID: 1030186643} + - component: {fileID: 1030186642} m_Layer: 5 m_Name: Description m_TagString: Untagged @@ -3419,10 +3535,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 870787322} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 15.699997, y: -4.8999996} @@ -3473,12 +3589,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1037999862} - - 222: {fileID: 1037999865} - - 114: {fileID: 1037999864} - - 114: {fileID: 1037999863} + - component: {fileID: 1037999862} + - component: {fileID: 1037999865} + - component: {fileID: 1037999864} + - component: {fileID: 1037999863} m_Layer: 5 m_Name: Colors m_TagString: Untagged @@ -3495,14 +3611,14 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 357107825} - {fileID: 15691938} - {fileID: 406504771} - {fileID: 299753859} m_Father: {fileID: 2098255038} - m_RootOrder: 7 + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -3564,11 +3680,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1168732683} - - 222: {fileID: 1168732685} - - 114: {fileID: 1168732684} + - component: {fileID: 1168732683} + - component: {fileID: 1168732685} + - component: {fileID: 1168732684} m_Layer: 5 m_Name: Description m_TagString: Untagged @@ -3585,10 +3701,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 2076713667} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 15.699997, y: -4.8999996} @@ -3638,12 +3754,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1173809306} - - 222: {fileID: 1173809309} - - 114: {fileID: 1173809308} - - 114: {fileID: 1173809307} + - component: {fileID: 1173809306} + - component: {fileID: 1173809309} + - component: {fileID: 1173809308} + - component: {fileID: 1173809307} m_Layer: 5 m_Name: Text m_TagString: Untagged @@ -3660,10 +3776,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1778454010} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: -1} @@ -3727,11 +3843,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1241691652} - - 222: {fileID: 1241691654} - - 114: {fileID: 1241691653} + - component: {fileID: 1241691652} + - component: {fileID: 1241691654} + - component: {fileID: 1241691653} m_Layer: 5 m_Name: Description m_TagString: Untagged @@ -3748,10 +3864,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 321008078} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 15.699997, y: -4.8999996} @@ -3801,12 +3917,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1260024592} - - 222: {fileID: 1260024595} - - 114: {fileID: 1260024594} - - 114: {fileID: 1260024593} + - component: {fileID: 1260024592} + - component: {fileID: 1260024595} + - component: {fileID: 1260024594} + - component: {fileID: 1260024593} m_Layer: 5 m_Name: Title m_TagString: Untagged @@ -3823,10 +3939,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 601448587} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 33.699997, y: 21.6} @@ -3890,12 +4006,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1280257797} - - 222: {fileID: 1280257800} - - 114: {fileID: 1280257799} - - 114: {fileID: 1280257798} + - component: {fileID: 1280257797} + - component: {fileID: 1280257800} + - component: {fileID: 1280257799} + - component: {fileID: 1280257798} m_Layer: 5 m_Name: Title m_TagString: Untagged @@ -3912,10 +4028,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 758236082} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 33.699997, y: 21.6} @@ -3979,12 +4095,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1317055114} - - 114: {fileID: 1317055117} - - 222: {fileID: 1317055116} - - 114: {fileID: 1317055115} + - component: {fileID: 1317055114} + - component: {fileID: 1317055117} + - component: {fileID: 1317055116} + - component: {fileID: 1317055115} m_Layer: 5 m_Name: Examples List m_TagString: Untagged @@ -4001,12 +4117,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 606054179} - {fileID: 700544019} m_Father: {fileID: 37557109} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: -0, y: -10} @@ -4081,12 +4197,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1361172027} - - 222: {fileID: 1361172030} - - 114: {fileID: 1361172029} - - 114: {fileID: 1361172028} + - component: {fileID: 1361172027} + - component: {fileID: 1361172030} + - component: {fileID: 1361172029} + - component: {fileID: 1361172028} m_Layer: 5 m_Name: Button m_TagString: Untagged @@ -4103,10 +4219,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 2076713667} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: 100, y: -4.9} @@ -4213,12 +4329,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1402896514} - - 223: {fileID: 1402896517} - - 114: {fileID: 1402896516} - - 114: {fileID: 1402896515} + - component: {fileID: 1402896514} + - component: {fileID: 1402896517} + - component: {fileID: 1402896516} + - component: {fileID: 1402896515} m_Layer: 5 m_Name: Canvas m_TagString: Untagged @@ -4235,11 +4351,11 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0, y: 0, z: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 309713871} m_Father: {fileID: 0} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -4284,7 +4400,7 @@ Canvas: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1402896513} m_Enabled: 0 - serializedVersion: 2 + serializedVersion: 3 m_RenderMode: 0 m_Camera: {fileID: 0} m_PlaneDistance: 100 @@ -4293,21 +4409,90 @@ Canvas: m_OverrideSorting: 0 m_OverridePixelPerfect: 0 m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 m_SortingLayerID: 0 m_SortingOrder: 0 m_TargetDisplay: 0 +--- !u!1 &1411566800 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1411566801} + - component: {fileID: 1411566803} + - component: {fileID: 1411566802} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1411566801 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1411566800} + 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: 1920151151} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -86.3, y: 3.8} + m_SizeDelta: {x: 46, y: 54} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1411566802 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1411566800} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 21300000, guid: ed91d97df020e4a8cb289e68e82485be, type: 3} + m_Type: 0 + m_PreserveAspect: 1 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &1411566803 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1411566800} --- !u!1 &1412835664 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1412835668} - - 222: {fileID: 1412835667} - - 114: {fileID: 1412835666} - - 114: {fileID: 1412835665} - - 114: {fileID: 1412835669} + - component: {fileID: 1412835668} + - component: {fileID: 1412835667} + - component: {fileID: 1412835666} + - component: {fileID: 1412835665} + - component: {fileID: 1412835669} m_Layer: 5 m_Name: List m_TagString: Untagged @@ -4409,11 +4594,11 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1487808224} m_Father: {fileID: 666412329} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -4442,12 +4627,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1449561975} - - 222: {fileID: 1449561978} - - 114: {fileID: 1449561977} - - 114: {fileID: 1449561976} + - component: {fileID: 1449561975} + - component: {fileID: 1449561978} + - component: {fileID: 1449561977} + - component: {fileID: 1449561976} m_Layer: 5 m_Name: Title m_TagString: Untagged @@ -4464,10 +4649,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 321008078} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 33.699997, y: 21.6} @@ -4531,12 +4716,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1487808224} - - 222: {fileID: 1487808226} - - 114: {fileID: 1487808225} - - 114: {fileID: 1487808227} + - component: {fileID: 1487808224} + - component: {fileID: 1487808226} + - component: {fileID: 1487808225} + - component: {fileID: 1487808227} m_Layer: 5 m_Name: Text m_TagString: Untagged @@ -4553,10 +4738,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1412835668} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 2} @@ -4615,36 +4800,242 @@ MonoBehaviour: m_EffectColor: {r: 0, g: 0, b: 0, a: 0.297} m_EffectDistance: {x: 1, y: -1} m_UseGraphicAlpha: 1 ---- !u!1 &1608867049 +--- !u!1 &1562323887 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1608867050} - - 222: {fileID: 1608867052} - - 114: {fileID: 1608867051} + - component: {fileID: 1562323888} + - component: {fileID: 1562323890} + - component: {fileID: 1562323889} m_Layer: 5 - m_Name: Image + m_Name: Description m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1608867050 +--- !u!224 &1562323888 RectTransform: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1608867049} + m_GameObject: {fileID: 1562323887} + 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: 1920151151} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 15.699997, y: -4.8999996} + m_SizeDelta: {x: -131.9, y: -51.2} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1562323889 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1562323887} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 1} + m_RaycastTarget: 0 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 8 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 8 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Shows how to write a custom gesture. +--- !u!222 &1562323890 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1562323887} +--- !u!1 &1567954097 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1567954098} + - component: {fileID: 1567954101} + - component: {fileID: 1567954100} + - component: {fileID: 1567954099} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1567954098 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1567954097} 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: 1920151151} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 100, y: -4.9} + m_SizeDelta: {x: 36.7, y: 36.6} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1567954099 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1567954097} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1392445389, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.75735295, g: 1, b: 0.769067, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1567954100} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1654745588} + m_MethodName: LoadLevel + m_Mode: 5 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: Pull + m_BoolArgument: 0 + m_CallState: 2 + - m_Target: {fileID: 37557110} + m_MethodName: ShowHide + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0, + Culture=neutral, PublicKeyToken=null +--- !u!114 &1567954100 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1567954097} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 21300000, guid: 5410db89f39a24e0fa785adf88e19b01, type: 3} + m_Type: 0 + m_PreserveAspect: 1 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &1567954101 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1567954097} +--- !u!1 &1608867049 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1608867050} + - component: {fileID: 1608867052} + - component: {fileID: 1608867051} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1608867050 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1608867049} + 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: 1004776690} m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: -86.3, y: 3.8} @@ -4688,11 +5079,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 1654745587} - - 114: {fileID: 1654745588} - - 114: {fileID: 1654745589} + - component: {fileID: 1654745587} + - component: {fileID: 1654745588} + - component: {fileID: 1654745589} m_Layer: 0 m_Name: Examples m_TagString: Untagged @@ -4709,12 +5100,12 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 174295523} - {fileID: 2032927211} m_Father: {fileID: 0} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &1654745588 MonoBehaviour: m_ObjectHideFlags: 0 @@ -4738,7 +5129,9 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Name: ScreenSpace UI Layer + basicEditor: 1 advancedProps: 0 + hitProps: 0 hit3DObjects: 0 hit2DObjects: 0 hitWorldSpaceUI: 0 @@ -4752,13 +5145,13 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1778454010} - - 222: {fileID: 1778454014} - - 114: {fileID: 1778454013} - - 114: {fileID: 1778454012} - - 114: {fileID: 1778454011} + - component: {fileID: 1778454010} + - component: {fileID: 1778454014} + - component: {fileID: 1778454013} + - component: {fileID: 1778454012} + - component: {fileID: 1778454011} m_Layer: 5 m_Name: Next m_TagString: Untagged @@ -4775,11 +5168,11 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1173809306} m_Father: {fileID: 666412329} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -4893,12 +5286,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1784197137} - - 222: {fileID: 1784197140} - - 114: {fileID: 1784197139} - - 114: {fileID: 1784197138} + - component: {fileID: 1784197137} + - component: {fileID: 1784197140} + - component: {fileID: 1784197139} + - component: {fileID: 1784197138} m_Layer: 5 m_Name: Text m_TagString: Untagged @@ -4915,10 +5308,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 96104532} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: -2} @@ -4982,12 +5375,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1800191864} - - 222: {fileID: 1800191867} - - 114: {fileID: 1800191866} - - 114: {fileID: 1800191865} + - component: {fileID: 1800191864} + - component: {fileID: 1800191867} + - component: {fileID: 1800191866} + - component: {fileID: 1800191865} m_Layer: 5 m_Name: Title m_TagString: Untagged @@ -5004,10 +5397,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 574950114} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 33.699997, y: 21.6} @@ -5071,12 +5464,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1894139120} - - 222: {fileID: 1894139123} - - 114: {fileID: 1894139122} - - 114: {fileID: 1894139121} + - component: {fileID: 1894139120} + - component: {fileID: 1894139123} + - component: {fileID: 1894139122} + - component: {fileID: 1894139121} m_Layer: 5 m_Name: Button m_TagString: Untagged @@ -5093,10 +5486,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 321008078} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: 100, y: -4.9} @@ -5198,17 +5591,108 @@ CanvasRenderer: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1894139119} +--- !u!1 &1920151150 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1920151151} + - component: {fileID: 1920151154} + - component: {fileID: 1920151153} + - component: {fileID: 1920151152} + m_Layer: 5 + m_Name: Pull + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1920151151 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1920151150} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.99999774, y: 0.99999774, z: 0.99999774} + m_Children: + - {fileID: 812982525} + - {fileID: 1562323888} + - {fileID: 1567954098} + - {fileID: 1411566801} + m_Father: {fileID: 2098255038} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1920151152 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1920151150} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1679637790, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: 80 + m_PreferredWidth: -1 + m_PreferredHeight: 80 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 +--- !u!114 &1920151153 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1920151150} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 21300000, guid: b8fce26041bc947319fee43a8ec9bb5d, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &1920151154 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1920151150} --- !u!1 &1924054933 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1924054934} - - 222: {fileID: 1924054937} - - 114: {fileID: 1924054936} - - 114: {fileID: 1924054935} + - component: {fileID: 1924054934} + - component: {fileID: 1924054937} + - component: {fileID: 1924054936} + - component: {fileID: 1924054935} m_Layer: 5 m_Name: Examples m_TagString: Untagged @@ -5225,10 +5709,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 700544019} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: -0.000024319, y: 7.9} @@ -5292,11 +5776,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 1987127154} - - 222: {fileID: 1987127156} - - 114: {fileID: 1987127155} + - component: {fileID: 1987127154} + - component: {fileID: 1987127156} + - component: {fileID: 1987127155} m_Layer: 5 m_Name: Image m_TagString: Untagged @@ -5313,10 +5797,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 758236082} m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: -86.3, y: 3.8} @@ -5360,12 +5844,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 2001542684} - - 222: {fileID: 2001542687} - - 114: {fileID: 2001542686} - - 114: {fileID: 2001542685} + - component: {fileID: 2001542684} + - component: {fileID: 2001542687} + - component: {fileID: 2001542686} + - component: {fileID: 2001542685} m_Layer: 5 m_Name: Button m_TagString: Untagged @@ -5382,10 +5866,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 601448587} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: 100, y: -4.9} @@ -5492,12 +5976,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 2008717908} - - 222: {fileID: 2008717911} - - 114: {fileID: 2008717910} - - 114: {fileID: 2008717909} + - component: {fileID: 2008717908} + - component: {fileID: 2008717911} + - component: {fileID: 2008717910} + - component: {fileID: 2008717909} m_Layer: 5 m_Name: Title m_TagString: Untagged @@ -5514,10 +5998,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1004776690} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 33.699997, y: 21.6} @@ -5581,12 +6065,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 2032927211} - - 223: {fileID: 2032927214} - - 114: {fileID: 2032927213} - - 114: {fileID: 2032927212} + - component: {fileID: 2032927211} + - component: {fileID: 2032927214} + - component: {fileID: 2032927213} + - component: {fileID: 2032927212} m_Layer: 5 m_Name: Canvas m_TagString: Untagged @@ -5603,12 +6087,12 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0, y: 0, z: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 666412329} - {fileID: 37557109} m_Father: {fileID: 1654745587} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -5658,7 +6142,7 @@ Canvas: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 2032927210} m_Enabled: 1 - serializedVersion: 2 + serializedVersion: 3 m_RenderMode: 0 m_Camera: {fileID: 0} m_PlaneDistance: 100 @@ -5667,6 +6151,7 @@ Canvas: m_OverrideSorting: 0 m_OverridePixelPerfect: 0 m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 m_SortingLayerID: 0 m_SortingOrder: 0 m_TargetDisplay: 0 @@ -5675,11 +6160,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 2073758707} - - 222: {fileID: 2073758709} - - 114: {fileID: 2073758708} + - component: {fileID: 2073758707} + - component: {fileID: 2073758709} + - component: {fileID: 2073758708} m_Layer: 5 m_Name: Image m_TagString: Untagged @@ -5696,10 +6181,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 601448587} m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: -86.3, y: 3.8} @@ -5743,12 +6228,12 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 2076713667} - - 222: {fileID: 2076713670} - - 114: {fileID: 2076713669} - - 114: {fileID: 2076713668} + - component: {fileID: 2076713667} + - component: {fileID: 2076713670} + - component: {fileID: 2076713669} + - component: {fileID: 2076713668} m_Layer: 5 m_Name: Photos m_TagString: Untagged @@ -5765,7 +6250,6 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 801696179} - {fileID: 1168732683} @@ -5773,6 +6257,7 @@ RectTransform: - {fileID: 558528359} m_Father: {fileID: 2098255038} m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -5834,11 +6319,11 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 2088901649} - - 222: {fileID: 2088901651} - - 114: {fileID: 2088901650} + - component: {fileID: 2088901649} + - component: {fileID: 2088901651} + - component: {fileID: 2088901650} m_Layer: 5 m_Name: Image m_TagString: Untagged @@ -5855,10 +6340,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 621592926} m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: -86.3, y: 3.8} @@ -5902,10 +6387,10 @@ GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 224: {fileID: 2098255038} - - 114: {fileID: 2098255039} + - component: {fileID: 2098255038} + - component: {fileID: 2098255039} m_Layer: 5 m_Name: Content m_TagString: Untagged @@ -5922,23 +6407,24 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: + - {fileID: 601448587} - {fileID: 574950114} - {fileID: 870787322} - - {fileID: 758236082} - {fileID: 2076713667} - - {fileID: 1004776690} - - {fileID: 621592926} + - {fileID: 758236082} - {fileID: 321008078} - {fileID: 1037999862} - - {fileID: 601448587} + - {fileID: 621592926} + - {fileID: 1004776690} + - {fileID: 1920151151} m_Father: {fileID: 606054179} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 734} + m_SizeDelta: {x: 0, y: 815} m_Pivot: {x: 0, y: 1} --- !u!114 &2098255039 MonoBehaviour: @@ -5960,3 +6446,5 @@ MonoBehaviour: m_Spacing: 2 m_ChildForceExpandWidth: 1 m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 diff --git a/Source/Assets/TouchScript/Examples/Multiuser/Multiuser.unity.meta b/Source/Assets/TouchScript/Examples/Multiuser/Multiuser.unity.meta index 77bd0faba..ec0b25d69 100644 --- a/Source/Assets/TouchScript/Examples/Multiuser/Multiuser.unity.meta +++ b/Source/Assets/TouchScript/Examples/Multiuser/Multiuser.unity.meta @@ -1,4 +1,4 @@ fileFormatVersion: 2 guid: 3b34d0a4b336446dd98f5f9951fe6480 DefaultImporter: - userData: + userData: "9" diff --git a/Source/Assets/TouchScript/Examples/Photos/Photos.unity.meta b/Source/Assets/TouchScript/Examples/Photos/Photos.unity.meta index 161e2ebac..6499da86b 100644 --- a/Source/Assets/TouchScript/Examples/Photos/Photos.unity.meta +++ b/Source/Assets/TouchScript/Examples/Photos/Photos.unity.meta @@ -1,4 +1,4 @@ fileFormatVersion: 2 guid: e43bdd4f3bf144b74b4726208781dd66 DefaultImporter: - userData: "3" + userData: "4" diff --git a/Source/Assets/TouchScript/Examples/Portal/Portal.unity.meta b/Source/Assets/TouchScript/Examples/Portal/Portal.unity.meta index 2bb2a8c8b..bc963d131 100644 --- a/Source/Assets/TouchScript/Examples/Portal/Portal.unity.meta +++ b/Source/Assets/TouchScript/Examples/Portal/Portal.unity.meta @@ -1,4 +1,4 @@ fileFormatVersion: 2 guid: 20ddca9320eeb4eb28b7ce5fcb289923 DefaultImporter: - userData: + userData: "6" diff --git a/Source/Assets/TouchScript/Examples/Pull.meta b/Source/Assets/TouchScript/Examples/Pull.meta new file mode 100644 index 000000000..00e830361 --- /dev/null +++ b/Source/Assets/TouchScript/Examples/Pull.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 1a092b00a4e374c60a1f1b5af1727a4c +folderAsset: yes +timeCreated: 1501590523 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/Pull/Materials.meta b/Source/Assets/TouchScript/Examples/Pull/Materials.meta new file mode 100644 index 000000000..41948a301 --- /dev/null +++ b/Source/Assets/TouchScript/Examples/Pull/Materials.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 0d02fe6a7404f4fa8b9b5214e052cd7d +folderAsset: yes +timeCreated: 1501599114 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/Pull/Materials/Green.mat b/Source/Assets/TouchScript/Examples/Pull/Materials/Green.mat new file mode 100644 index 000000000..a11dc3831 --- /dev/null +++ b/Source/Assets/TouchScript/Examples/Pull/Materials/Green.mat @@ -0,0 +1,76 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: Green + m_Shader: {fileID: 10755, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0, g: 1, b: 0.048275948, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Source/Assets/TouchScript/Examples/Pull/Materials/Green.mat.meta b/Source/Assets/TouchScript/Examples/Pull/Materials/Green.mat.meta new file mode 100644 index 000000000..4ff475c12 --- /dev/null +++ b/Source/Assets/TouchScript/Examples/Pull/Materials/Green.mat.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6a7cc3aeb872a43c9b48602411ff0128 +timeCreated: 1501599163 +licenseType: Pro +NativeFormatImporter: + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/Pull/Prefabs.meta b/Source/Assets/TouchScript/Examples/Pull/Prefabs.meta new file mode 100644 index 000000000..26c7eed13 --- /dev/null +++ b/Source/Assets/TouchScript/Examples/Pull/Prefabs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e930c60b631064c8282b18e4fd304215 +folderAsset: yes +timeCreated: 1501590612 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/Pull/Prefabs/Cube.prefab b/Source/Assets/TouchScript/Examples/Pull/Prefabs/Cube.prefab new file mode 100644 index 000000000..6d1afd749 --- /dev/null +++ b/Source/Assets/TouchScript/Examples/Pull/Prefabs/Cube.prefab @@ -0,0 +1,276 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1001 &100100000 +Prefab: + m_ObjectHideFlags: 1 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: [] + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 0} + m_RootGameObject: {fileID: 1583770791137080} + m_IsPrefabParent: 1 +--- !u!1 &1187127904395504 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4273383945290788} + - component: {fileID: 120722583279136224} + m_Layer: 0 + m_Name: Line + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1583770791137080 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4092497047216208} + - component: {fileID: 33076793992048592} + - component: {fileID: 65806177754892914} + - component: {fileID: 23586366584321034} + - component: {fileID: 54930536093548728} + - component: {fileID: 114518461671103506} + - component: {fileID: 114334082651901656} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4092497047216208 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1583770791137080} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.02, y: 0.69, z: -2.33} + m_LocalScale: {x: 1.5896826, y: 1.589683, z: 1.589683} + m_Children: + - {fileID: 4273383945290788} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &4273383945290788 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1187127904395504} + 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: 4092497047216208} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &23586366584321034 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1583770791137080} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 69c151168e0de486b9df0688ff9e4891, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &33076793992048592 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1583770791137080} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!54 &54930536093548728 +Rigidbody: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1583770791137080} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!65 &65806177754892914 +BoxCollider: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1583770791137080} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!114 &114334082651901656 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1583770791137080} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 057fc4dd3742040c9b65eac0a4e3cac7, type: 3} + m_Name: + m_EditorClassIdentifier: + ForceMultiplier: 100 + Line: {fileID: 120722583279136224} +--- !u!114 &114518461671103506 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1583770791137080} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 767c446d703184f6faf8a12a85d591eb, type: 3} + m_Name: + m_EditorClassIdentifier: + OnStateChange: + m_PersistentCalls: + m_Calls: [] + m_TypeName: TouchScript.Gestures.Gesture+GestureEvent, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + basicEditor: 0 + generalProps: 0 + limitsProps: 0 + advancedProps: 0 + minPointers: 0 + maxPointers: 0 + useSendMessage: 0 + sendStateChangeMessages: 0 + sendMessageTarget: {fileID: 0} + useUnityEvents: 0 + sendStateChangeEvents: 0 + requireGestureToFail: {fileID: 0} + friendlyGestures: [] +--- !u!120 &120722583279136224 +LineRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1187127904395504} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_MotionVectors: 0 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 6a7cc3aeb872a43c9b48602411ff0128, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Positions: + - {x: 0, y: 0, z: 0} + - {x: 0, y: 0, z: 10} + m_Parameters: + serializedVersion: 2 + widthMultiplier: 1 + widthCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 2 + time: 0 + value: 0.2 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + - serializedVersion: 2 + time: 1 + value: 0.2 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + colorGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + numCornerVertices: 0 + numCapVertices: 0 + alignment: 0 + textureMode: 0 + m_UseWorldSpace: 1 + m_Loop: 0 diff --git a/Source/Assets/TouchScript/Examples/Pull/Prefabs/Cube.prefab.meta b/Source/Assets/TouchScript/Examples/Pull/Prefabs/Cube.prefab.meta new file mode 100644 index 000000000..eb5fb7666 --- /dev/null +++ b/Source/Assets/TouchScript/Examples/Pull/Prefabs/Cube.prefab.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 21a4063eaa6b1410f8b9be15c9d964df +timeCreated: 1501590642 +licenseType: Pro +NativeFormatImporter: + mainObjectFileID: 100100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/Pull/Pull.unity b/Source/Assets/TouchScript/Examples/Pull/Pull.unity new file mode 100644 index 000000000..6ed0b637b --- /dev/null +++ b/Source/Assets/TouchScript/Examples/Pull/Pull.unity @@ -0,0 +1,1990 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 8 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_AmbientEquatorColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_AmbientGroundColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 2100000, guid: a07fadb24ea940240afba3afc1a692cc, type: 2} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} +--- !u!157 &4 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_TemporalCoherenceThreshold: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 8 + m_Resolution: 1 + m_BakeResolution: 50 + m_TextureWidth: 1024 + m_TextureHeight: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 0 + m_CompAOExponentDirect: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 0 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 1024 + m_ReflectionCompression: 2 + m_MixedBakeMode: 1 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVRFiltering: 0 + m_PVRFilteringMode: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousColorSigma: 1 + m_PVRFilteringAtrousNormalSigma: 1 + m_PVRFilteringAtrousPositionSigma: 1 + m_LightingDataAsset: {fileID: 0} + m_ShadowMaskMode: 2 +--- !u!196 &5 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666666 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &43919907 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1583770791137080, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 43919908} + - component: {fileID: 43919912} + - component: {fileID: 43919911} + - component: {fileID: 43919910} + - component: {fileID: 43919909} + m_Layer: 0 + m_Name: Static Cube (5) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &43919908 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 4092497047216208, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 43919907} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -6.04, y: 0.69, z: 0.21} + m_LocalScale: {x: 1.58968, y: 1.58968, z: 1.58968} + m_Children: [] + m_Father: {fileID: 312263520} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!54 &43919909 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 54930536093548728, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 43919907} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!23 &43919910 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 23586366584321034, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 43919907} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 69c151168e0de486b9df0688ff9e4891, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &43919911 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 65806177754892914, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 43919907} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &43919912 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 33076793992048592, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 43919907} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &62216951 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 62216952} + - component: {fileID: 62216957} + - component: {fileID: 62216956} + - component: {fileID: 62216955} + - component: {fileID: 62216954} + - component: {fileID: 62216953} + m_Layer: 0 + m_Name: Scene Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &62216952 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 62216951} + m_LocalRotation: {x: 0.26945794, y: 0, z: 0, w: 0.96301216} + m_LocalPosition: {x: -1.11, y: 10.1, z: -17.45} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 930800601} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 31.264, y: 0, z: 0} +--- !u!114 &62216953 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 62216951} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7e5768c36d1bb4acea50bd233372843a, type: 3} + m_Name: + m_EditorClassIdentifier: + Name: Scene Camera + basicEditor: 1 + advancedProps: 0 + hitProps: 0 + hit3DObjects: 1 + hit2DObjects: 0 + hitWorldSpaceUI: 0 + hitScreenSpaceUI: 0 + layerMask: + serializedVersion: 2 + m_Bits: 4294967295 + useHitFilters: 0 +--- !u!81 &62216954 +AudioListener: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 62216951} + m_Enabled: 1 +--- !u!124 &62216955 +Behaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 62216951} + m_Enabled: 1 +--- !u!92 &62216956 +Behaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 62216951} + m_Enabled: 1 +--- !u!20 &62216957 +Camera: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 62216951} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0, g: 0, b: 0, a: 1} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 40 + field of view: 30 + orthographic: 0 + orthographic size: 100 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 0 + m_AllowMSAA: 1 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 + m_StereoMirrorMode: 0 +--- !u!1 &250857269 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 250857271} + - component: {fileID: 250857270} + m_Layer: 5 + m_Name: List + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &250857270 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 250857269} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1297475563, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 +--- !u!224 &250857271 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 250857269} + 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: 922779737} + - {fileID: 1679844150} + m_Father: {fileID: 1981142013} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &312263519 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 312263520} + m_Layer: 0 + m_Name: Container + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &312263520 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 312263519} + 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: 497908867} + - {fileID: 1348713904} + - {fileID: 1523632846} + - {fileID: 703341282} + - {fileID: 2086987748} + - {fileID: 525512062} + - {fileID: 43919908} + m_Father: {fileID: 930800601} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &497908867 stripped +Transform: + m_PrefabParentObject: {fileID: 4092497047216208, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 1411228864} +--- !u!1 &525512061 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1583770791137080, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 525512062} + - component: {fileID: 525512066} + - component: {fileID: 525512065} + - component: {fileID: 525512064} + - component: {fileID: 525512063} + m_Layer: 0 + m_Name: Static Cube (4) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &525512062 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 4092497047216208, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 525512061} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -4.27, y: 0.69, z: 2.94} + m_LocalScale: {x: 1.58968, y: 1.58968, z: 1.58968} + m_Children: [] + m_Father: {fileID: 312263520} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!54 &525512063 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 54930536093548728, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 525512061} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!23 &525512064 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 23586366584321034, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 525512061} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 69c151168e0de486b9df0688ff9e4891, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &525512065 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 65806177754892914, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 525512061} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &525512066 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 33076793992048592, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 525512061} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1001 &543251036 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} + propertyPath: layers.Array.size + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} + propertyPath: layers.Array.data[0] + value: + objectReference: {fileID: 62216953} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &584553677 stripped +Transform: + m_PrefabParentObject: {fileID: 400004, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} + m_PrefabInternal: {fileID: 599866430} +--- !u!1001 &599866430 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 930800601} + m_Modifications: + - target: {fileID: 400004, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} + propertyPath: m_LocalPosition.x + value: -0.04 + objectReference: {fileID: 0} + - target: {fileID: 400004, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} + propertyPath: m_LocalPosition.y + value: -12.97 + objectReference: {fileID: 0} + - target: {fileID: 400004, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} + propertyPath: m_LocalPosition.z + value: 0.26 + objectReference: {fileID: 0} + - target: {fileID: 400004, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400004, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} + propertyPath: m_LocalRotation.y + value: 0.36056674 + objectReference: {fileID: 0} + - target: {fileID: 400004, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400004, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} + propertyPath: m_LocalRotation.w + value: 0.9327335 + objectReference: {fileID: 0} + - target: {fileID: 400004, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} + propertyPath: m_RootOrder + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 400004, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} + propertyPath: m_LocalScale.x + value: 17 + objectReference: {fileID: 0} + - target: {fileID: 400004, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} + propertyPath: m_LocalScale.y + value: 17 + objectReference: {fileID: 0} + - target: {fileID: 400004, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} + propertyPath: m_LocalScale.z + value: 17 + objectReference: {fileID: 0} + - target: {fileID: 100004, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + m_RemovedComponents: + - {fileID: 9500000, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} + m_ParentPrefab: {fileID: 100100000, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} + m_IsPrefabParent: 0 +--- !u!1 &703341281 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1583770791137080, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 703341282} + - component: {fileID: 703341286} + - component: {fileID: 703341285} + - component: {fileID: 703341284} + - component: {fileID: 703341283} + m_Layer: 0 + m_Name: Static Cube (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &703341282 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 4092497047216208, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 703341281} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1.55, y: 0.69, z: 5.28} + m_LocalScale: {x: 1.58968, y: 1.58968, z: 1.58968} + m_Children: [] + m_Father: {fileID: 312263520} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!54 &703341283 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 54930536093548728, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 703341281} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!23 &703341284 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 23586366584321034, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 703341281} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 69c151168e0de486b9df0688ff9e4891, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &703341285 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 65806177754892914, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 703341281} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &703341286 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 33076793992048592, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 703341281} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &721853795 stripped +GameObject: + m_PrefabParentObject: {fileID: 100006, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} + m_PrefabInternal: {fileID: 599866430} +--- !u!64 &721853799 +MeshCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 721853795} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Convex: 1 + m_InflateMesh: 0 + m_SkinWidth: 0.01 + m_Mesh: {fileID: 4300006, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} +--- !u!1 &740851131 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 740851132} + - component: {fileID: 740851135} + - component: {fileID: 740851134} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &740851132 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 740851131} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 1981142013} + - {fileID: 1552723601} + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!114 &740851134 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 740851131} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1980459831, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 640, y: 480} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 1 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 +--- !u!223 &740851135 +Canvas: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 740851131} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!1 &922779735 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 922779737} + - component: {fileID: 922779736} + m_Layer: 5 + m_Name: Drag + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &922779736 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 922779735} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1679637790, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: 60 + m_PreferredWidth: -1 + m_PreferredHeight: 60 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 +--- !u!224 &922779737 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 922779735} + 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: 1149683276} + - {fileID: 1166494019} + m_Father: {fileID: 250857271} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &930800600 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 930800601} + m_Layer: 0 + m_Name: Scene + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &930800601 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 930800600} + 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: 2135305920} + - {fileID: 62216952} + - {fileID: 584553677} + - {fileID: 312263520} + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1138005899 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1138005900} + - component: {fileID: 1138005902} + - component: {fileID: 1138005901} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1138005900 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1138005899} + 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: 1679844150} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 31, y: 0} + m_SizeDelta: {x: 60, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1138005901 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1138005899} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 21300000, guid: 26489b03725f747f998c39661c2583b5, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &1138005902 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1138005899} +--- !u!1 &1149683275 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1149683276} + - component: {fileID: 1149683278} + - component: {fileID: 1149683277} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1149683276 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1149683275} + 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: 922779737} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 31, y: 0} + m_SizeDelta: {x: 60, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1149683277 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1149683275} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 21300000, guid: dcd0c08ae57e04a64bd2388ac4057dc6, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &1149683278 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1149683275} +--- !u!1 &1166494018 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1166494019} + - component: {fileID: 1166494022} + - component: {fileID: 1166494021} + - component: {fileID: 1166494020} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1166494019 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1166494018} + 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: 922779737} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 177.5, y: 0} + m_SizeDelta: {x: 204.7, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1166494020 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1166494018} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1573420865, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0, g: 0, b: 0, a: 1} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 1 +--- !u!114 &1166494021 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1166494018} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: "Press and drag \nthe central cube" +--- !u!222 &1166494022 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1166494018} +--- !u!1 &1271849413 stripped +GameObject: + m_PrefabParentObject: {fileID: 100008, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} + m_PrefabInternal: {fileID: 599866430} +--- !u!64 &1271849417 +MeshCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1271849413} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Convex: 1 + m_InflateMesh: 0 + m_SkinWidth: 0.01 + m_Mesh: {fileID: 4300004, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} +--- !u!1 &1348713903 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1583770791137080, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1348713904} + - component: {fileID: 1348713908} + - component: {fileID: 1348713907} + - component: {fileID: 1348713906} + - component: {fileID: 1348713905} + m_Layer: 0 + m_Name: Static Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1348713904 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 4092497047216208, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1348713903} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 5.97, y: 0.69, z: 0.26} + m_LocalScale: {x: 1.58968, y: 1.58968, z: 1.58968} + m_Children: [] + m_Father: {fileID: 312263520} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!54 &1348713905 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 54930536093548728, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1348713903} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!23 &1348713906 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 23586366584321034, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1348713903} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 69c151168e0de486b9df0688ff9e4891, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1348713907 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 65806177754892914, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1348713903} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1348713908 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 33076793992048592, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1348713903} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1408280580 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1408280581} + - component: {fileID: 1408280583} + - component: {fileID: 1408280582} + - component: {fileID: 1408280584} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1408280581 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1408280580} + 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: 1679844150} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 177.5, y: 0} + m_SizeDelta: {x: 204.7, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1408280582 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1408280580} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: "Release the touch \nto apply the force" +--- !u!222 &1408280583 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1408280580} +--- !u!114 &1408280584 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1408280580} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1573420865, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0, g: 0, b: 0, a: 1} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 1 +--- !u!1001 &1411228864 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 312263520} + m_Modifications: + - target: {fileID: 4092497047216208, guid: 21a4063eaa6b1410f8b9be15c9d964df, type: 2} + propertyPath: m_LocalPosition.x + value: 0.02 + objectReference: {fileID: 0} + - target: {fileID: 4092497047216208, guid: 21a4063eaa6b1410f8b9be15c9d964df, type: 2} + propertyPath: m_LocalPosition.y + value: 0.69 + objectReference: {fileID: 0} + - target: {fileID: 4092497047216208, guid: 21a4063eaa6b1410f8b9be15c9d964df, type: 2} + propertyPath: m_LocalPosition.z + value: -2.33 + objectReference: {fileID: 0} + - target: {fileID: 4092497047216208, guid: 21a4063eaa6b1410f8b9be15c9d964df, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4092497047216208, guid: 21a4063eaa6b1410f8b9be15c9d964df, type: 2} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4092497047216208, guid: 21a4063eaa6b1410f8b9be15c9d964df, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4092497047216208, guid: 21a4063eaa6b1410f8b9be15c9d964df, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4092497047216208, guid: 21a4063eaa6b1410f8b9be15c9d964df, type: 2} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 21a4063eaa6b1410f8b9be15c9d964df, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &1523632845 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1583770791137080, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1523632846} + - component: {fileID: 1523632850} + - component: {fileID: 1523632849} + - component: {fileID: 1523632848} + - component: {fileID: 1523632847} + m_Layer: 0 + m_Name: Static Cube (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1523632846 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 4092497047216208, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1523632845} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 4.45, y: 0.69, z: 3.53} + m_LocalScale: {x: 1.58968, y: 1.58968, z: 1.58968} + m_Children: [] + m_Father: {fileID: 312263520} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!54 &1523632847 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 54930536093548728, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1523632845} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!23 &1523632848 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 23586366584321034, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1523632845} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 69c151168e0de486b9df0688ff9e4891, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1523632849 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 65806177754892914, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1523632845} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1523632850 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 33076793992048592, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1523632845} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1552723600 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1552723601} + - component: {fileID: 1552723603} + - component: {fileID: 1552723602} + - component: {fileID: 1552723604} + m_Layer: 5 + m_Name: Description + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1552723601 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1552723600} + 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: 740851132} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 178, y: 58} + m_SizeDelta: {x: 320, y: 88} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1552723602 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1552723600} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: "Pull\n\x03\nThis example shows how to write a custom gesture.\nPullGesture + on the central cube is written specially for this scene." +--- !u!222 &1552723603 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1552723600} +--- !u!114 &1552723604 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1552723600} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1573420865, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0, g: 0, b: 0, a: 1} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 1 +--- !u!1 &1679844149 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1679844150} + - component: {fileID: 1679844151} + m_Layer: 5 + m_Name: Tap + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1679844150 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1679844149} + 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: 1138005900} + - {fileID: 1408280581} + m_Father: {fileID: 250857271} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1679844151 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1679844149} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1679637790, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: 60 + m_PreferredWidth: -1 + m_PreferredHeight: 60 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 +--- !u!1 &1764701046 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1764701050} + - component: {fileID: 1764701049} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1764701049 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1764701046} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -619905303, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 5 +--- !u!4 &1764701050 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1764701046} + 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: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &1772227325 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_Pivot.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 11400000, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: useDPI + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 100000, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &1981142012 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1981142013} + m_Layer: 5 + m_Name: Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1981142013 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1981142012} + 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: 250857271} + m_Father: {fileID: 740851132} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0.25263783, y: 1} + m_AnchoredPosition: {x: 5, y: 50} + m_SizeDelta: {x: -10, y: -120} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &2086987747 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 1583770791137080, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2086987748} + - component: {fileID: 2086987752} + - component: {fileID: 2086987751} + - component: {fileID: 2086987750} + - component: {fileID: 2086987749} + m_Layer: 0 + m_Name: Static Cube (3) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2086987748 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 4092497047216208, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2086987747} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1.71, y: 0.69, z: 5.16} + m_LocalScale: {x: 1.58968, y: 1.58968, z: 1.58968} + m_Children: [] + m_Father: {fileID: 312263520} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!54 &2086987749 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 54930536093548728, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2086987747} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!23 &2086987750 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 23586366584321034, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2086987747} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 69c151168e0de486b9df0688ff9e4891, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &2086987751 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 65806177754892914, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2086987747} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &2086987752 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 33076793992048592, guid: 21a4063eaa6b1410f8b9be15c9d964df, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2086987747} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2135305919 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2135305920} + - component: {fileID: 2135305921} + m_Layer: 0 + m_Name: Directional light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2135305920 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2135305919} + m_LocalRotation: {x: 0.24194291, y: -0.49854365, z: 0.22107579, w: 0.80252314} + m_LocalPosition: {x: 6.1004148, y: 15.540384, z: -20.566225} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 930800601} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 37.5, y: -60.899998, z: 8.2324} +--- !u!108 &2135305921 +Light: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2135305919} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 1 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Intensity: 1.3 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: 3 + m_CustomResolution: -1 + m_Strength: 0.56 + m_Bias: 0.1 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 1 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 diff --git a/Source/Assets/TouchScript/Examples/Pull/Pull.unity.meta b/Source/Assets/TouchScript/Examples/Pull/Pull.unity.meta new file mode 100644 index 000000000..208dcabb4 --- /dev/null +++ b/Source/Assets/TouchScript/Examples/Pull/Pull.unity.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6696ec8da4feb4725bf860ab58fa830f +timeCreated: 1501590562 +licenseType: Pro +DefaultImporter: + userData: "10" + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/Pull/Scripts.meta b/Source/Assets/TouchScript/Examples/Pull/Scripts.meta new file mode 100644 index 000000000..d9a665ab9 --- /dev/null +++ b/Source/Assets/TouchScript/Examples/Pull/Scripts.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: d450e111ead04433cb8527f73c6a561a +folderAsset: yes +timeCreated: 1501591264 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/Pull/Scripts/Logic.cs b/Source/Assets/TouchScript/Examples/Pull/Scripts/Logic.cs new file mode 100644 index 000000000..f8fd68e26 --- /dev/null +++ b/Source/Assets/TouchScript/Examples/Pull/Scripts/Logic.cs @@ -0,0 +1,102 @@ +using UnityEngine; + +namespace TouchScript.Tutorial +{ + public class Logic : MonoBehaviour + { + + // Force multiplier + public float ForceMultiplier = 100f; + public LineRenderer Line; + + private PullGesture gesture; + private Rigidbody body; + + private Vector3 forceToApply; + private bool shouldApplyForce = false; + + private void OnEnable() + { + body = GetComponent(); + gesture = GetComponent(); + + Line.enabled = false; + + gesture.Pressed += pressedHandler; + gesture.Pulled += pulledHandler; + gesture.Released += releasedHandler; + gesture.Cancelled += cancelledHandler; + + releaseObject(); + } + + private void OnDisable() + { + gesture.Pressed -= pressedHandler; + gesture.Pulled -= pulledHandler; + gesture.Released -= releasedHandler; + gesture.Cancelled -= cancelledHandler; + } + + private void FixedUpdate() + { + // Apply force in FixedUpdate to make physics happy + if (shouldApplyForce) + { + body.AddForce(forceToApply); + shouldApplyForce = false; + } + } + + // Switch to manual mode + private void takeObject() + { + body.isKinematic = true; + Line.enabled = true; + updateLine(); + } + + // Switch to automatic mode + private void releaseObject() + { + body.isKinematic = false; + Line.enabled = false; + } + + // Push the object when the gesture is ended + private void pushObject() + { + forceToApply = ForceMultiplier * gesture.Force; + shouldApplyForce = true; + } + + // Update the line + private void updateLine() + { + Line.SetPosition(0, gesture.StartPosition); + Line.SetPosition(1, gesture.Position); + } + + private void pressedHandler(object sender, System.EventArgs e) + { + takeObject(); + } + + private void pulledHandler(object sender, System.EventArgs e) + { + updateLine(); + } + + private void releasedHandler(object sender, System.EventArgs e) + { + releaseObject(); + pushObject(); + } + + private void cancelledHandler(object sender, System.EventArgs e) + { + releaseObject(); + } + + } +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Examples/Pull/Scripts/Logic.cs.meta b/Source/Assets/TouchScript/Examples/Pull/Scripts/Logic.cs.meta new file mode 100644 index 000000000..0e939ac08 --- /dev/null +++ b/Source/Assets/TouchScript/Examples/Pull/Scripts/Logic.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 057fc4dd3742040c9b65eac0a4e3cac7 +timeCreated: 1501597106 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/Pull/Scripts/PullGesture.cs b/Source/Assets/TouchScript/Examples/Pull/Scripts/PullGesture.cs new file mode 100644 index 000000000..2bbb2243b --- /dev/null +++ b/Source/Assets/TouchScript/Examples/Pull/Scripts/PullGesture.cs @@ -0,0 +1,172 @@ +using System.Collections.Generic; +using UnityEngine; +// Must import this to use Gesture type +using TouchScript.Gestures; +using TouchScript.Pointers; +using System; +using TouchScript.Layers; + +// Let's put our gesture into a namespace so it wouldn't clash with other classes in our project +namespace TouchScript.Tutorial +{ + // The class must inherit from Gesture + public class PullGesture : Gesture + { + + public event EventHandler Pressed + { + add { pressedInvoker += value; } + remove { pressedInvoker -= value; } + } + + public event EventHandler Pulled + { + add { pulledInvoker += value; } + remove { pulledInvoker -= value; } + } + + public event EventHandler Released + { + add { releasedInvoker += value; } + remove { releasedInvoker -= value; } + } + + public Vector3 StartPosition + { + get + { + switch (State) + { + case GestureState.Began: + case GestureState.Changed: + case GestureState.Ended: + return startPosition; + default: + return transform.position; + } + } + } + + public Vector3 Position + { + get + { + switch (State) + { + case GestureState.Began: + case GestureState.Changed: + case GestureState.Ended: + return projection.ProjectTo(primaryPointer.Position, plane); + default: + return transform.position; + } + } + } + + public Vector3 Force + { + get + { + return StartPosition - Position; + } + } + + // Needed to overcome iOS AOT limitations + private EventHandler pressedInvoker, pulledInvoker, releasedInvoker; + + // The only pointer we are interested in + private Pointer primaryPointer; + + // Layer projection parameters + private ProjectionParams projection; + + // 3D plane to project to + private Plane plane; + + // The world coordinates of the point where the gesture started + private Vector3 startPosition; + + // Pointers pressed this frame + protected override void pointersPressed(IList pointers) + { + if (State == GestureState.Idle) + { + primaryPointer = pointers[0]; + projection = primaryPointer.GetPressData().Layer.GetProjectionParams(primaryPointer); + plane = new Plane(Vector3.up, transform.position); + startPosition = projection.ProjectTo(primaryPointer.Position, plane); + + // Start the gesture + setState(GestureState.Began); + } + } + + // Pointers updated this frame + protected override void pointersUpdated(IList pointers) + { + foreach (var p in pointers) + { + if (p.Id == primaryPointer.Id) + { + // If the pointer we are interested in moved, change the state + setState(GestureState.Changed); + return; + } + } + } + + // Pointers released this frame + protected override void pointersReleased(IList pointers) + { + foreach (var p in pointers) + { + if (p.Id == primaryPointer.Id) + { + // If the pointer we are interested was released, end the gesture + setState(GestureState.Ended); + return; + } + } + } + + // Pointers cancelled this frame + protected override void pointersCancelled(IList pointers) + { + foreach (var p in pointers) + { + if (p.Id == primaryPointer.Id) + { + // If the pointer we are interested was cancelled, cancel the gesture + setState(GestureState.Cancelled); + return; + } + } + } + + // Called when the gesture transitions to Began state + protected override void onBegan() + { + if (pressedInvoker != null) pressedInvoker(this, EventArgs.Empty); + } + + // Called when the gesture transitions to Ended or Recognized states + protected override void onRecognized() + { + if (releasedInvoker != null) releasedInvoker(this, EventArgs.Empty); + } + + // Called when the gesture transitions to Changed state + protected override void onChanged() + { + if (pulledInvoker != null) pulledInvoker(this, EventArgs.Empty); +// Debug.LogFormat("Start position: {0}, current position: {1}, force: {2}", StartPosition, Position, Force.magnitude); + } + + // This method is called when gesture is reset when recognized or failed + protected override void reset() + { + base.reset(); + primaryPointer = null; + } + } +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Examples/Pull/Scripts/PullGesture.cs.meta b/Source/Assets/TouchScript/Examples/Pull/Scripts/PullGesture.cs.meta new file mode 100644 index 000000000..e041b4880 --- /dev/null +++ b/Source/Assets/TouchScript/Examples/Pull/Scripts/PullGesture.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 767c446d703184f6faf8a12a85d591eb +timeCreated: 1501591283 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/RawInput/RawInput.unity.meta b/Source/Assets/TouchScript/Examples/RawInput/RawInput.unity.meta index 1cdb91458..803330be1 100644 --- a/Source/Assets/TouchScript/Examples/RawInput/RawInput.unity.meta +++ b/Source/Assets/TouchScript/Examples/RawInput/RawInput.unity.meta @@ -1,4 +1,4 @@ fileFormatVersion: 2 guid: 9ee061879a6b743808a9f9056a52d885 DefaultImporter: - userData: + userData: "1" diff --git a/Source/Assets/TouchScript/Examples/Taps/Taps.unity.meta b/Source/Assets/TouchScript/Examples/Taps/Taps.unity.meta index 435cfb1ed..38e69afdf 100644 --- a/Source/Assets/TouchScript/Examples/Taps/Taps.unity.meta +++ b/Source/Assets/TouchScript/Examples/Taps/Taps.unity.meta @@ -1,4 +1,4 @@ fileFormatVersion: 2 guid: 5013fa58cea314376b273bd8905581f4 DefaultImporter: - userData: "1" + userData: "2" diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Pull.png b/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Pull.png new file mode 100644 index 0000000000000000000000000000000000000000..718d1d0d63c320a0a1b6825be6b2f47727263bf6 GIT binary patch literal 9274 zcmV-AB*oi_P)!KvD(zC$yWaKOe*gcY{`@a~wdO1c5L2e}9%~ItOgN*FB1o-t!D5Y~3Q#KwkXl({ zA?HG+l11>|1Bx6IwF-T3B&pO|aYl17cv3E$mc*PAMjLjWrxYRQLgx%a?^#nJ)r!%I zT7X(8fYOG}X>=7zsd#V6Ramx6EedTkN!f}mY3|?y#l~f8T z6|A$^>2$&vOOf{A$J0V*EZ#XZprx=S0p*x;LMw&Vnp&hiM9E}*+&aIo)$yHmr4Y&VkaLmW5RcSGyjs zDt2^^tQ56YywMZ{Z$Tsi2JbA^fmI4s4Mp0URLYnk~Zx*_~XV*Erfi)(k zl(-lI7rkfMB8Pd!D8<+ZVk)2&!8;6s)|xpLrY%#dV6DO$!@3ntTVdC0#?E1lL2AWg zP}UNQAUQIv5p5lh#=zaQFk8!DHGb^y#_(cV`MV$7V2cP!LFX*aY33#3jA01vjir=H zrC<=&Qki2q-zH12mL*3v0izX4DTd%tTBD6_A-F`QDEJU~xbIolm9;<;#Sk0{#hfxl zS6+X3fe4(|ND(18O_j`X%{Z$Oz*&vc8l@Cc!8yy5Yll&aU=1k?_jBZ8=!hv(N+s8d zbB^FFsZ_?$p^PTR#F{f!7xuyNc;W>IZ76kG8kicb(olA;bL%%-q1ONl8iNmR0M@kMJNdKS{ORdsxvVa z=9n-F<~4#+?1q3w0h%PjRx*Z`5Nj1IhL{VdWy8>JWzL0Vjc9EchY>~P)iluukGC3% zU=$dj)`|x9!C))xc35rLV#XQGZs(zbB*CGXPm$xgaXEBc?#7l#OD2nO+4X2$G1{={ zc9=yf${4Qp9uPYJ|7CM;EtN{}7HwMYlB)35adSAa#>DlmCzf^tF1z+-r*%UlVYJ57 z%9awwXbhDl2r!*Cv;w7d3!zfc8ZO6yQiS8OF?vfE4Bo)Y!$iuKhx>rF&JnC( zT_QQRa8S;$#=>#gaA=0k^V-#(ScGNU=$xVJJ8TtRq{?mBvo4X-l#!%Jz;4{J9~@gQ zTG*=&Rkh4Qd`dJf~6Kg*Fr3rR0MA|sR)Q7SIxR*jMnUi0hHqLzQZaJ?x%!4_Z1?- z@sP+Btg-Z6z*$A5qP3z{g?AojHDzA7i@7yi^rU&?qI2BW${QCwxnvHf6Db-V zKNyhGLS|Yb+m`4%%bJ7-gX0TNAJX+b&u_kqsgEZ@ciaT@D6P>Tgq5K)z+i*&hqTVfmAA|IT4&@KNyyECgwsd8)N6tA{3?2 z)>3QBMS^A51y0k-$1m=A`*qLLhkIT=zvY8q7>_fdw%b#rvXzX|;FV?DGS(`LR$v{* zYIMmcrRl9jM0j~xaMtknV&v|yf^Ih~mWoq~R5D6cqzd|eo)IZ%0D(RjwvvgZV6?(o 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 c*rp)-zYAC6=<~ Date: Tue, 1 Aug 2017 19:04:53 +0300 Subject: [PATCH 55/58] Updated formatting. --- .../Behaviors/Cursors/CursorManagerEditor.cs | 26 +- .../Editor/Behaviors/TransformerEditor.cs | 61 ++- .../TouchScript/Editor/EditorResources.cs | 2 +- .../Editor/EditorUI/GUIElements.cs | 208 +++++----- .../TouchScript/Editor/EditorUI/GUIUtils.cs | 40 +- .../TouchScript/Editor/EditorUI/PagedList.cs | 179 ++++----- .../Editor/Gestures/FlickGestureEditor.cs | 29 +- .../Editor/Gestures/GestureEditor.cs | 363 +++++++++--------- .../Editor/Gestures/LongPressGestureEditor.cs | 56 +-- .../Editor/Gestures/MetaGestureEditor.cs | 28 +- .../Editor/Gestures/PressGestureEditor.cs | 32 +- .../Editor/Gestures/ReleaseGestureEditor.cs | 36 +- .../Editor/Gestures/TapGestureEditor.cs | 81 ++-- .../OnePointTransformGestureBaseEditor.cs | 70 ++-- .../Base/TransformGestureBaseEditor.cs | 173 ++++----- .../TwoPointTransformGestureBaseEditor.cs | 73 ++-- .../PinnedTransformGestureEditor.cs | 48 ++- .../ScreenTransformGestureEditor.cs | 16 +- .../TransformGestureEditor.cs | 34 +- .../Editor/InputSources/InputSourceEditor.cs | 10 +- .../InputSources/StandardInputEditor.cs | 135 +++---- .../Editor/Layers/FullscreenLayerEditor.cs | 11 +- .../Editor/Layers/StandardLayerEditor.cs | 93 +++-- .../TouchScript/Editor/TouchManagerEditor.cs | 229 +++++------ .../Editor/TouchScriptSettingsWindow.cs | 289 +++++++------- .../Utils/PropertyDrawers/NullToggleDrawer.cs | 16 +- .../Utils/PropertyDrawers/ToggleLeftDrawer.cs | 2 +- .../Camera/Scripts/CameraController.cs | 8 +- .../Examples/Colors/Scripts/Circle.cs | 4 +- .../Cube/Scripts/CustomPointerProxy.cs | 7 +- .../TouchScript/Examples/Cube/Scripts/Init.cs | 11 +- .../Examples/Cube/Scripts/LayerDelegate.cs | 7 +- .../Examples/Cube/Scripts/RedirectInput.cs | 15 +- .../Examples/Multiuser/Scripts/Logo.cs | 3 +- .../Examples/Photos/Scripts/Container.cs | 4 +- .../Examples/Portal/Scripts/Spawner.cs | 1 - .../Examples/Pull/Scripts/Logic.cs | 198 +++++----- .../Examples/Pull/Scripts/PullGesture.cs | 321 ++++++++-------- .../Examples/Taps/Scripts/Break.cs | 6 +- .../TouchScript/Examples/Taps/Scripts/Kick.cs | 8 +- .../Examples/Taps/Scripts/Spawn.cs | 4 +- .../Examples/_misc/Scripts/ExamplesList.cs | 32 +- .../Examples/_misc/Scripts/Highlight.cs | 68 ++-- .../Examples/_misc/Scripts/ShowMe.cs | 24 +- .../Scripts/Gestures/PressGesture.cs | 40 +- .../Scripts/Gestures/TapGesture.cs | 32 +- 46 files changed, 1544 insertions(+), 1589 deletions(-) diff --git a/Source/Assets/TouchScript/Editor/Behaviors/Cursors/CursorManagerEditor.cs b/Source/Assets/TouchScript/Editor/Behaviors/Cursors/CursorManagerEditor.cs index 15538d63c..9e1a4a1e0 100644 --- a/Source/Assets/TouchScript/Editor/Behaviors/Cursors/CursorManagerEditor.cs +++ b/Source/Assets/TouchScript/Editor/Behaviors/Cursors/CursorManagerEditor.cs @@ -9,19 +9,17 @@ namespace TouchScript.Editor.Behaviors.Visualizer { - [CustomEditor(typeof(CursorManager))] - internal sealed class CursorManagerEditor : UnityEditor.Editor + internal sealed class CursorManagerEditor : UnityEditor.Editor { - - public static readonly GUIContent TEXT_DPI_HEADER = new GUIContent("Use DPI", "Scale touch pointer based on DPI."); - public static readonly GUIContent TEXT_CURSORS_HEADER = new GUIContent("Cursors", "Cursor prefabs used for different pointer types."); - public static readonly GUIContent TEXT_POINTER_SIZE = new GUIContent("Pointer size (cm)", "Pointer size in cm based on current DPI."); + public static readonly GUIContent TEXT_DPI_HEADER = new GUIContent("Use DPI", "Scale touch pointer based on DPI."); + public static readonly GUIContent TEXT_CURSORS_HEADER = new GUIContent("Cursors", "Cursor prefabs used for different pointer types."); + public static readonly GUIContent TEXT_POINTER_SIZE = new GUIContent("Pointer size (cm)", "Pointer size in cm based on current DPI."); public static readonly GUIContent TEXT_POINTER_PIXEL_SIZE = new GUIContent("Pointer size (px)", "Pointer size in pixels."); private SerializedProperty mousePointerProxy, touchPointerProxy, penPointerProxy, objectPointerProxy; private SerializedProperty useDPI, cursorSize, cursorPixelSize; - private SerializedProperty cursorsProps; + private SerializedProperty cursorsProps; private void OnEnable() { @@ -41,7 +39,7 @@ public override void OnInspectorGUI() { serializedObject.Update(); - GUILayout.Space(5); + GUILayout.Space(5); EditorGUILayout.PropertyField(useDPI, TEXT_DPI_HEADER); if (useDPI.boolValue) @@ -54,17 +52,17 @@ public override void OnInspectorGUI() } var display = GUIElements.Header(TEXT_CURSORS_HEADER, cursorsProps); - if (display) - { - EditorGUI.indentLevel++; - EditorGUILayout.PropertyField(mousePointerProxy, new GUIContent("Mouse Pointer Proxy")); + if (display) + { + EditorGUI.indentLevel++; + EditorGUILayout.PropertyField(mousePointerProxy, new GUIContent("Mouse Pointer Proxy")); EditorGUILayout.PropertyField(touchPointerProxy, new GUIContent("Touch Pointer Proxy")); EditorGUILayout.PropertyField(penPointerProxy, new GUIContent("Pen Pointer Proxy")); EditorGUILayout.PropertyField(objectPointerProxy, new GUIContent("Object Pointer Proxy")); EditorGUI.indentLevel--; - } + } serializedObject.ApplyModifiedProperties(); } } -} +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Editor/Behaviors/TransformerEditor.cs b/Source/Assets/TouchScript/Editor/Behaviors/TransformerEditor.cs index b7151ab8e..9ab5068d0 100644 --- a/Source/Assets/TouchScript/Editor/Behaviors/TransformerEditor.cs +++ b/Source/Assets/TouchScript/Editor/Behaviors/TransformerEditor.cs @@ -13,20 +13,20 @@ namespace TouchScript.Editor.Behaviors [CustomEditor(typeof(Transformer), true)] internal class TransformerEditor : UnityEditor.Editor { - public static readonly GUIContent TEXT_SMOOTHING_HEADER = new GUIContent("Smoothing", "Applies smoothing to transform actions. This allows to reduce jagged movements but adds some visual lag."); - public static readonly GUIContent TEXT_SMOOTHING_FACTOR = new GUIContent("Factor", "Indicates how much smoothing to apply. 0 - no smoothing, 100000 - maximum."); - public static readonly GUIContent TEXT_POSITION_THRESHOLD = new GUIContent("Position Threshold", "Minimum distance between target position and smoothed position when to stop automatic movement."); - public static readonly GUIContent TEXT_ROTATION_THRESHOLD = new GUIContent("Rotation Threshold", "Minimum angle between target rotation and smoothed rotation when to stop automatic movement."); - public static readonly GUIContent TEXT_SCALE_THRESHOLD = new GUIContent("Scale Threshold", "Minimum difference between target scale and smoothed scale when to stop automatic movement."); - public static readonly GUIContent TEXT_ALLOW_CHANGING = new GUIContent("Allow Changing From Outside", "Indicates if this transform can be changed from another script."); - public static readonly GUIContent TEXT_SMOOTHING_FACTOR_DESC = new GUIContent("Indicates how much smoothing to apply. \n0 - no smoothing, 100000 - maximum."); + public static readonly GUIContent TEXT_SMOOTHING_HEADER = new GUIContent("Smoothing", "Applies smoothing to transform actions. This allows to reduce jagged movements but adds some visual lag."); + public static readonly GUIContent TEXT_SMOOTHING_FACTOR = new GUIContent("Factor", "Indicates how much smoothing to apply. 0 - no smoothing, 100000 - maximum."); + public static readonly GUIContent TEXT_POSITION_THRESHOLD = new GUIContent("Position Threshold", "Minimum distance between target position and smoothed position when to stop automatic movement."); + public static readonly GUIContent TEXT_ROTATION_THRESHOLD = new GUIContent("Rotation Threshold", "Minimum angle between target rotation and smoothed rotation when to stop automatic movement."); + public static readonly GUIContent TEXT_SCALE_THRESHOLD = new GUIContent("Scale Threshold", "Minimum difference between target scale and smoothed scale when to stop automatic movement."); + public static readonly GUIContent TEXT_ALLOW_CHANGING = new GUIContent("Allow Changing From Outside", "Indicates if this transform can be changed from another script."); + public static readonly GUIContent TEXT_SMOOTHING_FACTOR_DESC = new GUIContent("Indicates how much smoothing to apply. \n0 - no smoothing, 100000 - maximum."); - public static readonly GUIContent TEXT_HELP = new GUIContent("This component receives transform data from Transform Gestures and applies changes to the GameObject."); + public static readonly GUIContent TEXT_HELP = new GUIContent("This component receives transform data from Transform Gestures and applies changes to the GameObject."); - private Transformer instance; + private Transformer instance; private SerializedProperty enableSmoothing, allowChangingFromOutside; - private PropertyInfo enableSmoothing_prop; + private PropertyInfo enableSmoothing_prop; protected virtual void OnEnable() { @@ -35,39 +35,38 @@ protected virtual void OnEnable() instance = target as Transformer; - var type = instance.GetType(); - enableSmoothing_prop = type.GetProperty("EnableSmoothing", BindingFlags.Instance | BindingFlags.Public); + var type = instance.GetType(); + enableSmoothing_prop = type.GetProperty("EnableSmoothing", BindingFlags.Instance | BindingFlags.Public); } public override void OnInspectorGUI() { #if UNITY_5_6_OR_NEWER - serializedObject.UpdateIfRequiredOrScript(); + serializedObject.UpdateIfRequiredOrScript(); #else serializedObject.UpdateIfDirtyOrScript(); #endif - GUILayout.Space(5); + GUILayout.Space(5); - var display = GUIElements.Header(TEXT_SMOOTHING_HEADER, enableSmoothing, enableSmoothing, enableSmoothing_prop); - if (display) - { - EditorGUI.indentLevel++; - using (new EditorGUI.DisabledGroupScope(!enableSmoothing.boolValue)) - { - instance.SmoothingFactor = EditorGUILayout.FloatField(TEXT_SMOOTHING_FACTOR, instance.SmoothingFactor); - EditorGUILayout.LabelField(TEXT_SMOOTHING_FACTOR_DESC, GUIElements.HelpBox); - instance.PositionThreshold = EditorGUILayout.FloatField(TEXT_POSITION_THRESHOLD, instance.PositionThreshold); - instance.RotationThreshold = EditorGUILayout.FloatField(TEXT_ROTATION_THRESHOLD, instance.RotationThreshold); - instance.ScaleThreshold = EditorGUILayout.FloatField(TEXT_SCALE_THRESHOLD, instance.ScaleThreshold); - EditorGUILayout.PropertyField(allowChangingFromOutside, TEXT_ALLOW_CHANGING); - } - EditorGUI.indentLevel--; - } + var display = GUIElements.Header(TEXT_SMOOTHING_HEADER, enableSmoothing, enableSmoothing, enableSmoothing_prop); + if (display) + { + EditorGUI.indentLevel++; + using (new EditorGUI.DisabledGroupScope(!enableSmoothing.boolValue)) + { + instance.SmoothingFactor = EditorGUILayout.FloatField(TEXT_SMOOTHING_FACTOR, instance.SmoothingFactor); + EditorGUILayout.LabelField(TEXT_SMOOTHING_FACTOR_DESC, GUIElements.HelpBox); + instance.PositionThreshold = EditorGUILayout.FloatField(TEXT_POSITION_THRESHOLD, instance.PositionThreshold); + instance.RotationThreshold = EditorGUILayout.FloatField(TEXT_ROTATION_THRESHOLD, instance.RotationThreshold); + instance.ScaleThreshold = EditorGUILayout.FloatField(TEXT_SCALE_THRESHOLD, instance.ScaleThreshold); + EditorGUILayout.PropertyField(allowChangingFromOutside, TEXT_ALLOW_CHANGING); + } + EditorGUI.indentLevel--; + } EditorGUILayout.LabelField(TEXT_HELP, GUIElements.HelpBox); serializedObject.ApplyModifiedProperties(); } - } -} +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Editor/EditorResources.cs b/Source/Assets/TouchScript/Editor/EditorResources.cs index 2a455d37a..41f15a5a0 100644 --- a/Source/Assets/TouchScript/Editor/EditorResources.cs +++ b/Source/Assets/TouchScript/Editor/EditorResources.cs @@ -61,4 +61,4 @@ static bool searchForEditorResourcesPath(out string path) return true; } } -} +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Editor/EditorUI/GUIElements.cs b/Source/Assets/TouchScript/Editor/EditorUI/GUIElements.cs index 02f40ce2d..0fdeaab5b 100644 --- a/Source/Assets/TouchScript/Editor/EditorUI/GUIElements.cs +++ b/Source/Assets/TouchScript/Editor/EditorUI/GUIElements.cs @@ -10,119 +10,119 @@ namespace TouchScript.Editor.EditorUI { internal static class GUIElements { - public static GUIStyle Box; - public static GUIStyle BoxLabel; + public static GUIStyle Box; + public static GUIStyle BoxLabel; - public static GUIStyle HelpBox; + public static GUIStyle HelpBox; public static GUIStyle HeaderBox; - public static GUIStyle HeaderCheckbox; - public static GUIStyle HeaderFoldout; + public static GUIStyle HeaderCheckbox; + public static GUIStyle HeaderFoldout; public static GUIStyle SmallText; - public static GUIStyle SmallTextRight; + public static GUIStyle SmallTextRight; public static GUIStyle SmallButton; - public static Texture2D PaneOptionsIcon; + public static Texture2D PaneOptionsIcon; static GUIElements() { - Box = new GUIStyle(GUI.skin.box) - { - margin = new RectOffset(0, 0, 1, 0), - padding = new RectOffset(0, 0, 0, 0), - contentOffset = new Vector2(0, 0), - alignment = TextAnchor.MiddleCenter, - }; - Box.normal.textColor = GUI.skin.label.normal.textColor; - - BoxLabel = new GUIStyle(GUI.skin.label) - { - fontSize = 9, - padding = new RectOffset(0, 0, 5, 0), - }; - - HelpBox = new GUIStyle("HelpBox") - { - wordWrap = true, - }; - - HeaderBox = new GUIStyle("ShurikenModuleTitle") - { - font = (new GUIStyle("Label")).font, - border = new RectOffset(15, 7, 4, 4), - fixedHeight = 22, - contentOffset = new Vector2(20f, -2f), - }; - - HeaderCheckbox = new GUIStyle("ShurikenCheckMark"); - HeaderFoldout = new GUIStyle("Foldout"); - - SmallText = new GUIStyle("miniLabel") - { - alignment = TextAnchor.UpperLeft, - }; - - SmallTextRight = new GUIStyle("miniLabel") - { - alignment = TextAnchor.UpperRight, - }; - - SmallButton = new GUIStyle("Button") - { - fontSize = SmallText.fontSize, - fontStyle = SmallText.fontStyle, - font = SmallText.font, - }; - - if (EditorGUIUtility.isProSkin) - PaneOptionsIcon = (Texture2D)EditorGUIUtility.LoadRequired("Builtin Skins/DarkSkin/Images/pane options.png"); - else - PaneOptionsIcon = (Texture2D)EditorGUIUtility.LoadRequired("Builtin Skins/LightSkin/Images/pane options.png"); + Box = new GUIStyle(GUI.skin.box) + { + margin = new RectOffset(0, 0, 1, 0), + padding = new RectOffset(0, 0, 0, 0), + contentOffset = new Vector2(0, 0), + alignment = TextAnchor.MiddleCenter, + }; + Box.normal.textColor = GUI.skin.label.normal.textColor; + + BoxLabel = new GUIStyle(GUI.skin.label) + { + fontSize = 9, + padding = new RectOffset(0, 0, 5, 0), + }; + + HelpBox = new GUIStyle("HelpBox") + { + wordWrap = true, + }; + + HeaderBox = new GUIStyle("ShurikenModuleTitle") + { + font = (new GUIStyle("Label")).font, + border = new RectOffset(15, 7, 4, 4), + fixedHeight = 22, + contentOffset = new Vector2(20f, -2f), + }; + + HeaderCheckbox = new GUIStyle("ShurikenCheckMark"); + HeaderFoldout = new GUIStyle("Foldout"); + + SmallText = new GUIStyle("miniLabel") + { + alignment = TextAnchor.UpperLeft, + }; + + SmallTextRight = new GUIStyle("miniLabel") + { + alignment = TextAnchor.UpperRight, + }; + + SmallButton = new GUIStyle("Button") + { + fontSize = SmallText.fontSize, + fontStyle = SmallText.fontStyle, + font = SmallText.font, + }; + + if (EditorGUIUtility.isProSkin) + PaneOptionsIcon = (Texture2D) EditorGUIUtility.LoadRequired("Builtin Skins/DarkSkin/Images/pane options.png"); + else + PaneOptionsIcon = (Texture2D) EditorGUIUtility.LoadRequired("Builtin Skins/LightSkin/Images/pane options.png"); } - public static bool Header(GUIContent title, SerializedProperty expanded, SerializedProperty enabled = null, PropertyInfo enabledProp = null) - { - var rect = GUILayoutUtility.GetRect(16f, 22f, HeaderBox); - GUI.Box(rect, title, HeaderBox); - - var display = expanded == null || expanded.isExpanded; - - var foldoutRect = new Rect(rect.x + 4f, rect.y + 3f, 13f, 13f); - var e = Event.current; - - if (e.type == EventType.Repaint) - { - if (enabled == null) HeaderFoldout.Draw(foldoutRect, false, false, display, false); - else HeaderCheckbox.Draw(foldoutRect, false, false, enabled.boolValue, false); - } - - if (e.type == EventType.MouseDown) - { - if (enabled != null) - { - const float kOffset = 2f; - foldoutRect.x -= kOffset; - foldoutRect.y -= kOffset; - foldoutRect.width += kOffset * 2f; - foldoutRect.height += kOffset * 2f; - - if (foldoutRect.Contains(e.mousePosition)) - { - enabled.boolValue = !enabled.boolValue; - if (enabledProp != null) enabledProp.SetValue(enabled.serializedObject.targetObject, enabled.boolValue, null); - e.Use(); - return display; - } - } - if (rect.Contains(e.mousePosition)) - { - display = !display; - expanded.isExpanded = !expanded.isExpanded; - e.Use(); - } - } - - return display; - } + public static bool Header(GUIContent title, SerializedProperty expanded, SerializedProperty enabled = null, PropertyInfo enabledProp = null) + { + var rect = GUILayoutUtility.GetRect(16f, 22f, HeaderBox); + GUI.Box(rect, title, HeaderBox); + + var display = expanded == null || expanded.isExpanded; + + var foldoutRect = new Rect(rect.x + 4f, rect.y + 3f, 13f, 13f); + var e = Event.current; + + if (e.type == EventType.Repaint) + { + if (enabled == null) HeaderFoldout.Draw(foldoutRect, false, false, display, false); + else HeaderCheckbox.Draw(foldoutRect, false, false, enabled.boolValue, false); + } + + if (e.type == EventType.MouseDown) + { + if (enabled != null) + { + const float kOffset = 2f; + foldoutRect.x -= kOffset; + foldoutRect.y -= kOffset; + foldoutRect.width += kOffset * 2f; + foldoutRect.height += kOffset * 2f; + + if (foldoutRect.Contains(e.mousePosition)) + { + enabled.boolValue = !enabled.boolValue; + if (enabledProp != null) enabledProp.SetValue(enabled.serializedObject.targetObject, enabled.boolValue, null); + e.Use(); + return display; + } + } + if (rect.Contains(e.mousePosition)) + { + display = !display; + expanded.isExpanded = !expanded.isExpanded; + e.Use(); + } + } + + return display; + } public static bool BasicHelpBox(GUIContent text) { @@ -134,4 +134,4 @@ public static bool BasicHelpBox(GUIContent text) return GUI.Button(rect, "Switch to Advanced", SmallButton); } } -} +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Editor/EditorUI/GUIUtils.cs b/Source/Assets/TouchScript/Editor/EditorUI/GUIUtils.cs index 61c1e7ca3..db12ed199 100644 --- a/Source/Assets/TouchScript/Editor/EditorUI/GUIUtils.cs +++ b/Source/Assets/TouchScript/Editor/EditorUI/GUIUtils.cs @@ -6,29 +6,25 @@ namespace TouchScript.Editor.EditorUI { - public static class GUIUtils { + public static Rect GetPaddedRect(int minHeight, int padding, bool expandHeight = false) + { + Rect rect; + if (expandHeight) + rect = GUILayoutUtility.GetRect(padding * 2, minHeight + padding * 2, GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true)); + else + rect = GUILayoutUtility.GetRect(padding * 2, minHeight + padding * 2, GUILayout.ExpandWidth(true)); + ContractRect(ref rect, padding); + return rect; + } - public static Rect GetPaddedRect(int minHeight, int padding, bool expandHeight = false) - { - Rect rect; - if (expandHeight) - rect = GUILayoutUtility.GetRect(padding * 2, minHeight + padding * 2, GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true)); - else - rect = GUILayoutUtility.GetRect(padding * 2, minHeight + padding * 2, GUILayout.ExpandWidth(true)); - ContractRect(ref rect, padding); - return rect; - } - - public static void ContractRect(ref Rect rect, int delta) - { - rect.x += delta; - rect.y += delta; - rect.width -= delta * 2; - rect.height -= delta * 2; - } - - } - + public static void ContractRect(ref Rect rect, int delta) + { + rect.x += delta; + rect.y += delta; + rect.width -= delta * 2; + rect.height -= delta * 2; + } + } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Editor/EditorUI/PagedList.cs b/Source/Assets/TouchScript/Editor/EditorUI/PagedList.cs index cddeae0ca..5ebd45c7b 100644 --- a/Source/Assets/TouchScript/Editor/EditorUI/PagedList.cs +++ b/Source/Assets/TouchScript/Editor/EditorUI/PagedList.cs @@ -8,10 +8,8 @@ namespace TouchScript.Editor.EditorUI { - - public class PagedList - { - + public class PagedList + { private class Styles { public int HeaderHeight = 0; @@ -25,106 +23,100 @@ private class Styles public GUIContent TextPrev = new GUIContent("< Prev"); public GUIContent TextNext = new GUIContent("Next >"); - public int GetIntFieldSize(int value) - { - if (value < 10) return FooterTextWidth + 8; - if (value < 100) return 2 * FooterTextWidth + 8; - if (value < 1000) return 3 * FooterTextWidth + 8; - return 4; - } - } - - public int ItemHeight { get; set; } - public int Count - { - get + public int GetIntFieldSize(int value) { - return count; + if (value < 10) return FooterTextWidth + 8; + if (value < 100) return 2 * FooterTextWidth + 8; + if (value < 1000) return 3 * FooterTextWidth + 8; + return 4; } + } + + public int ItemHeight { get; set; } + + public int Count + { + get { return count; } set { if (count == value) return; count = value; reset(); - } + } } + public int PagesTotal { - get - { - return pagesTotal; - } + get { return pagesTotal; } } + public int SelectedId { - get - { - return selectedId; - } + get { return selectedId; } } private static Styles styles; - private Action onSelectionChange; - private Action drawItem; + private Action onSelectionChange; + private Action drawItem; private int count = 0; // Starts from 1 - private int page = 1; + private int page = 1; private int pagesTotal = 1; private int itemsPerPage = 1; - private int selectedId = -1; - private int oldSelectedId = -1; + private int selectedId = -1; + private int oldSelectedId = -1; - public PagedList(int itemHeight, Action drawItem, Action onSelectionChange) - { + public PagedList(int itemHeight, Action drawItem, Action onSelectionChange) + { if (styles == null) styles = new Styles(); - ItemHeight = itemHeight; - this.onSelectionChange = onSelectionChange; - this.drawItem = drawItem; - } + ItemHeight = itemHeight; + this.onSelectionChange = onSelectionChange; + this.drawItem = drawItem; + } - public int FitHeight(int numberOfItems) - { - return ItemHeight * numberOfItems + styles.FooterHeight + styles.HeaderHeight; - } + public int FitHeight(int numberOfItems) + { + return ItemHeight * numberOfItems + styles.FooterHeight + styles.HeaderHeight; + } - public void Draw(Rect rect) - { - var h = rect.height; - h -= styles.HeaderHeight + styles.FooterHeight; - if (h < 0) return; - rect.y += styles.HeaderHeight; - rect.height = ItemHeight; + public void Draw(Rect rect) + { + var h = rect.height; + h -= styles.HeaderHeight + styles.FooterHeight; + if (h < 0) return; + rect.y += styles.HeaderHeight; + rect.height = ItemHeight; - itemsPerPage = Mathf.FloorToInt(h / 22f); - pagesTotal = Mathf.CeilToInt((float)count / itemsPerPage); + itemsPerPage = Mathf.FloorToInt(h / 22f); + pagesTotal = Mathf.CeilToInt((float) count / itemsPerPage); int start = (Count - 1) - (page - 1) * itemsPerPage; - if (start < 0) return; - - var i = start; - var t = 0; - while (t < itemsPerPage) - { - if (i < 0) draw(-1, rect); - else draw(i, rect); - rect.y += ItemHeight; - i--; - t++; - } + if (start < 0) return; + + var i = start; + var t = 0; + while (t < itemsPerPage) + { + if (i < 0) draw(-1, rect); + else draw(i, rect); + rect.y += ItemHeight; + i--; + t++; + } rect.height = styles.FooterHeight; drawFooter(rect); - if (oldSelectedId != selectedId) - { - oldSelectedId = selectedId; - onSelectionChange(selectedId); - } - } + if (oldSelectedId != selectedId) + { + oldSelectedId = selectedId; + onSelectionChange(selectedId); + } + } private void drawFooter(Rect parentRect) { @@ -146,8 +138,8 @@ private void drawFooter(Rect parentRect) rect.width = 16; GUI.Label(rect, "of"); - rect.x += rect.width + styles.FooterButtonSpace; - rect.width = styles.GetIntFieldSize(page); + rect.x += rect.width + styles.FooterButtonSpace; + rect.width = styles.GetIntFieldSize(page); using (var scope = new EditorGUI.DisabledScope(true)) { @@ -157,29 +149,29 @@ private void drawFooter(Rect parentRect) rect.x += rect.width + styles.FooterButtonSpace; rect.width = styles.FooterButtonWidth; if (GUI.Button(rect, styles.TextNext)) - { + { setPage(page + 1); - } + } } - private void draw(int id, Rect rect) - { - switch (Event.current.type) - { - case EventType.Repaint: - case EventType.Layout: - drawItem(id, rect, selectedId == id); - break; - case EventType.MouseDown: - if (rect.Contains(Event.current.mousePosition)) - { - selectedId = id; + private void draw(int id, Rect rect) + { + switch (Event.current.type) + { + case EventType.Repaint: + case EventType.Layout: + drawItem(id, rect, selectedId == id); + break; + case EventType.MouseDown: + if (rect.Contains(Event.current.mousePosition)) + { + selectedId = id; Event.current.Use(); //GUI.changed = true; - } - break; - } - } + } + break; + } + } private void setPage(int newPage) { @@ -190,10 +182,9 @@ private void setPage(int newPage) private void reset() { - page = 1; - selectedId = -1; - oldSelectedId = -1; + page = 1; + selectedId = -1; + oldSelectedId = -1; } - - } + } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Editor/Gestures/FlickGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/FlickGestureEditor.cs index d9efa4d78..971c6ba11 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/FlickGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/FlickGestureEditor.cs @@ -11,14 +11,14 @@ namespace TouchScript.Editor.Gestures [CustomEditor(typeof(FlickGesture), true)] internal sealed class FlickGestureEditor : GestureEditor { - public static readonly GUIContent DIRECTION = new GUIContent("Direction", "Flick direction."); - public static readonly GUIContent MOVEMENT_THRESHOLD = new GUIContent("Movement Threshold (cm)", "Minimum distance in cm pointers must move for the gesture to begin."); - public static readonly GUIContent FLICK_TIME = new GUIContent("Flick Time (sec)", "Time interval in seconds during which pointers must move by for the gesture to be recognized."); - public static readonly GUIContent MIN_DISTANCE = new GUIContent("Minimum Distance (cm)", "Minimum distance in cm pointers must move in seconds for the gesture to be recognized."); + public static readonly GUIContent DIRECTION = new GUIContent("Direction", "Flick direction."); + public static readonly GUIContent MOVEMENT_THRESHOLD = new GUIContent("Movement Threshold (cm)", "Minimum distance in cm pointers must move for the gesture to begin."); + public static readonly GUIContent FLICK_TIME = new GUIContent("Flick Time (sec)", "Time interval in seconds during which pointers must move by for the gesture to be recognized."); + public static readonly GUIContent MIN_DISTANCE = new GUIContent("Minimum Distance (cm)", "Minimum distance in cm pointers must move in seconds for the gesture to be recognized."); - public static readonly GUIContent TEXT_HELP = new GUIContent("This component a fast flick gesture started over the GameObject."); + public static readonly GUIContent TEXT_HELP = new GUIContent("This component a fast flick gesture started over the GameObject."); - private SerializedProperty direction; + private SerializedProperty direction; private SerializedProperty flickTime; private SerializedProperty minDistance; private SerializedProperty movementThreshold; @@ -33,10 +33,10 @@ protected override void OnEnable() direction = serializedObject.FindProperty("direction"); } - protected override void drawBasic() - { + protected override void drawBasic() + { EditorGUILayout.PropertyField(direction, DIRECTION); - } + } protected override void drawGeneral() { @@ -47,10 +47,9 @@ protected override void drawGeneral() EditorGUILayout.PropertyField(minDistance, MIN_DISTANCE); } - protected override GUIContent getHelpText() - { - return TEXT_HELP; - } - + protected override GUIContent getHelpText() + { + return TEXT_HELP; + } } -} +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs index 482c35f48..1232e8a97 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs @@ -16,35 +16,37 @@ namespace TouchScript.Editor.Gestures internal class GestureEditor : UnityEditor.Editor { private const string FRIENDLY_GESTURES_PROP = "friendlyGestures"; - - public static readonly GUIContent TEXT_GENERAL_HEADER = new GUIContent("General settings", "General settings."); - public static readonly GUIContent TEXT_LIMITS_HEADER = new GUIContent("Limits", "Properties that limit the gesture."); - public static readonly GUIContent TEXT_GESTURES_HEADER = new GUIContent("Interaction with other Gestures", "Settings which allow this gesture to interact with other gestures."); - public static readonly GUIContent TEXT_ADVANCED_HEADER = new GUIContent("Advanced", "Advanced properties."); - public static readonly GUIContent TEXT_USE_SEND_MESSAGE_HEADER = new GUIContent("Use SendMessage", "Enables sending events through SendMessage. Warnning: this method is slow!"); - public static readonly GUIContent TEXT_USE_UNITY_EVENTS_HEADER = new GUIContent("Use Unity Events", "Enables sending events through Unity Events."); - - public static readonly GUIContent TEXT_FRIENDLY = new GUIContent("Friendly Gestures", "List of gestures which can work together with this gesture."); - public static readonly GUIContent TEXT_DEBUG_MODE = new GUIContent("Debug", "Turns on gesture debug mode."); - public static readonly GUIContent TEXT_SEND_STATE_CHANGE_MESSAGES = new GUIContent("Send State Change Messages", "If checked, the gesture will send a message for every state change. Gestures usually have their own more specific messages, so you should keep this toggle unchecked unless you really want state change messages."); - public static readonly GUIContent TEXT_SEND_MESSAGE_TARGET = new GUIContent("Target", "The GameObject target of Unity Messages. If null, host GameObject is used."); - public static readonly GUIContent TEXT_SEND_STATE_CHANGE_EVENTS = new GUIContent("Send State Change Events", "If checked, the gesture will send a events for every state change. Gestures usually have their own more specific messages, so you should keep this toggle unchecked unless you really want state change events."); - public static readonly GUIContent TEXT_REQUIRE_GESTURE_TO_FAIL = new GUIContent("Require Other Gesture to Fail", "Another gesture must fail for this gesture to start."); - public static readonly GUIContent TEXT_LIMIT_POINTERS = new GUIContent(" Limit Pointers", ""); - - protected bool shouldDrawAdvanced = false; - protected bool shouldDrawGeneral = true; - - private Gesture instance; + + public static readonly GUIContent TEXT_GENERAL_HEADER = new GUIContent("General settings", "General settings."); + public static readonly GUIContent TEXT_LIMITS_HEADER = new GUIContent("Limits", "Properties that limit the gesture."); + public static readonly GUIContent TEXT_GESTURES_HEADER = new GUIContent("Interaction with other Gestures", "Settings which allow this gesture to interact with other gestures."); + public static readonly GUIContent TEXT_ADVANCED_HEADER = new GUIContent("Advanced", "Advanced properties."); + public static readonly GUIContent TEXT_USE_SEND_MESSAGE_HEADER = new GUIContent("Use SendMessage", "Enables sending events through SendMessage. Warnning: this method is slow!"); + public static readonly GUIContent TEXT_USE_UNITY_EVENTS_HEADER = new GUIContent("Use Unity Events", "Enables sending events through Unity Events."); + + public static readonly GUIContent TEXT_FRIENDLY = new GUIContent("Friendly Gestures", "List of gestures which can work together with this gesture."); + public static readonly GUIContent TEXT_DEBUG_MODE = new GUIContent("Debug", "Turns on gesture debug mode."); + public static readonly GUIContent TEXT_SEND_STATE_CHANGE_MESSAGES = new GUIContent("Send State Change Messages", "If checked, the gesture will send a message for every state change. Gestures usually have their own more specific messages, so you should keep this toggle unchecked unless you really want state change messages."); + public static readonly GUIContent TEXT_SEND_MESSAGE_TARGET = new GUIContent("Target", "The GameObject target of Unity Messages. If null, host GameObject is used."); + public static readonly GUIContent TEXT_SEND_STATE_CHANGE_EVENTS = new GUIContent("Send State Change Events", "If checked, the gesture will send a events for every state change. Gestures usually have their own more specific messages, so you should keep this toggle unchecked unless you really want state change events."); + public static readonly GUIContent TEXT_REQUIRE_GESTURE_TO_FAIL = new GUIContent("Require Other Gesture to Fail", "Another gesture must fail for this gesture to start."); + public static readonly GUIContent TEXT_LIMIT_POINTERS = new GUIContent(" Limit Pointers", ""); + + protected bool shouldDrawAdvanced = false; + protected bool shouldDrawGeneral = true; + + private Gesture instance; private SerializedProperty basicEditor; + private SerializedProperty debugMode, friendlyGestures, requireGestureToFail, - minPointers, maxPointers, - useSendMessage, sendMessageTarget, sendStateChangeMessages, - useUnityEvents, sendStateChangeEvents; - private SerializedProperty OnStateChange; - private SerializedProperty advancedProps, limitsProps, generalProps; - private PropertyInfo useUnityEvents_prop, useSendMessage_prop; + minPointers, maxPointers, + useSendMessage, sendMessageTarget, sendStateChangeMessages, + useUnityEvents, sendStateChangeEvents; + + private SerializedProperty OnStateChange; + private SerializedProperty advancedProps, limitsProps, generalProps; + private PropertyInfo useUnityEvents_prop, useSendMessage_prop; private ReorderableList friendlyGesturesList; private int indexToRemove = -1; @@ -52,11 +54,11 @@ internal class GestureEditor : UnityEditor.Editor protected virtual void OnEnable() { - instance = target as Gesture; + instance = target as Gesture; advancedProps = serializedObject.FindProperty("advancedProps"); - limitsProps = serializedObject.FindProperty("limitsProps"); - generalProps = serializedObject.FindProperty("generalProps"); + limitsProps = serializedObject.FindProperty("limitsProps"); + generalProps = serializedObject.FindProperty("generalProps"); basicEditor = serializedObject.FindProperty("basicEditor"); debugMode = serializedObject.FindProperty("debugMode"); @@ -65,16 +67,16 @@ protected virtual void OnEnable() useSendMessage = serializedObject.FindProperty("useSendMessage"); sendMessageTarget = serializedObject.FindProperty("sendMessageTarget"); sendStateChangeMessages = serializedObject.FindProperty("sendStateChangeMessages"); - useUnityEvents = serializedObject.FindProperty("useUnityEvents"); - sendStateChangeEvents = serializedObject.FindProperty("sendStateChangeEvents"); + useUnityEvents = serializedObject.FindProperty("useUnityEvents"); + sendStateChangeEvents = serializedObject.FindProperty("sendStateChangeEvents"); minPointers = serializedObject.FindProperty("minPointers"); maxPointers = serializedObject.FindProperty("maxPointers"); - OnStateChange = serializedObject.FindProperty("OnStateChange"); + OnStateChange = serializedObject.FindProperty("OnStateChange"); - var type = instance.GetType(); - useUnityEvents_prop = type.GetProperty("UseUnityEvents", BindingFlags.Instance | BindingFlags.Public); - useSendMessage_prop = type.GetProperty("UseSendMessage", BindingFlags.Instance | BindingFlags.Public); + var type = instance.GetType(); + useUnityEvents_prop = type.GetProperty("UseUnityEvents", BindingFlags.Instance | BindingFlags.Public); + useSendMessage_prop = type.GetProperty("UseSendMessage", BindingFlags.Instance | BindingFlags.Public); minPointersFloat = minPointers.intValue; maxPointersFloat = maxPointers.intValue; @@ -100,162 +102,153 @@ protected virtual void OnEnable() public override void OnInspectorGUI() { #if UNITY_5_6_OR_NEWER - serializedObject.UpdateIfRequiredOrScript(); + serializedObject.UpdateIfRequiredOrScript(); #else serializedObject.UpdateIfDirtyOrScript(); #endif - GUILayout.Space(5); - bool display; + GUILayout.Space(5); + bool display; - if (basicEditor.boolValue) - { + if (basicEditor.boolValue) + { drawBasic(); - if (GUIElements.BasicHelpBox(getHelpText())) - { - basicEditor.boolValue = false; - Repaint(); - } - } - else - { - if (shouldDrawGeneral) - { - display = GUIElements.Header(TEXT_GENERAL_HEADER, generalProps); - if (display) - { - EditorGUI.indentLevel++; - drawGeneral(); - EditorGUI.indentLevel--; - } - } - - drawOtherGUI(); - - display = GUIElements.Header(TEXT_LIMITS_HEADER, limitsProps); - if (display) - { - EditorGUI.indentLevel++; - drawLimits(); - EditorGUI.indentLevel--; - } - - display = GUIElements.Header(TEXT_GESTURES_HEADER, friendlyGestures); - if (display) - { - EditorGUI.indentLevel++; - drawFriendlyGestures(); - drawRequireToFail(); - GUILayout.Space(5); - EditorGUI.indentLevel--; - } - - display = GUIElements.Header(TEXT_USE_UNITY_EVENTS_HEADER, useUnityEvents, useUnityEvents, useUnityEvents_prop); - if (display) - { - EditorGUI.indentLevel++; - using (new EditorGUI.DisabledGroupScope(!useUnityEvents.boolValue)) - { - drawUnityEvents(); - } - EditorGUI.indentLevel--; - } - - display = GUIElements.Header(TEXT_USE_SEND_MESSAGE_HEADER, useSendMessage, useSendMessage, useSendMessage_prop); - if (display) - { - EditorGUI.indentLevel++; - using (new EditorGUI.DisabledGroupScope(!useSendMessage.boolValue)) - { - drawSendMessage(); - } - EditorGUI.indentLevel--; - } - - if (shouldDrawAdvanced) - { - display = GUIElements.Header(TEXT_ADVANCED_HEADER, advancedProps); - if (display) - { - EditorGUI.indentLevel++; - drawAdvanced(); - EditorGUI.indentLevel--; - } - } + if (GUIElements.BasicHelpBox(getHelpText())) + { + basicEditor.boolValue = false; + Repaint(); + } + } + else + { + if (shouldDrawGeneral) + { + display = GUIElements.Header(TEXT_GENERAL_HEADER, generalProps); + if (display) + { + EditorGUI.indentLevel++; + drawGeneral(); + EditorGUI.indentLevel--; + } + } + + drawOtherGUI(); + + display = GUIElements.Header(TEXT_LIMITS_HEADER, limitsProps); + if (display) + { + EditorGUI.indentLevel++; + drawLimits(); + EditorGUI.indentLevel--; + } + + display = GUIElements.Header(TEXT_GESTURES_HEADER, friendlyGestures); + if (display) + { + EditorGUI.indentLevel++; + drawFriendlyGestures(); + drawRequireToFail(); + GUILayout.Space(5); + EditorGUI.indentLevel--; + } + + display = GUIElements.Header(TEXT_USE_UNITY_EVENTS_HEADER, useUnityEvents, useUnityEvents, useUnityEvents_prop); + if (display) + { + EditorGUI.indentLevel++; + using (new EditorGUI.DisabledGroupScope(!useUnityEvents.boolValue)) + { + drawUnityEvents(); + } + EditorGUI.indentLevel--; + } + + display = GUIElements.Header(TEXT_USE_SEND_MESSAGE_HEADER, useSendMessage, useSendMessage, useSendMessage_prop); + if (display) + { + EditorGUI.indentLevel++; + using (new EditorGUI.DisabledGroupScope(!useSendMessage.boolValue)) + { + drawSendMessage(); + } + EditorGUI.indentLevel--; + } + + if (shouldDrawAdvanced) + { + display = GUIElements.Header(TEXT_ADVANCED_HEADER, advancedProps); + if (display) + { + EditorGUI.indentLevel++; + drawAdvanced(); + EditorGUI.indentLevel--; + } + } drawDebug(); - } + } serializedObject.ApplyModifiedProperties(); } - protected virtual void drawBasic() - { - - } + protected virtual void drawBasic() {} protected virtual GUIContent getHelpText() { return new GUIContent(""); } - protected virtual void drawOtherGUI() - { - - } - - protected virtual void drawGeneral() - { - - } - - protected virtual void drawLimits() - { - var limitPointers = (minPointers.intValue > 0) || (maxPointers.intValue > 0); - var newLimitPointers = EditorGUILayout.ToggleLeft(TEXT_LIMIT_POINTERS, limitPointers); - if (newLimitPointers) - { - if (!limitPointers) - { - minPointersFloat = 0; - maxPointersFloat = 10; - } - else - { - minPointersFloat = (float) minPointers.intValue; - maxPointersFloat = (float) maxPointers.intValue; - } - //or this values doesn't change from script properly - EditorGUI.indentLevel++; - EditorGUILayout.LabelField("Min: " + (int)minPointersFloat + ", Max: " + (int)maxPointersFloat); - EditorGUILayout.MinMaxSlider(ref minPointersFloat, ref maxPointersFloat, 0, 10, GUILayout.MaxWidth(150)); - EditorGUI.indentLevel--; - } - else - { - if (limitPointers) - { - minPointersFloat = 0; - maxPointersFloat = 0; - } - } - - minPointers.intValue = (int)minPointersFloat; - maxPointers.intValue = (int)maxPointersFloat; - } - - protected virtual void drawFriendlyGestures() - { - GUILayout.Space(5); - drawGestureList(friendlyGestures, addFriendlyGesture); - GUILayout.Space(5); - } - - protected virtual void drawUnityEvents() - { - EditorGUILayout.PropertyField(OnStateChange); - EditorGUILayout.PropertyField(sendStateChangeEvents, TEXT_SEND_STATE_CHANGE_EVENTS); - } + protected virtual void drawOtherGUI() {} + + protected virtual void drawGeneral() {} + + protected virtual void drawLimits() + { + var limitPointers = (minPointers.intValue > 0) || (maxPointers.intValue > 0); + var newLimitPointers = EditorGUILayout.ToggleLeft(TEXT_LIMIT_POINTERS, limitPointers); + if (newLimitPointers) + { + if (!limitPointers) + { + minPointersFloat = 0; + maxPointersFloat = 10; + } + else + { + minPointersFloat = (float) minPointers.intValue; + maxPointersFloat = (float) maxPointers.intValue; + } + //or this values doesn't change from script properly + EditorGUI.indentLevel++; + EditorGUILayout.LabelField("Min: " + (int) minPointersFloat + ", Max: " + (int) maxPointersFloat); + EditorGUILayout.MinMaxSlider(ref minPointersFloat, ref maxPointersFloat, 0, 10, GUILayout.MaxWidth(150)); + EditorGUI.indentLevel--; + } + else + { + if (limitPointers) + { + minPointersFloat = 0; + maxPointersFloat = 0; + } + } + + minPointers.intValue = (int) minPointersFloat; + maxPointers.intValue = (int) maxPointersFloat; + } + + protected virtual void drawFriendlyGestures() + { + GUILayout.Space(5); + drawGestureList(friendlyGestures, addFriendlyGesture); + GUILayout.Space(5); + } + + protected virtual void drawUnityEvents() + { + EditorGUILayout.PropertyField(OnStateChange); + EditorGUILayout.PropertyField(sendStateChangeEvents, TEXT_SEND_STATE_CHANGE_EVENTS); + } protected virtual void drawSendMessage() { @@ -263,20 +256,18 @@ protected virtual void drawSendMessage() EditorGUILayout.PropertyField(sendStateChangeMessages, TEXT_SEND_STATE_CHANGE_MESSAGES); } - protected virtual void drawAdvanced() + protected virtual void drawAdvanced() {} + + protected virtual void drawDebug() { + if (debugMode == null) return; + EditorGUILayout.PropertyField(debugMode, TEXT_DEBUG_MODE); } - protected virtual void drawDebug() - { - if (debugMode == null) return; - EditorGUILayout.PropertyField(debugMode, TEXT_DEBUG_MODE); - } - - protected virtual void drawRequireToFail() - { - EditorGUILayout.PropertyField(requireGestureToFail, TEXT_REQUIRE_GESTURE_TO_FAIL); - } + protected virtual void drawRequireToFail() + { + EditorGUILayout.PropertyField(requireGestureToFail, TEXT_REQUIRE_GESTURE_TO_FAIL); + } #region Gesture List @@ -286,11 +277,11 @@ private void drawGestureList(SerializedProperty prop, Action cm."); + public static readonly GUIContent TEXT_TIME_TO_PRESS = new GUIContent("Time to Press (sec)", "Limit maximum number of simultaneous pointers."); + public static readonly GUIContent TEXT_DISTANCE_LIMIT = new GUIContent("Limit Movement (cm)", "Gesture fails if fingers move more than cm."); - public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a gesture when this GameObject is being pressed for seconds."); + public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a gesture when this GameObject is being pressed for seconds."); - private SerializedProperty distanceLimit, timeToPress; - private SerializedProperty OnLongPress; + private SerializedProperty distanceLimit, timeToPress; + private SerializedProperty OnLongPress; protected override void OnEnable() { timeToPress = serializedObject.FindProperty("timeToPress"); distanceLimit = serializedObject.FindProperty("distanceLimit"); - OnLongPress = serializedObject.FindProperty("OnLongPress"); + OnLongPress = serializedObject.FindProperty("OnLongPress"); - base.OnEnable(); + base.OnEnable(); } - protected override void drawBasic() - { + protected override void drawBasic() + { EditorGUILayout.PropertyField(timeToPress, TEXT_TIME_TO_PRESS); - } + } - protected override GUIContent getHelpText() - { - return TEXT_HELP; - } + protected override GUIContent getHelpText() + { + return TEXT_HELP; + } - protected override void drawGeneral () - { - EditorGUILayout.PropertyField(timeToPress, TEXT_TIME_TO_PRESS); + protected override void drawGeneral() + { + EditorGUILayout.PropertyField(timeToPress, TEXT_TIME_TO_PRESS); - base.drawGeneral(); - } + base.drawGeneral(); + } - protected override void drawLimits () - { + protected override void drawLimits() + { EditorGUILayout.PropertyField(distanceLimit, TEXT_DISTANCE_LIMIT); - base.drawLimits(); + base.drawLimits(); } - protected override void drawUnityEvents () - { - EditorGUILayout.PropertyField(OnLongPress); + protected override void drawUnityEvents() + { + EditorGUILayout.PropertyField(OnLongPress); - base.drawUnityEvents (); - } + base.drawUnityEvents(); + } } -} +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Editor/Gestures/MetaGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/MetaGestureEditor.cs index c8803f031..1d50c7784 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/MetaGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/MetaGestureEditor.cs @@ -8,21 +8,21 @@ namespace TouchScript.Editor.Gestures { - [CustomEditor(typeof(MetaGesture), true)] - internal sealed class MetaGestureEditor : GestureEditor - { - public static readonly GUIContent TEXT_HELP = new GUIContent("This component serves as a proxy from TouchScript gesture recognition logic to C# events. It catches pointers like a normal event and dispatches events for every event of caught pointers."); + [CustomEditor(typeof(MetaGesture), true)] + internal sealed class MetaGestureEditor : GestureEditor + { + public static readonly GUIContent TEXT_HELP = new GUIContent("This component serves as a proxy from TouchScript gesture recognition logic to C# events. It catches pointers like a normal event and dispatches events for every event of caught pointers."); - protected override void OnEnable() - { - base.OnEnable(); + protected override void OnEnable() + { + base.OnEnable(); shouldDrawGeneral = false; - } + } - protected override GUIContent getHelpText() - { - return TEXT_HELP; - } - } -} + protected override GUIContent getHelpText() + { + return TEXT_HELP; + } + } +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Editor/Gestures/PressGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/PressGestureEditor.cs index 8d394260a..5c00da861 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/PressGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/PressGestureEditor.cs @@ -11,38 +11,38 @@ namespace TouchScript.Editor.Gestures [CustomEditor(typeof(PressGesture), true)] internal sealed class PressGestureEditor : GestureEditor { - public static readonly GUIContent TEXT_IGNORE_CHILDREN = new GUIContent("Ignore Children", "If selected this gesture ignores pointers from children."); + public static readonly GUIContent TEXT_IGNORE_CHILDREN = new GUIContent("Ignore Children", "If selected this gesture ignores pointers from children."); public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a gesture when at least one pointer is pressed over this GameObject."); private SerializedProperty ignoreChildren; - private SerializedProperty OnPress; + private SerializedProperty OnPress; protected override void OnEnable() { ignoreChildren = serializedObject.FindProperty("ignoreChildren"); - OnPress = serializedObject.FindProperty("OnPress"); + OnPress = serializedObject.FindProperty("OnPress"); - base.OnEnable(); + base.OnEnable(); } - protected override GUIContent getHelpText() - { - return TEXT_HELP; - } + protected override GUIContent getHelpText() + { + return TEXT_HELP; + } - protected override void drawGeneral() + protected override void drawGeneral() { EditorGUILayout.PropertyField(ignoreChildren, TEXT_IGNORE_CHILDREN); - base.drawGeneral(); + base.drawGeneral(); } - protected override void drawUnityEvents () - { - EditorGUILayout.PropertyField(OnPress); + protected override void drawUnityEvents() + { + EditorGUILayout.PropertyField(OnPress); - base.drawUnityEvents(); - } + base.drawUnityEvents(); + } } -} +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Editor/Gestures/ReleaseGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/ReleaseGestureEditor.cs index ef554a102..ff2b1ec22 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/ReleaseGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/ReleaseGestureEditor.cs @@ -11,38 +11,38 @@ namespace TouchScript.Editor.Gestures [CustomEditor(typeof(ReleaseGesture), true)] internal sealed class ReleaseGestureEditor : GestureEditor { - public static readonly GUIContent TEXT_IGNORE_CHILDREN = new GUIContent("Ignore Children", "If selected this gesture ignores pointers from children."); + public static readonly GUIContent TEXT_IGNORE_CHILDREN = new GUIContent("Ignore Children", "If selected this gesture ignores pointers from children."); - public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a gesture when all pointers are lifted off from this GameObject."); + public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a gesture when all pointers are lifted off from this GameObject."); - private SerializedProperty ignoreChildren; - private SerializedProperty OnRelease; + private SerializedProperty ignoreChildren; + private SerializedProperty OnRelease; protected override void OnEnable() { ignoreChildren = serializedObject.FindProperty("ignoreChildren"); - OnRelease = serializedObject.FindProperty("OnRelease"); + OnRelease = serializedObject.FindProperty("OnRelease"); - base.OnEnable(); + base.OnEnable(); } - protected override GUIContent getHelpText() - { - return TEXT_HELP; - } + protected override GUIContent getHelpText() + { + return TEXT_HELP; + } - protected override void drawGeneral() + protected override void drawGeneral() { EditorGUILayout.PropertyField(ignoreChildren, TEXT_IGNORE_CHILDREN); - base.drawGeneral(); + base.drawGeneral(); } - protected override void drawUnityEvents () - { - EditorGUILayout.PropertyField(OnRelease); + protected override void drawUnityEvents() + { + EditorGUILayout.PropertyField(OnRelease); - base.drawUnityEvents(); - } + base.drawUnityEvents(); + } } -} +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Editor/Gestures/TapGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/TapGestureEditor.cs index 75c018cda..eacfcc60b 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/TapGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/TapGestureEditor.cs @@ -11,73 +11,72 @@ namespace TouchScript.Editor.Gestures [CustomEditor(typeof(TapGesture), true)] internal sealed class TapGestureEditor : GestureEditor { - public static readonly GUIContent TEXT_TIME_LIMIT = new GUIContent("Limit Time (sec)", "Gesture fails if in seconds user didn't do the required number of taps."); - public static readonly GUIContent TEXT_DISTANCE_LIMIT = new GUIContent("Limit Movement (cm)", "Gesture fails if taps are made more than cm away from the first pointer position."); - public static readonly GUIContent TEXT_NUMBER_OF_TAPS_REQUIRED = new GUIContent("Number of Taps Required", "Number of taps required for this gesture to be recognized."); - public static readonly GUIContent TEXT_COMBINE_POINTERS = new GUIContent("Combine Pointers", "When several fingers are used to perform a tap, pointers released not earlier than seconds ago are used to calculate gesture's final screen position."); - public static readonly GUIContent TEXT_COMBINE_TOUCH_POINTERS = new GUIContent("Combine Interval (sec)", TEXT_COMBINE_POINTERS.tooltip); + public static readonly GUIContent TEXT_TIME_LIMIT = new GUIContent("Limit Time (sec)", "Gesture fails if in seconds user didn't do the required number of taps."); + public static readonly GUIContent TEXT_DISTANCE_LIMIT = new GUIContent("Limit Movement (cm)", "Gesture fails if taps are made more than cm away from the first pointer position."); + public static readonly GUIContent TEXT_NUMBER_OF_TAPS_REQUIRED = new GUIContent("Number of Taps Required", "Number of taps required for this gesture to be recognized."); + public static readonly GUIContent TEXT_COMBINE_POINTERS = new GUIContent("Combine Pointers", "When several fingers are used to perform a tap, pointers released not earlier than seconds ago are used to calculate gesture's final screen position."); + public static readonly GUIContent TEXT_COMBINE_TOUCH_POINTERS = new GUIContent("Combine Interval (sec)", TEXT_COMBINE_POINTERS.tooltip); - public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a gesture when this GameObject is tapped."); + public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a gesture when this GameObject is tapped."); - private SerializedProperty numberOfTapsRequired, distanceLimit, timeLimit, combinePointers, combinePointersInterval; - private SerializedProperty OnTap; + private SerializedProperty numberOfTapsRequired, distanceLimit, timeLimit, combinePointers, combinePointersInterval; + private SerializedProperty OnTap; protected override void OnEnable() { numberOfTapsRequired = serializedObject.FindProperty("numberOfTapsRequired"); timeLimit = serializedObject.FindProperty("timeLimit"); distanceLimit = serializedObject.FindProperty("distanceLimit"); - combinePointers = serializedObject.FindProperty("combinePointers"); - combinePointersInterval = serializedObject.FindProperty("combinePointersInterval"); + combinePointers = serializedObject.FindProperty("combinePointers"); + combinePointersInterval = serializedObject.FindProperty("combinePointersInterval"); - OnTap = serializedObject.FindProperty("OnTap"); + OnTap = serializedObject.FindProperty("OnTap"); - base.OnEnable(); + base.OnEnable(); } protected override void drawBasic() { - EditorGUIUtility.labelWidth = 180; - EditorGUILayout.IntPopup(numberOfTapsRequired, new[] { new GUIContent("One"), new GUIContent("Two"), new GUIContent("Three") }, new[] { 1, 2, 3 }, TEXT_NUMBER_OF_TAPS_REQUIRED, GUILayout.ExpandWidth(true)); - } + EditorGUIUtility.labelWidth = 180; + EditorGUILayout.IntPopup(numberOfTapsRequired, new[] {new GUIContent("One"), new GUIContent("Two"), new GUIContent("Three")}, new[] {1, 2, 3}, TEXT_NUMBER_OF_TAPS_REQUIRED, GUILayout.ExpandWidth(true)); + } protected override GUIContent getHelpText() { return TEXT_HELP; } - protected override void drawGeneral() - { - EditorGUIUtility.labelWidth = 180; - EditorGUILayout.IntPopup(numberOfTapsRequired, new[] {new GUIContent("One"), new GUIContent("Two"), new GUIContent("Three")}, new[] {1, 2, 3}, TEXT_NUMBER_OF_TAPS_REQUIRED, GUILayout.ExpandWidth(true)); - EditorGUILayout.PropertyField(combinePointers, TEXT_COMBINE_POINTERS); - if (combinePointers.boolValue) - { - EditorGUIUtility.labelWidth = 160; - EditorGUILayout.BeginHorizontal(); - GUILayout.Label(GUIContent.none, GUILayout.Width(10)); - EditorGUILayout.BeginVertical(GUILayout.ExpandWidth(true)); - EditorGUILayout.PropertyField(combinePointersInterval, TEXT_COMBINE_TOUCH_POINTERS); - EditorGUILayout.EndVertical(); - EditorGUILayout.EndHorizontal(); - } - base.drawGeneral (); - } + protected override void drawGeneral() + { + EditorGUIUtility.labelWidth = 180; + EditorGUILayout.IntPopup(numberOfTapsRequired, new[] {new GUIContent("One"), new GUIContent("Two"), new GUIContent("Three")}, new[] {1, 2, 3}, TEXT_NUMBER_OF_TAPS_REQUIRED, GUILayout.ExpandWidth(true)); + EditorGUILayout.PropertyField(combinePointers, TEXT_COMBINE_POINTERS); + if (combinePointers.boolValue) + { + EditorGUIUtility.labelWidth = 160; + EditorGUILayout.BeginHorizontal(); + GUILayout.Label(GUIContent.none, GUILayout.Width(10)); + EditorGUILayout.BeginVertical(GUILayout.ExpandWidth(true)); + EditorGUILayout.PropertyField(combinePointersInterval, TEXT_COMBINE_TOUCH_POINTERS); + EditorGUILayout.EndVertical(); + EditorGUILayout.EndHorizontal(); + } + base.drawGeneral(); + } - protected override void drawLimits() + protected override void drawLimits() { EditorGUILayout.PropertyField(timeLimit, TEXT_TIME_LIMIT); EditorGUILayout.PropertyField(distanceLimit, TEXT_DISTANCE_LIMIT); - base.drawLimits(); + base.drawLimits(); } - protected override void drawUnityEvents() - { - EditorGUILayout.PropertyField(OnTap); - - base.drawUnityEvents(); - } + protected override void drawUnityEvents() + { + EditorGUILayout.PropertyField(OnTap); + base.drawUnityEvents(); + } } -} +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/OnePointTransformGestureBaseEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/OnePointTransformGestureBaseEditor.cs index 650b93783..b2016ecfd 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/OnePointTransformGestureBaseEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/OnePointTransformGestureBaseEditor.cs @@ -8,53 +8,51 @@ namespace TouchScript.Editor.Gestures.TransformGestures.Base { - internal class OnePointTransformGestureBaseEditor : TransformGestureBaseEditor + internal class OnePointTransformGestureBaseEditor : TransformGestureBaseEditor { - protected override void drawBasic() { - var typeValue = type.intValue; - int newType = 0; - EditorGUILayout.LabelField(TEXT_TYPE); + var typeValue = type.intValue; + int newType = 0; + EditorGUILayout.LabelField(TEXT_TYPE); - var rect = GUILayoutUtility.GetRect(0, 20, GUILayout.ExpandWidth(true)); - rect.x += 10; - rect.width = 70; - if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_ROTATION, - (typeValue & (int)TransformGesture.TransformType.Rotation) != 0)) - newType |= (int)TransformGesture.TransformType.Rotation; - rect.x += rect.width; - if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_SCALING, - (typeValue & (int)TransformGesture.TransformType.Scaling) != 0)) - newType |= (int)TransformGesture.TransformType.Scaling; - type.intValue = newType; + var rect = GUILayoutUtility.GetRect(0, 20, GUILayout.ExpandWidth(true)); + rect.x += 10; + rect.width = 70; + if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_ROTATION, + (typeValue & (int) TransformGesture.TransformType.Rotation) != 0)) + newType |= (int) TransformGesture.TransformType.Rotation; + rect.x += rect.width; + if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_SCALING, + (typeValue & (int) TransformGesture.TransformType.Scaling) != 0)) + newType |= (int) TransformGesture.TransformType.Scaling; + type.intValue = newType; } - protected override void drawGeneral() + protected override void drawGeneral() { var typeValue = type.intValue; int newType = 0; EditorGUILayout.LabelField(TEXT_TYPE); EditorGUI.indentLevel--; - var rect = GUILayoutUtility.GetRect(0, 20, GUILayout.ExpandWidth(true)); - rect.x += 26; - rect.width = 70; - if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_ROTATION, - (typeValue & (int)TransformGesture.TransformType.Rotation) != 0)) - newType |= (int)TransformGesture.TransformType.Rotation; - rect.x += rect.width; - if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_SCALING, - (typeValue & (int)TransformGesture.TransformType.Scaling) != 0)) - newType |= (int)TransformGesture.TransformType.Scaling; - type.intValue = newType; - EditorGUI.indentLevel++; - - EditorGUIUtility.labelWidth = 160; - EditorGUILayout.PropertyField(screenTransformThreshold, TEXT_SCREEN_TRANSFORM_THRESHOLD); - - base.drawGeneral(); + var rect = GUILayoutUtility.GetRect(0, 20, GUILayout.ExpandWidth(true)); + rect.x += 26; + rect.width = 70; + if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_ROTATION, + (typeValue & (int) TransformGesture.TransformType.Rotation) != 0)) + newType |= (int) TransformGesture.TransformType.Rotation; + rect.x += rect.width; + if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_SCALING, + (typeValue & (int) TransformGesture.TransformType.Scaling) != 0)) + newType |= (int) TransformGesture.TransformType.Scaling; + type.intValue = newType; + EditorGUI.indentLevel++; + + EditorGUIUtility.labelWidth = 160; + EditorGUILayout.PropertyField(screenTransformThreshold, TEXT_SCREEN_TRANSFORM_THRESHOLD); + + base.drawGeneral(); } - } -} +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/TransformGestureBaseEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/TransformGestureBaseEditor.cs index e493a1d01..fec57b9a4 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/TransformGestureBaseEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/TransformGestureBaseEditor.cs @@ -9,134 +9,133 @@ namespace TouchScript.Editor.Gestures.TransformGestures.Base { - internal class TransformGestureBaseEditor : GestureEditor - { - public static readonly GUIContent TEXT_PROJECTION_HEADER = new GUIContent("Projection", "Screen to 3D object projection parameters."); - - - public static readonly GUIContent TEXT_TYPE = new GUIContent("Transform Type", "Specifies what gestures should be detected: Translation, Rotation, Scaling."); - public static readonly GUIContent TEXT_TYPE_TRANSLATION = new GUIContent("Translation", "Dragging with one ore more fingers."); - public static readonly GUIContent TEXT_TYPE_ROTATION = new GUIContent("Rotation", "Rotating with two or more fingers."); - public static readonly GUIContent TEXT_TYPE_SCALING = new GUIContent("Scaling", "Scaling with two or more fingers."); - public static readonly GUIContent TEXT_MIN_SCREEN_POINTS_DISTANCE = new GUIContent("Min Points Distance (cm)", "Minimum distance between two pointers (clusters) in cm to consider this gesture started. Used to prevent fake pointers spawned near real ones on cheap multitouch hardware to mess everything up."); - public static readonly GUIContent TEXT_SCREEN_TRANSFORM_THRESHOLD = new GUIContent("Movement Threshold (cm)", "Minimum distance in cm pointers must move for the gesture to begin."); - - public static readonly GUIContent TEXT_PROJECTION = new GUIContent("Projection Type", "Method used to project 2d screen positions of pointers into 3d space."); + internal class TransformGestureBaseEditor : GestureEditor + { + public static readonly GUIContent TEXT_PROJECTION_HEADER = new GUIContent("Projection", "Screen to 3D object projection parameters."); + + public static readonly GUIContent TEXT_TYPE = new GUIContent("Transform Type", "Specifies what gestures should be detected: Translation, Rotation, Scaling."); + public static readonly GUIContent TEXT_TYPE_TRANSLATION = new GUIContent("Translation", "Dragging with one ore more fingers."); + public static readonly GUIContent TEXT_TYPE_ROTATION = new GUIContent("Rotation", "Rotating with two or more fingers."); + public static readonly GUIContent TEXT_TYPE_SCALING = new GUIContent("Scaling", "Scaling with two or more fingers."); + public static readonly GUIContent TEXT_MIN_SCREEN_POINTS_DISTANCE = new GUIContent("Min Points Distance (cm)", "Minimum distance between two pointers (clusters) in cm to consider this gesture started. Used to prevent fake pointers spawned near real ones on cheap multitouch hardware to mess everything up."); + public static readonly GUIContent TEXT_SCREEN_TRANSFORM_THRESHOLD = new GUIContent("Movement Threshold (cm)", "Minimum distance in cm pointers must move for the gesture to begin."); + + public static readonly GUIContent TEXT_PROJECTION = new GUIContent("Projection Type", "Method used to project 2d screen positions of pointers into 3d space."); public static readonly GUIContent TEXT_PROJECTION_LAYER = new GUIContent("Transform plane is parallel to the camera."); public static readonly GUIContent TEXT_PROJECTION_OBJECT = new GUIContent("Transform plane is relative to the object."); public static readonly GUIContent TEXT_PROJECTION_GLOBAL = new GUIContent("Transform plane is relative to the world."); - public static readonly GUIContent TEXT_PROJECTION_NORMAL = new GUIContent("Projection Normal", "Normal of the plane in 3d space where pointers' positions are projected."); + public static readonly GUIContent TEXT_PROJECTION_NORMAL = new GUIContent("Projection Normal", "Normal of the plane in 3d space where pointers' positions are projected."); - protected SerializedProperty type, minScreenPointsDistance, screenTransformThreshold; - protected SerializedProperty OnTransformStart, OnTransform, OnTransformComplete; + protected SerializedProperty type, minScreenPointsDistance, screenTransformThreshold; + protected SerializedProperty OnTransformStart, OnTransform, OnTransformComplete; - public SerializedProperty projection, projectionPlaneNormal; - public SerializedProperty projectionProps; + public SerializedProperty projection, projectionPlaneNormal; + public SerializedProperty projectionProps; - private Texture2D xy, xz, yz, unknown, selector; - private Color selectorColor = new Color(1, 1, 1, .05f); - private Color selectorColorSelected = new Color(1, 1, 1, .9f); + private Texture2D xy, xz, yz, unknown, selector; + private Color selectorColor = new Color(1, 1, 1, .05f); + private Color selectorColorSelected = new Color(1, 1, 1, .9f); protected bool customProjection = false; - protected override void OnEnable() - { - type = serializedObject.FindProperty("type"); - minScreenPointsDistance = serializedObject.FindProperty("minScreenPointsDistance"); - screenTransformThreshold = serializedObject.FindProperty("screenTransformThreshold"); - OnTransformStart = serializedObject.FindProperty("OnTransformStart"); - OnTransform = serializedObject.FindProperty("OnTransform"); - OnTransformComplete = serializedObject.FindProperty("OnTransformComplete"); - - projection = serializedObject.FindProperty("projection"); - projectionPlaneNormal = serializedObject.FindProperty("projectionPlaneNormal"); - projectionProps = serializedObject.FindProperty("projectionProps"); - - xy = EditorResources.Load("Icons/xy.png"); - xz = EditorResources.Load("Icons/xz.png"); - yz = EditorResources.Load("Icons/yz.png"); - unknown = EditorResources.Load("Icons/unknown.png"); - selector = EditorResources.Load("Icons/selector.png"); - - base.OnEnable(); - } - - protected override void drawUnityEvents () - { - EditorGUILayout.PropertyField(OnTransformStart); - EditorGUILayout.PropertyField(OnTransform); - EditorGUILayout.PropertyField(OnTransformComplete); - - base.drawUnityEvents (); - } + protected override void OnEnable() + { + type = serializedObject.FindProperty("type"); + minScreenPointsDistance = serializedObject.FindProperty("minScreenPointsDistance"); + screenTransformThreshold = serializedObject.FindProperty("screenTransformThreshold"); + OnTransformStart = serializedObject.FindProperty("OnTransformStart"); + OnTransform = serializedObject.FindProperty("OnTransform"); + OnTransformComplete = serializedObject.FindProperty("OnTransformComplete"); + + projection = serializedObject.FindProperty("projection"); + projectionPlaneNormal = serializedObject.FindProperty("projectionPlaneNormal"); + projectionProps = serializedObject.FindProperty("projectionProps"); + + xy = EditorResources.Load("Icons/xy.png"); + xz = EditorResources.Load("Icons/xz.png"); + yz = EditorResources.Load("Icons/yz.png"); + unknown = EditorResources.Load("Icons/unknown.png"); + selector = EditorResources.Load("Icons/selector.png"); + + base.OnEnable(); + } + + protected override void drawUnityEvents() + { + EditorGUILayout.PropertyField(OnTransformStart); + EditorGUILayout.PropertyField(OnTransform); + EditorGUILayout.PropertyField(OnTransformComplete); + + base.drawUnityEvents(); + } protected void initCustomProjection() { - var v = projectionPlaneNormal.vector3Value; - customProjection = !(v == Vector3.up || v == Vector3.right || v == Vector3.forward); + var v = projectionPlaneNormal.vector3Value; + customProjection = !(v == Vector3.up || v == Vector3.right || v == Vector3.forward); } protected bool drawProjection(bool custom) { - EditorGUILayout.PropertyField(projection, TEXT_PROJECTION); - switch (projection.enumValueIndex) - { - case (int)TransformGesture.ProjectionType.Layer: + EditorGUILayout.PropertyField(projection, TEXT_PROJECTION); + switch (projection.enumValueIndex) + { + case (int) TransformGesture.ProjectionType.Layer: EditorGUILayout.LabelField(TEXT_PROJECTION_LAYER, GUIElements.HelpBox); - break; - case (int)TransformGesture.ProjectionType.Object: + break; + case (int) TransformGesture.ProjectionType.Object: EditorGUILayout.LabelField(TEXT_PROJECTION_OBJECT, GUIElements.HelpBox); - break; - case (int)TransformGesture.ProjectionType.Global: + break; + case (int) TransformGesture.ProjectionType.Global: EditorGUILayout.LabelField(TEXT_PROJECTION_GLOBAL, GUIElements.HelpBox); - break; - } - - if (projection.enumValueIndex != (int)TransformGesture.ProjectionType.Layer) - { - var v = projectionPlaneNormal.vector3Value; + break; + } + + if (projection.enumValueIndex != (int) TransformGesture.ProjectionType.Layer) + { + var v = projectionPlaneNormal.vector3Value; var rect = GUILayoutUtility.GetRect(0, 35, GUILayout.ExpandWidth(true)); - rect.width = 44; - rect.x += 10; - GUI.DrawTexture(rect, yz); - if (drawSelector(rect, !custom && v == Vector3.right)) + rect.width = 44; + rect.x += 10; + GUI.DrawTexture(rect, yz); + if (drawSelector(rect, !custom && v == Vector3.right)) { projectionPlaneNormal.vector3Value = Vector3.right; custom = false; } - rect.x += rect.width + 5; - GUI.DrawTexture(rect, xz); + rect.x += rect.width + 5; + GUI.DrawTexture(rect, xz); if (drawSelector(rect, !custom && v == Vector3.up)) { projectionPlaneNormal.vector3Value = Vector3.up; custom = false; } - rect.x += rect.width + 5; - GUI.DrawTexture(rect, xy); + rect.x += rect.width + 5; + GUI.DrawTexture(rect, xy); if (drawSelector(rect, !custom && v == Vector3.forward)) { projectionPlaneNormal.vector3Value = Vector3.forward; custom = false; } - rect.x += rect.width + 10; - GUI.DrawTexture(rect, unknown); + rect.x += rect.width + 10; + GUI.DrawTexture(rect, unknown); if (drawSelector(rect, custom)) custom = true; if (custom) EditorGUILayout.PropertyField(projectionPlaneNormal, TEXT_PROJECTION_NORMAL); - } + } return custom; } - protected bool drawSelector(Rect rect, bool selected) - { - GUI.color = selected ? selectorColorSelected : selectorColor; - GUI.DrawTexture(rect, selector); - GUI.color = Color.white; + protected bool drawSelector(Rect rect, bool selected) + { + GUI.color = selected ? selectorColorSelected : selectorColor; + GUI.DrawTexture(rect, selector); + GUI.color = Color.white; if (Event.current.type == EventType.MouseUp && rect.Contains(Event.current.mousePosition)) { @@ -144,8 +143,6 @@ protected bool drawSelector(Rect rect, bool selected) return true; } return false; - } - - } -} - + } + } +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/TwoPointTransformGestureBaseEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/TwoPointTransformGestureBaseEditor.cs index e49e978e5..4cb6492f4 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/TwoPointTransformGestureBaseEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/TwoPointTransformGestureBaseEditor.cs @@ -8,64 +8,63 @@ namespace TouchScript.Editor.Gestures.TransformGestures.Base { - internal class TwoPointTransformGestureBaseEditor : TransformGestureBaseEditor + internal class TwoPointTransformGestureBaseEditor : TransformGestureBaseEditor { - - protected override void drawBasic() - { - var typeValue = type.intValue; - int newType = 0; - EditorGUILayout.LabelField(TEXT_TYPE); + protected override void drawBasic() + { + var typeValue = type.intValue; + int newType = 0; + EditorGUILayout.LabelField(TEXT_TYPE); var rect = GUILayoutUtility.GetRect(0, 20, GUILayout.ExpandWidth(true)); rect.x += 10; rect.width = 90; if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_TRANSLATION, - (typeValue & (int)TransformGesture.TransformType.Translation) != 0)) - newType |= (int)TransformGesture.TransformType.Translation; + (typeValue & (int) TransformGesture.TransformType.Translation) != 0)) + newType |= (int) TransformGesture.TransformType.Translation; rect.x += rect.width; rect.width = 70; if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_ROTATION, - (typeValue & (int)TransformGesture.TransformType.Rotation) != 0)) - newType |= (int)TransformGesture.TransformType.Rotation; + (typeValue & (int) TransformGesture.TransformType.Rotation) != 0)) + newType |= (int) TransformGesture.TransformType.Rotation; rect.x += rect.width; if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_SCALING, - (typeValue & (int)TransformGesture.TransformType.Scaling) != 0)) - newType |= (int)TransformGesture.TransformType.Scaling; + (typeValue & (int) TransformGesture.TransformType.Scaling) != 0)) + newType |= (int) TransformGesture.TransformType.Scaling; type.intValue = newType; - } + } protected override void drawGeneral() { - var typeValue = type.intValue; - int newType = 0; - EditorGUILayout.LabelField(TEXT_TYPE); - EditorGUI.indentLevel--; + var typeValue = type.intValue; + int newType = 0; + EditorGUILayout.LabelField(TEXT_TYPE); + EditorGUI.indentLevel--; - var rect = GUILayoutUtility.GetRect(0, 20, GUILayout.ExpandWidth(true)); - rect.x += 26; - rect.width = 90; - if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_TRANSLATION, - (typeValue & (int)TransformGesture.TransformType.Translation) != 0)) - newType |= (int)TransformGesture.TransformType.Translation; - rect.x += rect.width; - rect.width = 70; - if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_ROTATION, - (typeValue & (int)TransformGesture.TransformType.Rotation) != 0)) - newType |= (int)TransformGesture.TransformType.Rotation; - rect.x += rect.width; - if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_SCALING, - (typeValue & (int)TransformGesture.TransformType.Scaling) != 0)) - newType |= (int)TransformGesture.TransformType.Scaling; - type.intValue = newType; + var rect = GUILayoutUtility.GetRect(0, 20, GUILayout.ExpandWidth(true)); + rect.x += 26; + rect.width = 90; + if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_TRANSLATION, + (typeValue & (int) TransformGesture.TransformType.Translation) != 0)) + newType |= (int) TransformGesture.TransformType.Translation; + rect.x += rect.width; + rect.width = 70; + if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_ROTATION, + (typeValue & (int) TransformGesture.TransformType.Rotation) != 0)) + newType |= (int) TransformGesture.TransformType.Rotation; + rect.x += rect.width; + if (EditorGUI.ToggleLeft(rect, TEXT_TYPE_SCALING, + (typeValue & (int) TransformGesture.TransformType.Scaling) != 0)) + newType |= (int) TransformGesture.TransformType.Scaling; + type.intValue = newType; - EditorGUI.indentLevel++; + EditorGUI.indentLevel++; EditorGUIUtility.labelWidth = 160; EditorGUILayout.PropertyField(minScreenPointsDistance, TEXT_MIN_SCREEN_POINTS_DISTANCE); EditorGUILayout.PropertyField(screenTransformThreshold, TEXT_SCREEN_TRANSFORM_THRESHOLD); - base.drawGeneral(); + base.drawGeneral(); } } -} +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/PinnedTransformGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/PinnedTransformGestureEditor.cs index 56649e5b4..42a21a75a 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/PinnedTransformGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/PinnedTransformGestureEditor.cs @@ -13,39 +13,37 @@ namespace TouchScript.Editor.Gestures.TransformGestures [CustomEditor(typeof(PinnedTransformGesture), true)] internal class PinnedTransformGestureEditor : OnePointTransformGestureBaseEditor { - - public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a combination of rotation and scaling gestures on the GameObject if it was pinned to the world position."); + public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a combination of rotation and scaling gestures on the GameObject if it was pinned to the world position."); protected override void OnEnable() { - base.OnEnable(); + base.OnEnable(); initCustomProjection(); } - protected override void drawBasic() - { - base.drawBasic(); + protected override void drawBasic() + { + base.drawBasic(); customProjection = drawProjection(customProjection); - } - - protected override GUIContent getHelpText() - { - return TEXT_HELP; - } - - protected override void drawOtherGUI() - { - var display = GUIElements.Header(TEXT_PROJECTION_HEADER, projectionProps); - if (display) - { - EditorGUI.indentLevel++; - customProjection = drawProjection(customProjection); - EditorGUILayout.Space(); - EditorGUI.indentLevel--; - } - } + } + + protected override GUIContent getHelpText() + { + return TEXT_HELP; + } + protected override void drawOtherGUI() + { + var display = GUIElements.Header(TEXT_PROJECTION_HEADER, projectionProps); + if (display) + { + EditorGUI.indentLevel++; + customProjection = drawProjection(customProjection); + EditorGUILayout.Space(); + EditorGUI.indentLevel--; + } + } } -} +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/ScreenTransformGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/ScreenTransformGestureEditor.cs index cd1c4bc96..c30fa37f3 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/ScreenTransformGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/ScreenTransformGestureEditor.cs @@ -12,13 +12,11 @@ namespace TouchScript.Editor.Gestures.TransformGestures [CustomEditor(typeof(ScreenTransformGesture), true)] internal class ScreenTransformGestureEditor : TwoPointTransformGestureBaseEditor { + public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a combination of translation, rotation and scaling gestures on the GameObject in screen space."); - public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a combination of translation, rotation and scaling gestures on the GameObject in screen space."); - - protected override GUIContent getHelpText() - { - return TEXT_HELP; - } - - } -} + protected override GUIContent getHelpText() + { + return TEXT_HELP; + } + } +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/TransformGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/TransformGestureEditor.cs index 8ad2620c1..d205e6f0e 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/TransformGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/TransformGestureEditor.cs @@ -13,13 +13,12 @@ namespace TouchScript.Editor.Gestures.TransformGestures [CustomEditor(typeof(TransformGesture), true)] internal class TransformGestureEditor : TwoPointTransformGestureBaseEditor { - - public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a combination of translation, rotation and scaling gestures on the GameObject."); + public static readonly GUIContent TEXT_HELP = new GUIContent("This component recognizes a combination of translation, rotation and scaling gestures on the GameObject."); protected override void OnEnable() { - base.OnEnable(); + base.OnEnable(); initCustomProjection(); } @@ -28,25 +27,24 @@ protected override void drawBasic() { base.drawBasic(); - customProjection = drawProjection(customProjection); + customProjection = drawProjection(customProjection); } - protected override GUIContent getHelpText() - { - return TEXT_HELP; - } + protected override GUIContent getHelpText() + { + return TEXT_HELP; + } - protected override void drawOtherGUI() + protected override void drawOtherGUI() { - var display = GUIElements.Header(TEXT_PROJECTION_HEADER, projectionProps); - if (display) - { - EditorGUI.indentLevel++; - customProjection = drawProjection(customProjection); + var display = GUIElements.Header(TEXT_PROJECTION_HEADER, projectionProps); + if (display) + { + EditorGUI.indentLevel++; + customProjection = drawProjection(customProjection); EditorGUILayout.Space(); - EditorGUI.indentLevel--; - } + EditorGUI.indentLevel--; + } } - } -} +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Editor/InputSources/InputSourceEditor.cs b/Source/Assets/TouchScript/Editor/InputSources/InputSourceEditor.cs index 7cc5c5ee4..030363f56 100644 --- a/Source/Assets/TouchScript/Editor/InputSources/InputSourceEditor.cs +++ b/Source/Assets/TouchScript/Editor/InputSources/InputSourceEditor.cs @@ -10,14 +10,10 @@ namespace TouchScript.Editor.InputSources { public class InputSourceEditor : UnityEditor.Editor { - protected virtual void OnEnable() - { - } + protected virtual void OnEnable() {} - public override void OnInspectorGUI() - { - } + public override void OnInspectorGUI() {} protected virtual void drawAdvanced() {} } -} +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs b/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs index 572d1a8f2..b6cc02970 100644 --- a/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs +++ b/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs @@ -9,28 +9,30 @@ namespace TouchScript.Editor.InputSources { - [CustomEditor(typeof (StandardInput), true)] + [CustomEditor(typeof(StandardInput), true)] internal sealed class StandardInputEditor : InputSourceEditor { - public static readonly GUIContent TEXT_GENERAL_HEADER = new GUIContent("General", "General settings."); - public static readonly GUIContent TEXT_WINDOWS_HEADER = new GUIContent("Windows", "Windows specific settings."); + public static readonly GUIContent TEXT_GENERAL_HEADER = new GUIContent("General", "General settings."); + public static readonly GUIContent TEXT_WINDOWS_HEADER = new GUIContent("Windows", "Windows specific settings."); public static readonly GUIContent TEXT_WEBGL_HEADER = new GUIContent("WebGL", "WebGL specific settings."); public static readonly GUIContent TEXT_EMULATE_MOUSE = new GUIContent("Emulate Second Mouse Pointer", "If selected, you can press ALT to make a stationary mouse pointer. This is used to simulate multi-touch."); - public static readonly GUIContent TEXT_WINDOWS_API = new GUIContent("Select which touch API to use:\n - Windows 8 — new WM_POINTER API,\n - Windows 7 — old WM_TOUCH API,\n - Unity — Unity's WM_TOUCH implementation,\n - None — no touch."); - public static readonly GUIContent TEXT_WINDOWS8 = new GUIContent("Windows 8+ API"); - public static readonly GUIContent TEXT_WINDOWS7 = new GUIContent("Windows 7 API"); - public static readonly GUIContent TEXT_WINDOWS8_MOUSE = new GUIContent("Enable Mouse on Windows 8+"); - public static readonly GUIContent TEXT_WINDOWS7_MOUSE = new GUIContent("Enable Mouse on Windows 7"); - public static readonly GUIContent TEXT_UWP_MOUSE = new GUIContent("Enable Mouse on UWP"); + public static readonly GUIContent TEXT_WINDOWS_API = new GUIContent("Select which touch API to use:\n - Windows 8 — new WM_POINTER API,\n - Windows 7 — old WM_TOUCH API,\n - Unity — Unity's WM_TOUCH implementation,\n - None — no touch."); + public static readonly GUIContent TEXT_WINDOWS8 = new GUIContent("Windows 8+ API"); + public static readonly GUIContent TEXT_WINDOWS7 = new GUIContent("Windows 7 API"); + public static readonly GUIContent TEXT_WINDOWS8_MOUSE = new GUIContent("Enable Mouse on Windows 8+"); + public static readonly GUIContent TEXT_WINDOWS7_MOUSE = new GUIContent("Enable Mouse on Windows 7"); + public static readonly GUIContent TEXT_UWP_MOUSE = new GUIContent("Enable Mouse on UWP"); public static readonly GUIContent TEXT_HELP = new GUIContent("This component gathers input data from various devices like touch, mouse and pen on all platforms."); private SerializedProperty basicEditor; + private SerializedProperty windows8Touch, windows7Touch, webGLTouch, windows8Mouse, - windows7Mouse, universalWindowsMouse, emulateSecondMousePointer; - private SerializedProperty generalProps, windowsProps, webglProps; + windows7Mouse, universalWindowsMouse, emulateSecondMousePointer; + + private SerializedProperty generalProps, windowsProps, webglProps; private StandardInput instance; @@ -48,42 +50,42 @@ protected override void OnEnable() universalWindowsMouse = serializedObject.FindProperty("universalWindowsMouse"); emulateSecondMousePointer = serializedObject.FindProperty("emulateSecondMousePointer"); - generalProps = serializedObject.FindProperty("generalProps"); - windowsProps = serializedObject.FindProperty("windowsProps"); + generalProps = serializedObject.FindProperty("generalProps"); + windowsProps = serializedObject.FindProperty("windowsProps"); webglProps = serializedObject.FindProperty("webglProps"); } public override void OnInspectorGUI() { #if UNITY_5_6_OR_NEWER - serializedObject.UpdateIfRequiredOrScript(); + serializedObject.UpdateIfRequiredOrScript(); #else serializedObject.UpdateIfDirtyOrScript(); #endif - GUILayout.Space(5); + GUILayout.Space(5); - if (basicEditor.boolValue) - { + if (basicEditor.boolValue) + { EditorGUI.BeginChangeCheck(); - EditorGUILayout.PropertyField(emulateSecondMousePointer, TEXT_EMULATE_MOUSE); - if (EditorGUI.EndChangeCheck()) - { - instance.EmulateSecondMousePointer = emulateSecondMousePointer.boolValue; - } - - if (GUIElements.BasicHelpBox(TEXT_HELP)) - { - basicEditor.boolValue = false; - Repaint(); - } - } - else - { - drawGeneral(); - drawWindows(); - drawWebGL(); - } + EditorGUILayout.PropertyField(emulateSecondMousePointer, TEXT_EMULATE_MOUSE); + if (EditorGUI.EndChangeCheck()) + { + instance.EmulateSecondMousePointer = emulateSecondMousePointer.boolValue; + } + + if (GUIElements.BasicHelpBox(TEXT_HELP)) + { + basicEditor.boolValue = false; + Repaint(); + } + } + else + { + drawGeneral(); + drawWindows(); + drawWebGL(); + } serializedObject.ApplyModifiedProperties(); base.OnInspectorGUI(); @@ -91,46 +93,45 @@ public override void OnInspectorGUI() private void drawGeneral() { - var display = GUIElements.Header(TEXT_GENERAL_HEADER, generalProps); - if (display) - { - EditorGUI.indentLevel++; - EditorGUI.BeginChangeCheck(); - EditorGUILayout.PropertyField(emulateSecondMousePointer, TEXT_EMULATE_MOUSE); - if (EditorGUI.EndChangeCheck()) - { - instance.EmulateSecondMousePointer = emulateSecondMousePointer.boolValue; - } - EditorGUI.indentLevel--; - } + var display = GUIElements.Header(TEXT_GENERAL_HEADER, generalProps); + if (display) + { + EditorGUI.indentLevel++; + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(emulateSecondMousePointer, TEXT_EMULATE_MOUSE); + if (EditorGUI.EndChangeCheck()) + { + instance.EmulateSecondMousePointer = emulateSecondMousePointer.boolValue; + } + EditorGUI.indentLevel--; + } } private void drawWindows() { - var display = GUIElements.Header(TEXT_WINDOWS_HEADER, windowsProps); - if (display) - { - EditorGUI.indentLevel++; - EditorGUILayout.PropertyField(windows8Touch, TEXT_WINDOWS8); - EditorGUILayout.PropertyField(windows7Touch, TEXT_WINDOWS7); - EditorGUILayout.LabelField(TEXT_WINDOWS_API, GUIElements.HelpBox); - EditorGUILayout.PropertyField(windows8Mouse, TEXT_WINDOWS8_MOUSE); - EditorGUILayout.PropertyField(windows7Mouse, TEXT_WINDOWS7_MOUSE); - EditorGUILayout.PropertyField(universalWindowsMouse, TEXT_UWP_MOUSE); - EditorGUI.indentLevel--; - } + var display = GUIElements.Header(TEXT_WINDOWS_HEADER, windowsProps); + if (display) + { + EditorGUI.indentLevel++; + EditorGUILayout.PropertyField(windows8Touch, TEXT_WINDOWS8); + EditorGUILayout.PropertyField(windows7Touch, TEXT_WINDOWS7); + EditorGUILayout.LabelField(TEXT_WINDOWS_API, GUIElements.HelpBox); + EditorGUILayout.PropertyField(windows8Mouse, TEXT_WINDOWS8_MOUSE); + EditorGUILayout.PropertyField(windows7Mouse, TEXT_WINDOWS7_MOUSE); + EditorGUILayout.PropertyField(universalWindowsMouse, TEXT_UWP_MOUSE); + EditorGUI.indentLevel--; + } } private void drawWebGL() { - var display = GUIElements.Header(TEXT_WEBGL_HEADER, webglProps); - if (display) - { - EditorGUI.indentLevel++; - EditorGUILayout.PropertyField(webGLTouch); - EditorGUI.indentLevel--; - } + var display = GUIElements.Header(TEXT_WEBGL_HEADER, webglProps); + if (display) + { + EditorGUI.indentLevel++; + EditorGUILayout.PropertyField(webGLTouch); + EditorGUI.indentLevel--; + } } - } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Editor/Layers/FullscreenLayerEditor.cs b/Source/Assets/TouchScript/Editor/Layers/FullscreenLayerEditor.cs index 9f87df0f5..ed516d04f 100644 --- a/Source/Assets/TouchScript/Editor/Layers/FullscreenLayerEditor.cs +++ b/Source/Assets/TouchScript/Editor/Layers/FullscreenLayerEditor.cs @@ -12,10 +12,9 @@ namespace TouchScript.Editor.Layers [CustomEditor(typeof(FullscreenLayer))] internal sealed class FullscreenLayerEditor : UnityEditor.Editor { + public static readonly GUIContent TEXT_HELP = new GUIContent("This component receives all pointers which were not caught by other layers. It sets poitners' Target property to itself, so all fullscreen gestures must be attached to the same GameObject as FullscreenGesture."); - public static readonly GUIContent TEXT_HELP = new GUIContent("This component receives all pointers which were not caught by other layers. It sets poitners' Target property to itself, so all fullscreen gestures must be attached to the same GameObject as FullscreenGesture."); - - private SerializedProperty type, camera; + private SerializedProperty type, camera; private FullscreenLayer instance; private void OnEnable() @@ -34,10 +33,10 @@ public override void OnInspectorGUI() EditorGUILayout.PropertyField(type); if (EditorGUI.EndChangeCheck()) { - instance.Type = (FullscreenLayer.LayerType)type.enumValueIndex; + instance.Type = (FullscreenLayer.LayerType) type.enumValueIndex; } - if (type.enumValueIndex == (int)FullscreenLayer.LayerType.Camera) + if (type.enumValueIndex == (int) FullscreenLayer.LayerType.Camera) { EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(camera); @@ -50,4 +49,4 @@ public override void OnInspectorGUI() EditorGUILayout.LabelField(TEXT_HELP, GUIElements.HelpBox); } } -} +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Editor/Layers/StandardLayerEditor.cs b/Source/Assets/TouchScript/Editor/Layers/StandardLayerEditor.cs index a54b560e6..37406e88e 100644 --- a/Source/Assets/TouchScript/Editor/Layers/StandardLayerEditor.cs +++ b/Source/Assets/TouchScript/Editor/Layers/StandardLayerEditor.cs @@ -12,19 +12,19 @@ namespace TouchScript.Editor.Layers [CustomEditor(typeof(StandardLayer), true)] internal class StandardLayerEditor : UnityEditor.Editor { - public static readonly GUIContent TEXT_ADVANCED_HEADER = new GUIContent("Advanced", "Advanced properties."); - public static readonly GUIContent TEXT_HIT_HEADER = new GUIContent("Hit test options", "Options which control what types of objects this layer should search under pointers."); + public static readonly GUIContent TEXT_ADVANCED_HEADER = new GUIContent("Advanced", "Advanced properties."); + public static readonly GUIContent TEXT_HIT_HEADER = new GUIContent("Hit test options", "Options which control what types of objects this layer should search under pointers."); - public static readonly GUIContent TEXT_3D_OBJECTS = new GUIContent("Hit 3D Objects", "Layer should raycast 3D objects."); - public static readonly GUIContent TEXT_2D_OBJECTS = new GUIContent("Hit 2D Objects", "Layer should raycast 2D objects."); - public static readonly GUIContent TEXT_WORLD_UI = new GUIContent("Hit World UI", "Layer should raycast World Space UI."); - public static readonly GUIContent TEXT_SS_UI = new GUIContent("Hit Screen Space UI", "Layer should raycast Screen Space UI."); - public static readonly GUIContent TEXT_LAYER_MASK = new GUIContent("Layer Mask", "Layer mask."); - public static readonly GUIContent TEXT_HIT_FILTERS = new GUIContent("Use Hit FIlters", "Layer should test for individual HitTest objects."); + public static readonly GUIContent TEXT_3D_OBJECTS = new GUIContent("Hit 3D Objects", "Layer should raycast 3D objects."); + public static readonly GUIContent TEXT_2D_OBJECTS = new GUIContent("Hit 2D Objects", "Layer should raycast 2D objects."); + public static readonly GUIContent TEXT_WORLD_UI = new GUIContent("Hit World UI", "Layer should raycast World Space UI."); + public static readonly GUIContent TEXT_SS_UI = new GUIContent("Hit Screen Space UI", "Layer should raycast Screen Space UI."); + public static readonly GUIContent TEXT_LAYER_MASK = new GUIContent("Layer Mask", "Layer mask."); + public static readonly GUIContent TEXT_HIT_FILTERS = new GUIContent("Use Hit FIlters", "Layer should test for individual HitTest objects."); - public static readonly GUIContent TEXT_HELP = new GUIContent("This component assigns target GameObjects in the scene for pressed pointers."); + public static readonly GUIContent TEXT_HELP = new GUIContent("This component assigns target GameObjects in the scene for pressed pointers."); - private SerializedProperty advancedProps, hitProps; + private SerializedProperty advancedProps, hitProps; private SerializedProperty basicEditor; private SerializedProperty hit3DObjects; private SerializedProperty hit2DObjects; @@ -51,67 +51,66 @@ protected virtual void OnEnable() public override void OnInspectorGUI() { #if UNITY_5_6_OR_NEWER - serializedObject.UpdateIfRequiredOrScript(); + serializedObject.UpdateIfRequiredOrScript(); #else serializedObject.UpdateIfDirtyOrScript(); #endif GUILayout.Space(5); - if (basicEditor.boolValue) - { - drawHit(); - - if (GUIElements.BasicHelpBox(TEXT_HELP)) - { - basicEditor.boolValue = false; - Repaint(); - } - } - else - { + if (basicEditor.boolValue) + { + drawHit(); + + if (GUIElements.BasicHelpBox(TEXT_HELP)) + { + basicEditor.boolValue = false; + Repaint(); + } + } + else + { drawHit(); drawAdvanced(); - } + } serializedObject.ApplyModifiedProperties(); } private void drawHit() { - var display = GUIElements.Header(TEXT_HIT_HEADER, hitProps); - if (display) - { - EditorGUI.indentLevel++; - doDrawHit(); - EditorGUI.indentLevel--; - } + var display = GUIElements.Header(TEXT_HIT_HEADER, hitProps); + if (display) + { + EditorGUI.indentLevel++; + doDrawHit(); + EditorGUI.indentLevel--; + } } protected virtual void doDrawHit() - { - EditorGUILayout.PropertyField(hitScreenSpaceUI, TEXT_SS_UI); - EditorGUILayout.PropertyField(hit3DObjects, TEXT_3D_OBJECTS); - EditorGUILayout.PropertyField(hit2DObjects, TEXT_2D_OBJECTS); - EditorGUILayout.PropertyField(hitWorldSpaceUI, TEXT_WORLD_UI); - EditorGUILayout.PropertyField(layerMask, TEXT_LAYER_MASK); - } + { + EditorGUILayout.PropertyField(hitScreenSpaceUI, TEXT_SS_UI); + EditorGUILayout.PropertyField(hit3DObjects, TEXT_3D_OBJECTS); + EditorGUILayout.PropertyField(hit2DObjects, TEXT_2D_OBJECTS); + EditorGUILayout.PropertyField(hitWorldSpaceUI, TEXT_WORLD_UI); + EditorGUILayout.PropertyField(layerMask, TEXT_LAYER_MASK); + } private void drawAdvanced() { - var display = GUIElements.Header(TEXT_ADVANCED_HEADER, advancedProps); - if (display) - { - EditorGUI.indentLevel++; - doDrawAdvanced(); - EditorGUI.indentLevel--; - } + var display = GUIElements.Header(TEXT_ADVANCED_HEADER, advancedProps); + if (display) + { + EditorGUI.indentLevel++; + doDrawAdvanced(); + EditorGUI.indentLevel--; + } } protected virtual void doDrawAdvanced() { EditorGUILayout.PropertyField(useHitFilters, TEXT_HIT_FILTERS); } - } -} +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs b/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs index a9326d228..b5486f592 100644 --- a/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs +++ b/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs @@ -19,17 +19,17 @@ namespace TouchScript.Editor internal sealed class TouchManagerEditor : UnityEditor.Editor { public static readonly GUIContent TEXT_LAYERS_HELP = new GUIContent("Layers at the top get to process pointer input first."); - public static readonly GUIContent TEXT_LAYERS_HEADER = new GUIContent("Pointer Layers", "Sorted array of Pointer Layers in the scene."); - public static readonly GUIContent TEXT_USE_SEND_MESSAGE_HEADER = new GUIContent("Use SendMessage", "Enables sending events through SendMessage. Warnning: this method is slow!"); - public static readonly GUIContent TEXT_USE_UNITY_EVENTS_HEADER = new GUIContent("Use Unity Events", "Enables sending events through Unity Events."); - public static readonly GUIContent TEXT_DEFAULTS_HEADER = new GUIContent("Defaults", "Default actions when some of TouchScript components are not present in the scene."); - - public static readonly GUIContent TEXT_DEBUG_MODE = new GUIContent("Debug", "Turns on debug mode."); - public static readonly GUIContent TEXT_DISPLAY_DEVICE = new GUIContent("Display Device", "Display device properties where such parameters as target DPI are stored."); - public static readonly GUIContent TEXT_CREATE_CAMERA_LAYER = new GUIContent("Create Camera Layer", "Indicates if TouchScript should create a CameraLayer for you if no layers present in a scene. This is usually a desired behavior but sometimes you would want to turn this off if you are using TouchScript only to get input from some device."); - public static readonly GUIContent TEXT_CREATE_STANDARD_INPUT = new GUIContent("Create Standard Input", ""); - public static readonly GUIContent TEXT_SEND_MESSAGE_TARGET = new GUIContent("Target", "The GameObject target of Unity Messages. If null, host GameObject is used."); - public static readonly GUIContent TEXT_SEND_MESSAGE_EVENTS = new GUIContent("Events", "Which events should be sent as Unity Messages."); + public static readonly GUIContent TEXT_LAYERS_HEADER = new GUIContent("Pointer Layers", "Sorted array of Pointer Layers in the scene."); + public static readonly GUIContent TEXT_USE_SEND_MESSAGE_HEADER = new GUIContent("Use SendMessage", "Enables sending events through SendMessage. Warnning: this method is slow!"); + public static readonly GUIContent TEXT_USE_UNITY_EVENTS_HEADER = new GUIContent("Use Unity Events", "Enables sending events through Unity Events."); + public static readonly GUIContent TEXT_DEFAULTS_HEADER = new GUIContent("Defaults", "Default actions when some of TouchScript components are not present in the scene."); + + public static readonly GUIContent TEXT_DEBUG_MODE = new GUIContent("Debug", "Turns on debug mode."); + public static readonly GUIContent TEXT_DISPLAY_DEVICE = new GUIContent("Display Device", "Display device properties where such parameters as target DPI are stored."); + public static readonly GUIContent TEXT_CREATE_CAMERA_LAYER = new GUIContent("Create Camera Layer", "Indicates if TouchScript should create a CameraLayer for you if no layers present in a scene. This is usually a desired behavior but sometimes you would want to turn this off if you are using TouchScript only to get input from some device."); + public static readonly GUIContent TEXT_CREATE_STANDARD_INPUT = new GUIContent("Create Standard Input", ""); + public static readonly GUIContent TEXT_SEND_MESSAGE_TARGET = new GUIContent("Target", "The GameObject target of Unity Messages. If null, host GameObject is used."); + public static readonly GUIContent TEXT_SEND_MESSAGE_EVENTS = new GUIContent("Events", "Which events should be sent as Unity Messages."); public static readonly GUIContent TEXT_HELP = new GUIContent("This component holds TouchScript configuration options for a scene."); @@ -37,11 +37,14 @@ internal sealed class TouchManagerEditor : UnityEditor.Editor private ReorderableList layersList; private SerializedProperty basicEditor; private SerializedProperty debugMode; - private SerializedProperty layers, displayDevice, shouldCreateCameraLayer, shouldCreateStandardInput, - useSendMessage, sendMessageTarget, sendMessageEvents; - private SerializedProperty OnFrameStart, OnFrameFinish, OnPointersAdd, OnPointersUpdate, OnPointersPress, - OnPointersRelease, OnPointersRemove, OnPointersCancel, useUnityEvents; - private PropertyInfo useUnityEvents_prop, useSendMessage_prop; + + private SerializedProperty layers, displayDevice, shouldCreateCameraLayer, shouldCreateStandardInput, + useSendMessage, sendMessageTarget, sendMessageEvents; + + private SerializedProperty OnFrameStart, OnFrameFinish, OnPointersAdd, OnPointersUpdate, OnPointersPress, + OnPointersRelease, OnPointersRemove, OnPointersCancel, useUnityEvents; + + private PropertyInfo useUnityEvents_prop, useSendMessage_prop; private void OnEnable() { @@ -59,24 +62,24 @@ private void OnEnable() sendMessageEvents = serializedObject.FindProperty("sendMessageEvents"); useUnityEvents = serializedObject.FindProperty("useUnityEvents"); - OnFrameStart = serializedObject.FindProperty("OnFrameStart"); - OnFrameFinish = serializedObject.FindProperty("OnFrameFinish"); - OnPointersAdd = serializedObject.FindProperty("OnPointersAdd"); - OnPointersUpdate = serializedObject.FindProperty("OnPointersUpdate"); - OnPointersPress = serializedObject.FindProperty("OnPointersPress"); - OnPointersRelease = serializedObject.FindProperty("OnPointersRelease"); - OnPointersRemove = serializedObject.FindProperty("OnPointersRemove"); - OnPointersCancel = serializedObject.FindProperty("OnPointersCancel"); - - var type = instance.GetType(); - useUnityEvents_prop = type.GetProperty("UseUnityEvents", BindingFlags.Instance | BindingFlags.Public); - useSendMessage_prop = type.GetProperty("UseSendMessage", BindingFlags.Instance | BindingFlags.Public); + OnFrameStart = serializedObject.FindProperty("OnFrameStart"); + OnFrameFinish = serializedObject.FindProperty("OnFrameFinish"); + OnPointersAdd = serializedObject.FindProperty("OnPointersAdd"); + OnPointersUpdate = serializedObject.FindProperty("OnPointersUpdate"); + OnPointersPress = serializedObject.FindProperty("OnPointersPress"); + OnPointersRelease = serializedObject.FindProperty("OnPointersRelease"); + OnPointersRemove = serializedObject.FindProperty("OnPointersRemove"); + OnPointersCancel = serializedObject.FindProperty("OnPointersCancel"); + + var type = instance.GetType(); + useUnityEvents_prop = type.GetProperty("UseUnityEvents", BindingFlags.Instance | BindingFlags.Public); + useSendMessage_prop = type.GetProperty("UseSendMessage", BindingFlags.Instance | BindingFlags.Public); refresh(); layersList = new ReorderableList(serializedObject, layers, true, false, false, false); - layersList.headerHeight = 0; - layersList.footerHeight = 0; + layersList.headerHeight = 0; + layersList.footerHeight = 0; layersList.drawElementCallback += (rect, index, active, focused) => { rect.height = 16; @@ -95,12 +98,12 @@ private void OnEnable() public override void OnInspectorGUI() { #if UNITY_5_6_OR_NEWER - serializedObject.UpdateIfRequiredOrScript(); + serializedObject.UpdateIfRequiredOrScript(); #else serializedObject.UpdateIfDirtyOrScript(); #endif - GUILayout.Space(5); + GUILayout.Space(5); if (basicEditor.boolValue) { @@ -121,99 +124,99 @@ public override void OnInspectorGUI() drawDebug(); } - GUILayout.Label("v. " + TouchManager.VERSION + (string.IsNullOrEmpty(TouchManager.VERSION_SUFFIX) ? "" : " " + TouchManager.VERSION_SUFFIX), GUIElements.SmallTextRight); + GUILayout.Label("v. " + TouchManager.VERSION + (string.IsNullOrEmpty(TouchManager.VERSION_SUFFIX) ? "" : " " + TouchManager.VERSION_SUFFIX), GUIElements.SmallTextRight); serializedObject.ApplyModifiedProperties(); } private void drawDefaults() { - var display = GUIElements.Header(TEXT_DEFAULTS_HEADER, shouldCreateCameraLayer); - if (display) - { - EditorGUI.indentLevel++; - using (new EditorGUI.DisabledGroupScope(Application.isPlaying)) - { - EditorGUILayout.PropertyField(shouldCreateCameraLayer, TEXT_CREATE_CAMERA_LAYER); - EditorGUILayout.PropertyField(shouldCreateStandardInput, TEXT_CREATE_STANDARD_INPUT); - } - - var r = EditorGUILayout.GetControlRect(true, 16f, EditorStyles.objectField); - var label = EditorGUI.BeginProperty(r, TEXT_DISPLAY_DEVICE, displayDevice); - EditorGUI.BeginChangeCheck(); - r = EditorGUI.PrefixLabel(r, label); - var newDevice = EditorGUI.ObjectField(r, instance.DisplayDevice as Object, typeof(IDisplayDevice), true) as IDisplayDevice; - if (EditorGUI.EndChangeCheck()) - { - instance.DisplayDevice = newDevice; - EditorUtility.SetDirty(instance); - } - EditorGUI.EndProperty(); - - EditorGUI.indentLevel--; - } + var display = GUIElements.Header(TEXT_DEFAULTS_HEADER, shouldCreateCameraLayer); + if (display) + { + EditorGUI.indentLevel++; + using (new EditorGUI.DisabledGroupScope(Application.isPlaying)) + { + EditorGUILayout.PropertyField(shouldCreateCameraLayer, TEXT_CREATE_CAMERA_LAYER); + EditorGUILayout.PropertyField(shouldCreateStandardInput, TEXT_CREATE_STANDARD_INPUT); + } + + var r = EditorGUILayout.GetControlRect(true, 16f, EditorStyles.objectField); + var label = EditorGUI.BeginProperty(r, TEXT_DISPLAY_DEVICE, displayDevice); + EditorGUI.BeginChangeCheck(); + r = EditorGUI.PrefixLabel(r, label); + var newDevice = EditorGUI.ObjectField(r, instance.DisplayDevice as Object, typeof(IDisplayDevice), true) as IDisplayDevice; + if (EditorGUI.EndChangeCheck()) + { + instance.DisplayDevice = newDevice; + EditorUtility.SetDirty(instance); + } + EditorGUI.EndProperty(); + + EditorGUI.indentLevel--; + } } private void drawLayers() { - var display = GUIElements.Header(TEXT_LAYERS_HEADER, layers); - if (display) - { + var display = GUIElements.Header(TEXT_LAYERS_HEADER, layers); + if (display) + { EditorGUILayout.LabelField(TEXT_LAYERS_HELP, GUIElements.HelpBox); - EditorGUI.indentLevel++; - using (new EditorGUI.DisabledGroupScope(Application.isPlaying)) - { - layersList.DoLayoutList(); - } - EditorGUI.indentLevel--; - } - } + EditorGUI.indentLevel++; + using (new EditorGUI.DisabledGroupScope(Application.isPlaying)) + { + layersList.DoLayoutList(); + } + EditorGUI.indentLevel--; + } + } private void drawUnityEvents() { - var display = GUIElements.Header(TEXT_USE_UNITY_EVENTS_HEADER, useUnityEvents, useUnityEvents, useUnityEvents_prop); - if (display) - { - EditorGUI.indentLevel++; - using (new EditorGUI.DisabledGroupScope(!useUnityEvents.boolValue)) - { - EditorGUILayout.PropertyField(OnFrameStart); - EditorGUILayout.PropertyField(OnFrameFinish); - EditorGUILayout.PropertyField(OnPointersAdd); - EditorGUILayout.PropertyField(OnPointersUpdate); - EditorGUILayout.PropertyField(OnPointersPress); - EditorGUILayout.PropertyField(OnPointersRelease); - EditorGUILayout.PropertyField(OnPointersRemove); - EditorGUILayout.PropertyField(OnPointersCancel); - } - EditorGUI.indentLevel--; - } + var display = GUIElements.Header(TEXT_USE_UNITY_EVENTS_HEADER, useUnityEvents, useUnityEvents, useUnityEvents_prop); + if (display) + { + EditorGUI.indentLevel++; + using (new EditorGUI.DisabledGroupScope(!useUnityEvents.boolValue)) + { + EditorGUILayout.PropertyField(OnFrameStart); + EditorGUILayout.PropertyField(OnFrameFinish); + EditorGUILayout.PropertyField(OnPointersAdd); + EditorGUILayout.PropertyField(OnPointersUpdate); + EditorGUILayout.PropertyField(OnPointersPress); + EditorGUILayout.PropertyField(OnPointersRelease); + EditorGUILayout.PropertyField(OnPointersRemove); + EditorGUILayout.PropertyField(OnPointersCancel); + } + EditorGUI.indentLevel--; + } } private void drawSendMessage() { - var display = GUIElements.Header(TEXT_USE_SEND_MESSAGE_HEADER, useSendMessage, useSendMessage, useSendMessage_prop); - if (display) - { - EditorGUI.indentLevel++; - using (new EditorGUI.DisabledGroupScope(!useSendMessage.boolValue)) - { - EditorGUILayout.PropertyField(sendMessageTarget, TEXT_SEND_MESSAGE_TARGET); - - var r = EditorGUILayout.GetControlRect(true, 16f, EditorStyles.layerMaskField); - var label = EditorGUI.BeginProperty(r, TEXT_SEND_MESSAGE_EVENTS, sendMessageEvents); - EditorGUI.BeginChangeCheck(); - r = EditorGUI.PrefixLabel(r, label); - var sMask = (TouchManager.MessageType)EditorGUI.EnumMaskField(r, instance.SendMessageEvents); - if (EditorGUI.EndChangeCheck()) - { - instance.SendMessageEvents = sMask; - EditorUtility.SetDirty(instance); - } - EditorGUI.EndProperty(); - } - EditorGUI.indentLevel--; - } + var display = GUIElements.Header(TEXT_USE_SEND_MESSAGE_HEADER, useSendMessage, useSendMessage, useSendMessage_prop); + if (display) + { + EditorGUI.indentLevel++; + using (new EditorGUI.DisabledGroupScope(!useSendMessage.boolValue)) + { + EditorGUILayout.PropertyField(sendMessageTarget, TEXT_SEND_MESSAGE_TARGET); + + var r = EditorGUILayout.GetControlRect(true, 16f, EditorStyles.layerMaskField); + var label = EditorGUI.BeginProperty(r, TEXT_SEND_MESSAGE_EVENTS, sendMessageEvents); + EditorGUI.BeginChangeCheck(); + r = EditorGUI.PrefixLabel(r, label); + var sMask = (TouchManager.MessageType) EditorGUI.EnumMaskField(r, instance.SendMessageEvents); + if (EditorGUI.EndChangeCheck()) + { + instance.SendMessageEvents = sMask; + EditorUtility.SetDirty(instance); + } + EditorGUI.EndProperty(); + } + EditorGUI.indentLevel--; + } } private void drawDebug() @@ -230,15 +233,15 @@ private void refresh() { layers.arraySize = 0; LayerManager.Instance.ForEach((l) => - { - layers.arraySize++; - layers.GetArrayElementAtIndex(layers.arraySize - 1).objectReferenceValue = l; - return true; - }); + { + layers.arraySize++; + layers.GetArrayElementAtIndex(layers.arraySize - 1).objectReferenceValue = l; + return true; + }); } else { - var allLayers = FindObjectsOfType(typeof (TouchLayer)).Cast().ToList(); + var allLayers = FindObjectsOfType(typeof(TouchLayer)).Cast().ToList(); var toRemove = new List(); for (var i = 0; i < layers.arraySize; i++) { diff --git a/Source/Assets/TouchScript/Editor/TouchScriptSettingsWindow.cs b/Source/Assets/TouchScript/Editor/TouchScriptSettingsWindow.cs index 0afdc12a7..8645a087b 100644 --- a/Source/Assets/TouchScript/Editor/TouchScriptSettingsWindow.cs +++ b/Source/Assets/TouchScript/Editor/TouchScriptSettingsWindow.cs @@ -8,30 +8,28 @@ namespace TouchScript.Editor { - - [InitializeOnLoad] + [InitializeOnLoad] class TouchScriptSettingsWindow : EditorWindow { - private const string SHOW_AT_STARTUP = "TouchScript.ShowSettingsOnStartup"; - private const string DEFINE_DEBUG = "TOUCHSCRIPT_DEBUG"; - private const string DEFINE_TUIO = "TOUCHSCRIPT_TUIO"; + private const string DEFINE_DEBUG = "TOUCHSCRIPT_DEBUG"; + private const string DEFINE_TUIO = "TOUCHSCRIPT_TUIO"; private static bool showAtStartup = true; - private static TouchScriptSettingsWindowSO so; + private static TouchScriptSettingsWindowSO so; - private static bool initialized; - private static int width = 500; - private static int height = 500; - private static GUIStyle header; - private static GUIStyle bold; + private static bool initialized; + private static int width = 500; + private static int height = 500; + private static GUIStyle header; + private static GUIStyle bold; - private static Dictionary enabledDefines = new Dictionary() - { - { DEFINE_DEBUG, false }, - { DEFINE_TUIO, false }, - }; + private static Dictionary enabledDefines = new Dictionary() + { + {DEFINE_DEBUG, false}, + {DEFINE_TUIO, false}, + }; [MenuItem("Window/TouchScript/Settings", false, 0)] static void createWindow() @@ -45,149 +43,146 @@ static void createWindow() static TouchScriptSettingsWindow() { - EditorApplication.update += doShow; + EditorApplication.update += doShow; } - private static void doShow() - { - EditorApplication.update -= doShow; - showAtStartup = EditorPrefs.GetBool(SHOW_AT_STARTUP, true); - - if (so == null) - { - var sos = Resources.FindObjectsOfTypeAll(); - if (sos.Length > 0) so = sos[0]; - } - if (so == null) - { - so = ScriptableObject.CreateInstance(); - if (showAtStartup) createWindow(); - } - } + private static void doShow() + { + EditorApplication.update -= doShow; + showAtStartup = EditorPrefs.GetBool(SHOW_AT_STARTUP, true); + + if (so == null) + { + var sos = Resources.FindObjectsOfTypeAll(); + if (sos.Length > 0) so = sos[0]; + } + if (so == null) + { + so = ScriptableObject.CreateInstance(); + if (showAtStartup) createWindow(); + } + } private void OnEnable() { - updateEnabledDefines(); + updateEnabledDefines(); } - private void OnDisable() - { - } + private void OnDisable() {} private void OnGUI() { - init(); - - var headerRect = GUILayoutUtility.GetRect(width, 165); - GUI.Box(headerRect, "v. " + TouchManager.VERSION - + (string.IsNullOrEmpty(TouchManager.VERSION_SUFFIX) ? "" : " " + TouchManager.VERSION_SUFFIX), header); - - EditorGUILayout.BeginHorizontal(); - GUILayout.Space(10); - EditorGUILayout.BeginVertical(); - GUILayout.Space(10); - - EditorGUILayout.LabelField("Thank you for choosing TouchScript!", bold); - - EditorGUI.indentLevel++; - drawListElement("FAQ", "Some of the questions have been already asked multiple times. \nCheck if yours is in the list.", - "https://github.com/TouchScript/TouchScript/wiki/FAQ"); - drawListElement("Documentation", "Complete up-to-date generated docs with all public API annotated.", - "http://touchscript.github.io/docs/"); - drawListElement("Official Forum", "Want to ask a question about TouchScript? Use the official Forum.", - "http://touchprefab.com/index.php"); - drawListElement("Issues", "Found a bug? Feel free to post it in Github Issues.", - "https://github.com/TouchScript/TouchScript/issues"); - EditorGUI.indentLevel--; - - EditorGUILayout.LabelField("Options", bold); - - EditorGUI.indentLevel++; - setDefine(DEFINE_DEBUG, EditorGUILayout.ToggleLeft("Enable Debug Mode", enabledDefines[DEFINE_DEBUG])); - EditorGUILayout.LabelField("Enables " + DEFINE_DEBUG + " define to turn on some TouchScript debug features.", EditorStyles.miniLabel); - setDefine(DEFINE_TUIO, EditorGUILayout.ToggleLeft("Enable TUIO", enabledDefines[DEFINE_TUIO])); - EditorGUILayout.LabelField("Enables " + DEFINE_TUIO + " define, this adds TUIO protocol support.", EditorStyles.miniLabel); - - EditorGUILayout.EndVertical(); - GUILayout.Space(10); - EditorGUILayout.EndHorizontal(); - - drawShowAtStartup(); + init(); + + var headerRect = GUILayoutUtility.GetRect(width, 165); + GUI.Box(headerRect, "v. " + TouchManager.VERSION + + (string.IsNullOrEmpty(TouchManager.VERSION_SUFFIX) ? "" : " " + TouchManager.VERSION_SUFFIX), header); + + EditorGUILayout.BeginHorizontal(); + GUILayout.Space(10); + EditorGUILayout.BeginVertical(); + GUILayout.Space(10); + + EditorGUILayout.LabelField("Thank you for choosing TouchScript!", bold); + + EditorGUI.indentLevel++; + drawListElement("FAQ", "Some of the questions have been already asked multiple times. \nCheck if yours is in the list.", + "https://github.com/TouchScript/TouchScript/wiki/FAQ"); + drawListElement("Documentation", "Complete up-to-date generated docs with all public API annotated.", + "http://touchscript.github.io/docs/"); + drawListElement("Official Forum", "Want to ask a question about TouchScript? Use the official Forum.", + "http://touchprefab.com/index.php"); + drawListElement("Issues", "Found a bug? Feel free to post it in Github Issues.", + "https://github.com/TouchScript/TouchScript/issues"); + EditorGUI.indentLevel--; + + EditorGUILayout.LabelField("Options", bold); + + EditorGUI.indentLevel++; + setDefine(DEFINE_DEBUG, EditorGUILayout.ToggleLeft("Enable Debug Mode", enabledDefines[DEFINE_DEBUG])); + EditorGUILayout.LabelField("Enables " + DEFINE_DEBUG + " define to turn on some TouchScript debug features.", EditorStyles.miniLabel); + setDefine(DEFINE_TUIO, EditorGUILayout.ToggleLeft("Enable TUIO", enabledDefines[DEFINE_TUIO])); + EditorGUILayout.LabelField("Enables " + DEFINE_TUIO + " define, this adds TUIO protocol support.", EditorStyles.miniLabel); + + EditorGUILayout.EndVertical(); + GUILayout.Space(10); + EditorGUILayout.EndHorizontal(); + + drawShowAtStartup(); } - private void init() - { - if (initialized) return; - initialized = true; + private void init() + { + if (initialized) return; + initialized = true; - header = new GUIStyle(); + header = new GUIStyle(); header.normal.background = EditorResources.Load("SettingsWindow/Header.png"); header.normal.textColor = Color.white; - header.padding = new RectOffset(0, 70, 102, 0); - header.alignment = TextAnchor.UpperRight; - - bold = new GUIStyle(EditorStyles.largeLabel); - bold.fontStyle = FontStyle.Bold; - bold.fontSize = 18; - bold.wordWrap = true; - } - - private void drawListElement(string header, string content, string url) - { - GUILayout.BeginVertical(); - EditorGUILayout.LabelField("> " + header, EditorStyles.boldLabel); - EditorGUILayout.LabelField(content, EditorStyles.wordWrappedLabel); - GUILayout.EndVertical(); - - if (!string.IsNullOrEmpty(url)) - { - var rect = GUILayoutUtility.GetLastRect(); - EditorGUIUtility.AddCursorRect(rect, MouseCursor.Link); - if (Event.current.type == EventType.mouseDown && rect.Contains(Event.current.mousePosition)) - Application.OpenURL(url); - } - } - - private void drawShowAtStartup() - { - bool show = GUI.Toggle(new Rect(10, height - 24, 120, 30), showAtStartup, "Show at startup"); - if (show != showAtStartup) - { - showAtStartup = show; - EditorPrefs.SetBool(SHOW_AT_STARTUP, showAtStartup); - } - } - - private void updateEnabledDefines() - { - var defines = new List(PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup).Split(';')); - var keys = new List(enabledDefines.Keys); - foreach (var define in keys) - { - if (defines.Contains(define)) enabledDefines[define] = true; - else enabledDefines[define] = false; - } - } - - private void setDefine(string name, bool value) - { - if (!enabledDefines.ContainsKey(name)) return; - if (enabledDefines[name] == value) return; - - enabledDefines[name] = value; - var defines = new List(PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup).Split(';')); - if (value) defines.Add(name); - else defines.Remove(name); - PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup, string.Join(";", defines.ToArray())); - } - - } - - public class TouchScriptSettingsWindowSO : ScriptableObject - { - private void Awake() - { - hideFlags = HideFlags.HideAndDontSave; - } - } -} + header.padding = new RectOffset(0, 70, 102, 0); + header.alignment = TextAnchor.UpperRight; + + bold = new GUIStyle(EditorStyles.largeLabel); + bold.fontStyle = FontStyle.Bold; + bold.fontSize = 18; + bold.wordWrap = true; + } + + private void drawListElement(string header, string content, string url) + { + GUILayout.BeginVertical(); + EditorGUILayout.LabelField("> " + header, EditorStyles.boldLabel); + EditorGUILayout.LabelField(content, EditorStyles.wordWrappedLabel); + GUILayout.EndVertical(); + + if (!string.IsNullOrEmpty(url)) + { + var rect = GUILayoutUtility.GetLastRect(); + EditorGUIUtility.AddCursorRect(rect, MouseCursor.Link); + if (Event.current.type == EventType.mouseDown && rect.Contains(Event.current.mousePosition)) + Application.OpenURL(url); + } + } + + private void drawShowAtStartup() + { + bool show = GUI.Toggle(new Rect(10, height - 24, 120, 30), showAtStartup, "Show at startup"); + if (show != showAtStartup) + { + showAtStartup = show; + EditorPrefs.SetBool(SHOW_AT_STARTUP, showAtStartup); + } + } + + private void updateEnabledDefines() + { + var defines = new List(PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup).Split(';')); + var keys = new List(enabledDefines.Keys); + foreach (var define in keys) + { + if (defines.Contains(define)) enabledDefines[define] = true; + else enabledDefines[define] = false; + } + } + + private void setDefine(string name, bool value) + { + if (!enabledDefines.ContainsKey(name)) return; + if (enabledDefines[name] == value) return; + + enabledDefines[name] = value; + var defines = new List(PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup).Split(';')); + if (value) defines.Add(name); + else defines.Remove(name); + PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup, string.Join(";", defines.ToArray())); + } + } + + public class TouchScriptSettingsWindowSO : ScriptableObject + { + private void Awake() + { + hideFlags = HideFlags.HideAndDontSave; + } + } +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/NullToggleDrawer.cs b/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/NullToggleDrawer.cs index a4ea70aab..3920f081c 100644 --- a/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/NullToggleDrawer.cs +++ b/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/NullToggleDrawer.cs @@ -32,13 +32,13 @@ public override void OnGUI(Rect position, SerializedProperty property, GUIConten switch (property.propertyType) { case SerializedPropertyType.ObjectReference: - property.objectReferenceValue = (Object)getNullValue(property); + property.objectReferenceValue = (Object) getNullValue(property); break; case SerializedPropertyType.Integer: - property.intValue = (int)getNullValue(property); + property.intValue = (int) getNullValue(property); break; case SerializedPropertyType.Float: - property.floatValue = (float)getNullValue(property); + property.floatValue = (float) getNullValue(property); break; } } @@ -46,7 +46,7 @@ public override void OnGUI(Rect position, SerializedProperty property, GUIConten { EditorGUI.BeginChangeCheck(); EditorGUI.LabelField(new Rect(position.x + 14, position.y + 18, 50, 16), new GUIContent("Value", label.tooltip)); - position = new Rect(position.x + 54, position.y + 18, Mathf.Min(position.width - 54, 100), 16); + position = new Rect(position.x + 54, position.y + 18, Mathf.Min(position.width - 54, 100), 16); switch (property.propertyType) { case SerializedPropertyType.ObjectReference: @@ -139,7 +139,7 @@ private void Begin(Rect position, SerializedProperty property, GUIContent label) label = EditorGUI.BeginProperty(position, label, property); label.text = " " + label.text; position.height = 16; - EditorGUIUtility.labelWidth = 180; + EditorGUIUtility.labelWidth = 180; expanded = EditorGUI.ToggleLeft(position, label, expanded == true); } @@ -161,9 +161,9 @@ private bool isNull(SerializedProperty property) case SerializedPropertyType.ObjectReference: return ReferenceEquals(property.objectReferenceValue, getNullValue(property)); case SerializedPropertyType.Integer: - return property.intValue == (int)getNullValue(property); + return property.intValue == (int) getNullValue(property); case SerializedPropertyType.Float: - return property.floatValue == (float)getNullValue(property); + return property.floatValue == (float) getNullValue(property); } return false; } @@ -183,4 +183,4 @@ private object getNullValue(SerializedProperty property) return null; } } -} +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/ToggleLeftDrawer.cs b/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/ToggleLeftDrawer.cs index 2a6e5ae51..c0c456bc4 100644 --- a/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/ToggleLeftDrawer.cs +++ b/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/ToggleLeftDrawer.cs @@ -24,4 +24,4 @@ public override void OnGUI(Rect position, SerializedProperty property, GUIConten EditorGUI.EndProperty(); } } -} +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Examples/Camera/Scripts/CameraController.cs b/Source/Assets/TouchScript/Examples/Camera/Scripts/CameraController.cs index fdb638a4d..72874fd94 100644 --- a/Source/Assets/TouchScript/Examples/Camera/Scripts/CameraController.cs +++ b/Source/Assets/TouchScript/Examples/Camera/Scripts/CameraController.cs @@ -39,16 +39,16 @@ private void OnDisable() private void manipulationTransformedHandler(object sender, System.EventArgs e) { - var rotation = Quaternion.Euler(ManipulationGesture.DeltaPosition.y/Screen.height*RotationSpeed, - -ManipulationGesture.DeltaPosition.x/Screen.width*RotationSpeed, + var rotation = Quaternion.Euler(ManipulationGesture.DeltaPosition.y / Screen.height * RotationSpeed, + -ManipulationGesture.DeltaPosition.x / Screen.width * RotationSpeed, ManipulationGesture.DeltaRotation); pivot.localRotation *= rotation; - cam.transform.localPosition += Vector3.forward*(ManipulationGesture.DeltaScale - 1f)*ZoomSpeed; + cam.transform.localPosition += Vector3.forward * (ManipulationGesture.DeltaScale - 1f) * ZoomSpeed; } private void twoFingerTransformHandler(object sender, System.EventArgs e) { - pivot.localPosition += pivot.rotation*TwoFingerMoveGesture.DeltaPosition*PanSpeed; + pivot.localPosition += pivot.rotation * TwoFingerMoveGesture.DeltaPosition * PanSpeed; } } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Examples/Colors/Scripts/Circle.cs b/Source/Assets/TouchScript/Examples/Colors/Scripts/Circle.cs index 77a9931ea..8f1196083 100644 --- a/Source/Assets/TouchScript/Examples/Colors/Scripts/Circle.cs +++ b/Source/Assets/TouchScript/Examples/Colors/Scripts/Circle.cs @@ -36,8 +36,8 @@ private void OnTriggerEnter2D(Collider2D other) var otherColor = otherCircle.Kill(); var scale = - Mathf.Sqrt(otherCircle.transform.localScale.x*otherCircle.transform.localScale.x + - transform.localScale.x*transform.localScale.x); + Mathf.Sqrt(otherCircle.transform.localScale.x * otherCircle.transform.localScale.x + + transform.localScale.x * transform.localScale.x); var color = Color.Lerp(GetComponent().sharedMaterial.color, otherColor, .5f); var obj = Instantiate(gameObject) as GameObject; diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs index 7e9810db5..3fe57c913 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs @@ -5,14 +5,15 @@ using TouchScript.Behaviors.Cursors; using TouchScript.Pointers; -namespace TouchScript.Examples.Cube +namespace TouchScript.Examples.Cube { /// public class CustomPointerProxy : PointerCursor { - protected override void updateOnce(IPointer pointer) { + protected override void updateOnce(IPointer pointer) + { if (pointer.InputSource is RedirectInput) Hide(); - + base.updateOnce(pointer); } } diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/Init.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/Init.cs index dfccb4da7..4afc392b7 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/Init.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/Init.cs @@ -5,17 +5,18 @@ using UnityEngine; using TouchScript.Layers; -namespace TouchScript.Examples.Cube +namespace TouchScript.Examples.Cube { /// - public class Init : MonoBehaviour + public class Init : MonoBehaviour { - void Start () { + void Start() + { var d = GetComponent(); - var go = GameObject.Find("Scene Camera"); + var go = GameObject.Find("Scene Camera"); go.GetComponent().Delegate = d; go = GameObject.Find("Camera"); - go.GetComponent().Delegate = d; + go.GetComponent().Delegate = d; } } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/LayerDelegate.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/LayerDelegate.cs index 3fc8fe4de..4c0762420 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/LayerDelegate.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/LayerDelegate.cs @@ -12,15 +12,14 @@ namespace TouchScript.Examples.Cube /// public class LayerDelegate : MonoBehaviour, ILayerDelegate { - public RedirectInput Source; public TouchLayer RenderTextureLayer; public bool ShouldReceivePointer(TouchLayer layer, IPointer pointer) { if (layer == RenderTextureLayer) - return pointer.InputSource == (IInputSource)Source; - return pointer.InputSource != (IInputSource)Source; + return pointer.InputSource == (IInputSource) Source; + return pointer.InputSource != (IInputSource) Source; } } -} +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs index 1d9c98ddf..cd87ed47f 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs @@ -15,7 +15,6 @@ namespace TouchScript.Examples.Cube /// public class RedirectInput : InputSource { - public int Width = 512; public int Height = 512; @@ -40,7 +39,7 @@ public override bool CancelPointer(Pointer pointer, bool shouldReturn) map.Add(pointer.Id, newPointer); } } - return true; + return true; } protected override void OnEnable() @@ -77,7 +76,7 @@ private Vector2 processCoords(Vector2 value) private void pointerPressedHandler(object sender, MetaGestureEventArgs metaGestureEventArgs) { var pointer = metaGestureEventArgs.Pointer; - if (pointer.InputSource == (IInputSource)this) return; + if (pointer.InputSource == (IInputSource) this) return; var newPointer = PointerFactory.Create(pointer.Type, this); newPointer.CopyFrom(pointer); @@ -90,9 +89,9 @@ private void pointerPressedHandler(object sender, MetaGestureEventArgs metaGestu private void pointerUpdatedHandler(object sender, MetaGestureEventArgs metaGestureEventArgs) { - var pointer = metaGestureEventArgs.Pointer; + var pointer = metaGestureEventArgs.Pointer; - if (pointer.InputSource == (IInputSource)this) return; + if (pointer.InputSource == (IInputSource) this) return; Pointer newPointer; if (!map.TryGetValue(pointer.Id, out newPointer)) return; @@ -106,7 +105,7 @@ private void pointerUpdatedHandler(object sender, MetaGestureEventArgs metaGestu private void pointerReleasedHandler(object sender, MetaGestureEventArgs metaGestureEventArgs) { var pointer = metaGestureEventArgs.Pointer; - if (pointer.InputSource == (IInputSource)this) return; + if (pointer.InputSource == (IInputSource) this) return; Pointer newPointer; if (!map.TryGetValue(pointer.Id, out newPointer)) return; @@ -118,14 +117,12 @@ private void pointerReleasedHandler(object sender, MetaGestureEventArgs metaGest private void pointerCancelledhandler(object sender, MetaGestureEventArgs metaGestureEventArgs) { var pointer = metaGestureEventArgs.Pointer; - if (pointer.InputSource == (IInputSource)this) return; + if (pointer.InputSource == (IInputSource) this) return; Pointer newPointer; if (!map.TryGetValue(pointer.Id, out newPointer)) return; map.Remove(pointer.Id); cancelPointer(newPointer); } - } - } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Examples/Multiuser/Scripts/Logo.cs b/Source/Assets/TouchScript/Examples/Multiuser/Scripts/Logo.cs index c99f0bd5c..a7ec42026 100644 --- a/Source/Assets/TouchScript/Examples/Multiuser/Scripts/Logo.cs +++ b/Source/Assets/TouchScript/Examples/Multiuser/Scripts/Logo.cs @@ -12,8 +12,7 @@ namespace TouchScript.Examples.Multiuser /// public class Logo : MonoBehaviour { - private static Color[] COLORS = new[] - {Color.yellow, Color.red, Color.magenta, Color.green, Color.cyan, Color.blue}; + private static Color[] COLORS = new[] {Color.yellow, Color.red, Color.magenta, Color.green, Color.cyan, Color.blue}; private void OnEnable() { diff --git a/Source/Assets/TouchScript/Examples/Photos/Scripts/Container.cs b/Source/Assets/TouchScript/Examples/Photos/Scripts/Container.cs index 01660c615..df0c095cc 100644 --- a/Source/Assets/TouchScript/Examples/Photos/Scripts/Container.cs +++ b/Source/Assets/TouchScript/Examples/Photos/Scripts/Container.cs @@ -20,8 +20,8 @@ public void Add() clone.transform.SetParent(transform); clone.transform.localScale = Vector3.one; clone.transform.localRotation = Quaternion.Euler(0f, 0f, Random.Range(0f, 360f)); - clone.transform.localPosition = new Vector3(Random.Range(-Width/2, Width/2), - Random.Range(-Height/2, Height/2), toClone.localPosition.z); + clone.transform.localPosition = new Vector3(Random.Range(-Width / 2, Width / 2), + Random.Range(-Height / 2, Height / 2), toClone.localPosition.z); initChild(clone.transform); } diff --git a/Source/Assets/TouchScript/Examples/Portal/Scripts/Spawner.cs b/Source/Assets/TouchScript/Examples/Portal/Scripts/Spawner.cs index ada86c798..29e377c44 100644 --- a/Source/Assets/TouchScript/Examples/Portal/Scripts/Spawner.cs +++ b/Source/Assets/TouchScript/Examples/Portal/Scripts/Spawner.cs @@ -11,7 +11,6 @@ namespace TouchScript.Examples.Portal /// public class Spawner : MonoBehaviour { - public Transform Prefab; public Transform Position; diff --git a/Source/Assets/TouchScript/Examples/Pull/Scripts/Logic.cs b/Source/Assets/TouchScript/Examples/Pull/Scripts/Logic.cs index f8fd68e26..a16196f05 100644 --- a/Source/Assets/TouchScript/Examples/Pull/Scripts/Logic.cs +++ b/Source/Assets/TouchScript/Examples/Pull/Scripts/Logic.cs @@ -1,102 +1,104 @@ -using UnityEngine; +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using UnityEngine; namespace TouchScript.Tutorial { - public class Logic : MonoBehaviour - { - - // Force multiplier - public float ForceMultiplier = 100f; - public LineRenderer Line; - - private PullGesture gesture; - private Rigidbody body; - - private Vector3 forceToApply; - private bool shouldApplyForce = false; - - private void OnEnable() - { - body = GetComponent(); - gesture = GetComponent(); - - Line.enabled = false; - - gesture.Pressed += pressedHandler; - gesture.Pulled += pulledHandler; - gesture.Released += releasedHandler; - gesture.Cancelled += cancelledHandler; - - releaseObject(); - } - - private void OnDisable() - { - gesture.Pressed -= pressedHandler; - gesture.Pulled -= pulledHandler; - gesture.Released -= releasedHandler; - gesture.Cancelled -= cancelledHandler; - } - - private void FixedUpdate() - { - // Apply force in FixedUpdate to make physics happy - if (shouldApplyForce) - { - body.AddForce(forceToApply); - shouldApplyForce = false; - } - } - - // Switch to manual mode - private void takeObject() - { - body.isKinematic = true; - Line.enabled = true; - updateLine(); - } - - // Switch to automatic mode - private void releaseObject() - { - body.isKinematic = false; - Line.enabled = false; - } - - // Push the object when the gesture is ended - private void pushObject() - { - forceToApply = ForceMultiplier * gesture.Force; - shouldApplyForce = true; - } - - // Update the line - private void updateLine() - { - Line.SetPosition(0, gesture.StartPosition); - Line.SetPosition(1, gesture.Position); - } - - private void pressedHandler(object sender, System.EventArgs e) - { - takeObject(); - } - - private void pulledHandler(object sender, System.EventArgs e) - { - updateLine(); - } - - private void releasedHandler(object sender, System.EventArgs e) - { - releaseObject(); - pushObject(); - } - - private void cancelledHandler(object sender, System.EventArgs e) - { - releaseObject(); - } - - } + public class Logic : MonoBehaviour + { + // Force multiplier + public float ForceMultiplier = 100f; + public LineRenderer Line; + + private PullGesture gesture; + private Rigidbody body; + + private Vector3 forceToApply; + private bool shouldApplyForce = false; + + private void OnEnable() + { + body = GetComponent(); + gesture = GetComponent(); + + Line.enabled = false; + + gesture.Pressed += pressedHandler; + gesture.Pulled += pulledHandler; + gesture.Released += releasedHandler; + gesture.Cancelled += cancelledHandler; + + releaseObject(); + } + + private void OnDisable() + { + gesture.Pressed -= pressedHandler; + gesture.Pulled -= pulledHandler; + gesture.Released -= releasedHandler; + gesture.Cancelled -= cancelledHandler; + } + + private void FixedUpdate() + { + // Apply force in FixedUpdate to make physics happy + if (shouldApplyForce) + { + body.AddForce(forceToApply); + shouldApplyForce = false; + } + } + + // Switch to manual mode + private void takeObject() + { + body.isKinematic = true; + Line.enabled = true; + updateLine(); + } + + // Switch to automatic mode + private void releaseObject() + { + body.isKinematic = false; + Line.enabled = false; + } + + // Push the object when the gesture is ended + private void pushObject() + { + forceToApply = ForceMultiplier * gesture.Force; + shouldApplyForce = true; + } + + // Update the line + private void updateLine() + { + Line.SetPosition(0, gesture.StartPosition); + Line.SetPosition(1, gesture.Position); + } + + private void pressedHandler(object sender, System.EventArgs e) + { + takeObject(); + } + + private void pulledHandler(object sender, System.EventArgs e) + { + updateLine(); + } + + private void releasedHandler(object sender, System.EventArgs e) + { + releaseObject(); + pushObject(); + } + + private void cancelledHandler(object sender, System.EventArgs e) + { + releaseObject(); + } + } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Examples/Pull/Scripts/PullGesture.cs b/Source/Assets/TouchScript/Examples/Pull/Scripts/PullGesture.cs index 2bbb2243b..f02eaf50f 100644 --- a/Source/Assets/TouchScript/Examples/Pull/Scripts/PullGesture.cs +++ b/Source/Assets/TouchScript/Examples/Pull/Scripts/PullGesture.cs @@ -1,6 +1,9 @@ -using System.Collections.Generic; +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using System.Collections.Generic; using UnityEngine; -// Must import this to use Gesture type using TouchScript.Gestures; using TouchScript.Pointers; using System; @@ -9,164 +12,160 @@ // Let's put our gesture into a namespace so it wouldn't clash with other classes in our project namespace TouchScript.Tutorial { - // The class must inherit from Gesture - public class PullGesture : Gesture - { - - public event EventHandler Pressed - { - add { pressedInvoker += value; } - remove { pressedInvoker -= value; } - } - - public event EventHandler Pulled - { - add { pulledInvoker += value; } - remove { pulledInvoker -= value; } - } - - public event EventHandler Released - { - add { releasedInvoker += value; } - remove { releasedInvoker -= value; } - } - - public Vector3 StartPosition - { - get - { - switch (State) - { - case GestureState.Began: - case GestureState.Changed: - case GestureState.Ended: - return startPosition; - default: - return transform.position; - } - } - } - - public Vector3 Position - { - get - { - switch (State) - { - case GestureState.Began: - case GestureState.Changed: - case GestureState.Ended: - return projection.ProjectTo(primaryPointer.Position, plane); - default: - return transform.position; - } - } - } - - public Vector3 Force - { - get - { - return StartPosition - Position; - } - } - - // Needed to overcome iOS AOT limitations - private EventHandler pressedInvoker, pulledInvoker, releasedInvoker; - - // The only pointer we are interested in - private Pointer primaryPointer; - - // Layer projection parameters - private ProjectionParams projection; - - // 3D plane to project to - private Plane plane; - - // The world coordinates of the point where the gesture started - private Vector3 startPosition; - - // Pointers pressed this frame - protected override void pointersPressed(IList pointers) - { - if (State == GestureState.Idle) - { - primaryPointer = pointers[0]; - projection = primaryPointer.GetPressData().Layer.GetProjectionParams(primaryPointer); - plane = new Plane(Vector3.up, transform.position); - startPosition = projection.ProjectTo(primaryPointer.Position, plane); - - // Start the gesture - setState(GestureState.Began); - } - } - - // Pointers updated this frame - protected override void pointersUpdated(IList pointers) - { - foreach (var p in pointers) - { - if (p.Id == primaryPointer.Id) - { - // If the pointer we are interested in moved, change the state - setState(GestureState.Changed); - return; - } - } - } - - // Pointers released this frame - protected override void pointersReleased(IList pointers) - { - foreach (var p in pointers) - { - if (p.Id == primaryPointer.Id) - { - // If the pointer we are interested was released, end the gesture - setState(GestureState.Ended); - return; - } - } - } - - // Pointers cancelled this frame - protected override void pointersCancelled(IList pointers) - { - foreach (var p in pointers) - { - if (p.Id == primaryPointer.Id) - { - // If the pointer we are interested was cancelled, cancel the gesture - setState(GestureState.Cancelled); - return; - } - } - } - - // Called when the gesture transitions to Began state - protected override void onBegan() - { - if (pressedInvoker != null) pressedInvoker(this, EventArgs.Empty); - } - - // Called when the gesture transitions to Ended or Recognized states - protected override void onRecognized() - { - if (releasedInvoker != null) releasedInvoker(this, EventArgs.Empty); - } - - // Called when the gesture transitions to Changed state - protected override void onChanged() - { - if (pulledInvoker != null) pulledInvoker(this, EventArgs.Empty); + // The class must inherit from Gesture + public class PullGesture : Gesture + { + public event EventHandler Pressed + { + add { pressedInvoker += value; } + remove { pressedInvoker -= value; } + } + + public event EventHandler Pulled + { + add { pulledInvoker += value; } + remove { pulledInvoker -= value; } + } + + public event EventHandler Released + { + add { releasedInvoker += value; } + remove { releasedInvoker -= value; } + } + + public Vector3 StartPosition + { + get + { + switch (State) + { + case GestureState.Began: + case GestureState.Changed: + case GestureState.Ended: + return startPosition; + default: + return transform.position; + } + } + } + + public Vector3 Position + { + get + { + switch (State) + { + case GestureState.Began: + case GestureState.Changed: + case GestureState.Ended: + return projection.ProjectTo(primaryPointer.Position, plane); + default: + return transform.position; + } + } + } + + public Vector3 Force + { + get { return StartPosition - Position; } + } + + // Needed to overcome iOS AOT limitations + private EventHandler pressedInvoker, pulledInvoker, releasedInvoker; + + // The only pointer we are interested in + private Pointer primaryPointer; + + // Layer projection parameters + private ProjectionParams projection; + + // 3D plane to project to + private Plane plane; + + // The world coordinates of the point where the gesture started + private Vector3 startPosition; + + // Pointers pressed this frame + protected override void pointersPressed(IList pointers) + { + if (State == GestureState.Idle) + { + primaryPointer = pointers[0]; + projection = primaryPointer.GetPressData().Layer.GetProjectionParams(primaryPointer); + plane = new Plane(Vector3.up, transform.position); + startPosition = projection.ProjectTo(primaryPointer.Position, plane); + + // Start the gesture + setState(GestureState.Began); + } + } + + // Pointers updated this frame + protected override void pointersUpdated(IList pointers) + { + foreach (var p in pointers) + { + if (p.Id == primaryPointer.Id) + { + // If the pointer we are interested in moved, change the state + setState(GestureState.Changed); + return; + } + } + } + + // Pointers released this frame + protected override void pointersReleased(IList pointers) + { + foreach (var p in pointers) + { + if (p.Id == primaryPointer.Id) + { + // If the pointer we are interested was released, end the gesture + setState(GestureState.Ended); + return; + } + } + } + + // Pointers cancelled this frame + protected override void pointersCancelled(IList pointers) + { + foreach (var p in pointers) + { + if (p.Id == primaryPointer.Id) + { + // If the pointer we are interested was cancelled, cancel the gesture + setState(GestureState.Cancelled); + return; + } + } + } + + // Called when the gesture transitions to Began state + protected override void onBegan() + { + if (pressedInvoker != null) pressedInvoker(this, EventArgs.Empty); + } + + // Called when the gesture transitions to Ended or Recognized states + protected override void onRecognized() + { + if (releasedInvoker != null) releasedInvoker(this, EventArgs.Empty); + } + + // Called when the gesture transitions to Changed state + protected override void onChanged() + { + if (pulledInvoker != null) pulledInvoker(this, EventArgs.Empty); // Debug.LogFormat("Start position: {0}, current position: {1}, force: {2}", StartPosition, Position, Force.magnitude); - } - - // This method is called when gesture is reset when recognized or failed - protected override void reset() - { - base.reset(); - primaryPointer = null; - } - } + } + + // This method is called when gesture is reset when recognized or failed + protected override void reset() + { + base.reset(); + primaryPointer = null; + } + } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Examples/Taps/Scripts/Break.cs b/Source/Assets/TouchScript/Examples/Taps/Scripts/Break.cs index dfcc6f05e..4ec3f7129 100644 --- a/Source/Assets/TouchScript/Examples/Taps/Scripts/Break.cs +++ b/Source/Assets/TouchScript/Examples/Taps/Scripts/Break.cs @@ -88,9 +88,9 @@ private void longPressedHandler(object sender, GestureStateChangeEventArgs e) var cube = obj.transform; cube.parent = transform.parent; cube.name = "Cube"; - cube.localScale = 0.5f*transform.localScale; - cube.position = transform.TransformPoint(directions[i]/4); - cube.GetComponent().AddForce(Power*Random.insideUnitSphere, ForceMode.Impulse); + cube.localScale = 0.5f * transform.localScale; + cube.position = transform.TransformPoint(directions[i] / 4); + cube.GetComponent().AddForce(Power * Random.insideUnitSphere, ForceMode.Impulse); cube.GetComponent().material.color = Color.white; } Destroy(gameObject); diff --git a/Source/Assets/TouchScript/Examples/Taps/Scripts/Kick.cs b/Source/Assets/TouchScript/Examples/Taps/Scripts/Kick.cs index 8627b46a8..43029cc9d 100644 --- a/Source/Assets/TouchScript/Examples/Taps/Scripts/Kick.cs +++ b/Source/Assets/TouchScript/Examples/Taps/Scripts/Kick.cs @@ -15,12 +15,12 @@ public class Kick : MonoBehaviour private TapGesture gesture; private Rigidbody rb; - private Camera activeCamera; + private Camera activeCamera; private void OnEnable() { rb = GetComponent(); - activeCamera = GameObject.Find("Scene Camera").GetComponent(); + activeCamera = GameObject.Find("Scene Camera").GetComponent(); gesture = GetComponent(); gesture.Tapped += tappedHandler; } @@ -32,11 +32,11 @@ private void OnDisable() private void tappedHandler(object sender, System.EventArgs e) { - var ray = activeCamera.ScreenPointToRay(gesture.ScreenPosition); + var ray = activeCamera.ScreenPointToRay(gesture.ScreenPosition); RaycastHit hit; if (Physics.Raycast(ray, out hit) && hit.transform == transform) { - rb.AddForceAtPosition(ray.direction*Force, hit.point, ForceMode.Impulse); + rb.AddForceAtPosition(ray.direction * Force, hit.point, ForceMode.Impulse); Instantiate(Particles, hit.point, Quaternion.identity); } } diff --git a/Source/Assets/TouchScript/Examples/Taps/Scripts/Spawn.cs b/Source/Assets/TouchScript/Examples/Taps/Scripts/Spawn.cs index 040bc10a0..29fd674f0 100644 --- a/Source/Assets/TouchScript/Examples/Taps/Scripts/Spawn.cs +++ b/Source/Assets/TouchScript/Examples/Taps/Scripts/Spawn.cs @@ -34,8 +34,8 @@ private void tappedHandler(object sender, EventArgs e) var cube = Instantiate(CubePrefab) as Transform; cube.parent = Container; cube.name = "Cube"; - cube.localScale = Vector3.one*Scale*cube.localScale.x; - cube.position = hit.Point + hit.Normal*.5f; + cube.localScale = Vector3.one * Scale * cube.localScale.x; + cube.position = hit.Point + hit.Normal * .5f; } } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Examples/_misc/Scripts/ExamplesList.cs b/Source/Assets/TouchScript/Examples/_misc/Scripts/ExamplesList.cs index 3e2737ea4..47f0ff31e 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Scripts/ExamplesList.cs +++ b/Source/Assets/TouchScript/Examples/_misc/Scripts/ExamplesList.cs @@ -1,20 +1,22 @@ -using UnityEngine; +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using UnityEngine; /// -public class ExamplesList : MonoBehaviour +public class ExamplesList : MonoBehaviour { + public RectTransform Content; - public RectTransform Content; - - void Start () - { - gameObject.SetActive(false); - } - - public void ShowHide() - { - gameObject.SetActive(!gameObject.activeSelf); - Content.localPosition = Vector3.zero; - } + void Start() + { + gameObject.SetActive(false); + } -} + public void ShowHide() + { + gameObject.SetActive(!gameObject.activeSelf); + Content.localPosition = Vector3.zero; + } +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Examples/_misc/Scripts/Highlight.cs b/Source/Assets/TouchScript/Examples/_misc/Scripts/Highlight.cs index 89936a2f4..a7c4b7e5b 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Scripts/Highlight.cs +++ b/Source/Assets/TouchScript/Examples/_misc/Scripts/Highlight.cs @@ -6,39 +6,37 @@ using TouchScript.Behaviors.UI; /// -public class Highlight : MonoBehaviour +public class Highlight : MonoBehaviour { - - public Color OverColor = Color.red; - - private OverHelper over; - private MeshRenderer r; - private Material oldMaterial; - - private void OnEnable() - { - over = GetComponent(); - r = GetComponent(); - oldMaterial = r.sharedMaterial; - - over.Over += overHandler; - over.Out += outHandler; - } - - private void OnDisable() - { - over.Over -= overHandler; - over.Out -= outHandler; - } - - void overHandler (object sender, System.EventArgs e) - { - r.material.color = OverColor; - } - - void outHandler (object sender, System.EventArgs e) - { - r.material = oldMaterial; - } - -} + public Color OverColor = Color.red; + + private OverHelper over; + private MeshRenderer r; + private Material oldMaterial; + + private void OnEnable() + { + over = GetComponent(); + r = GetComponent(); + oldMaterial = r.sharedMaterial; + + over.Over += overHandler; + over.Out += outHandler; + } + + private void OnDisable() + { + over.Over -= overHandler; + over.Out -= outHandler; + } + + void overHandler(object sender, System.EventArgs e) + { + r.material.color = OverColor; + } + + void outHandler(object sender, System.EventArgs e) + { + r.material = oldMaterial; + } +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Examples/_misc/Scripts/ShowMe.cs b/Source/Assets/TouchScript/Examples/_misc/Scripts/ShowMe.cs index f4e1260f8..8f3a5d564 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Scripts/ShowMe.cs +++ b/Source/Assets/TouchScript/Examples/_misc/Scripts/ShowMe.cs @@ -1,14 +1,18 @@ -using UnityEngine; +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using UnityEngine; using System.Collections; /// -public class ShowMe : MonoBehaviour +public class ShowMe : MonoBehaviour { - IEnumerator Start () - { - var canvas = GetComponent(); - canvas.enabled = false; - yield return new WaitForSeconds(.5f); - canvas.enabled = true; - } -} + IEnumerator Start() + { + var canvas = GetComponent(); + canvas.enabled = false; + yield return new WaitForSeconds(.5f); + canvas.enabled = true; + } +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs index 26f147b55..35ef5f821 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs @@ -51,7 +51,7 @@ public event EventHandler Pressed ///

/// Unity event, occurs when gesture is recognized. /// - public GestureEvent OnPress = new GestureEvent(); + public GestureEvent OnPress = new GestureEvent(); #endregion @@ -76,28 +76,28 @@ public bool IgnoreChildren private bool ignoreChildren = false; #if UNITY_5_6_OR_NEWER - private CustomSampler gestureSampler; + private CustomSampler gestureSampler; #endif - #endregion + #endregion - #region Unity + #region Unity - /// - protected override void Awake() - { - base.Awake(); + /// + protected override void Awake() + { + base.Awake(); #if UNITY_5_6_OR_NEWER - gestureSampler = CustomSampler.Create("[TouchScript] Press Gesture"); + gestureSampler = CustomSampler.Create("[TouchScript] Press Gesture"); #endif - } + } - [ContextMenu("Basic Editor")] - private void switchToBasicEditor() - { - basicEditor = true; - } + [ContextMenu("Basic Editor")] + private void switchToBasicEditor() + { + basicEditor = true; + } #endregion @@ -131,7 +131,7 @@ public override bool CanBePreventedByGesture(Gesture gesture) protected override void pointersPressed(IList pointers) { #if UNITY_5_6_OR_NEWER - gestureSampler.Begin(); + gestureSampler.Begin(); #endif base.pointersPressed(pointers); @@ -140,7 +140,7 @@ protected override void pointersPressed(IList pointers) { setState(GestureState.Recognized); #if UNITY_5_6_OR_NEWER - gestureSampler.End(); + gestureSampler.End(); #endif return; } @@ -148,13 +148,13 @@ protected override void pointersPressed(IList pointers) { setState(GestureState.Failed); #if UNITY_5_6_OR_NEWER - gestureSampler.End(); + gestureSampler.End(); #endif return; } #if UNITY_5_6_OR_NEWER - gestureSampler.End(); + gestureSampler.End(); #endif } @@ -165,7 +165,7 @@ protected override void onRecognized() if (pressedInvoker != null) pressedInvoker.InvokeHandleExceptions(this, EventArgs.Empty); if (UseSendMessage && SendMessageTarget != null) SendMessageTarget.SendMessage(PRESS_MESSAGE, this, SendMessageOptions.DontRequireReceiver); - if (UseUnityEvents) OnPress.Invoke(this); + if (UseUnityEvents) OnPress.Invoke(this); } #endregion diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs index 934b79687..be6ed2749 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs @@ -146,7 +146,7 @@ public float CombinePointersInterval private TimedSequence pointerSequence = new TimedSequence(); #if UNITY_5_6_OR_NEWER - private CustomSampler gestureSampler; + private CustomSampler gestureSampler; #endif #endregion @@ -166,15 +166,15 @@ public override bool ShouldReceivePointer(Pointer pointer) #region Unity methods - /// - protected override void Awake() - { - base.Awake(); + /// + protected override void Awake() + { + base.Awake(); #if UNITY_5_6_OR_NEWER - gestureSampler = CustomSampler.Create("[TouchScript] Tap Gesture"); + gestureSampler = CustomSampler.Create("[TouchScript] Tap Gesture"); #endif - } + } /// protected override void OnEnable() @@ -198,7 +198,7 @@ private void switchToBasicEditor() protected override void pointersPressed(IList pointers) { #if UNITY_5_6_OR_NEWER - gestureSampler.Begin(); + gestureSampler.Begin(); #endif base.pointersPressed(pointers); @@ -208,7 +208,7 @@ protected override void pointersPressed(IList pointers) { setState(GestureState.Failed); #if UNITY_5_6_OR_NEWER - gestureSampler.End(); + gestureSampler.End(); #endif return; } @@ -235,7 +235,7 @@ protected override void pointersPressed(IList pointers) { setState(GestureState.Failed); #if UNITY_5_6_OR_NEWER - gestureSampler.End(); + gestureSampler.End(); #endif return; } @@ -254,7 +254,7 @@ protected override void pointersPressed(IList pointers) } #if UNITY_5_6_OR_NEWER - gestureSampler.End(); + gestureSampler.End(); #endif } @@ -262,7 +262,7 @@ protected override void pointersPressed(IList pointers) protected override void pointersUpdated(IList pointers) { #if UNITY_5_6_OR_NEWER - gestureSampler.Begin(); + gestureSampler.Begin(); #endif base.pointersUpdated(pointers); @@ -274,7 +274,7 @@ protected override void pointersUpdated(IList pointers) } #if UNITY_5_6_OR_NEWER - gestureSampler.End(); + gestureSampler.End(); #endif } @@ -282,7 +282,7 @@ protected override void pointersUpdated(IList pointers) protected override void pointersReleased(IList pointers) { #if UNITY_5_6_OR_NEWER - gestureSampler.Begin(); + gestureSampler.Begin(); #endif base.pointersReleased(pointers); @@ -308,7 +308,7 @@ protected override void pointersReleased(IList pointers) { setState(GestureState.Failed); #if UNITY_5_6_OR_NEWER - gestureSampler.End(); + gestureSampler.End(); #endif return; } @@ -329,7 +329,7 @@ protected override void pointersReleased(IList pointers) } #if UNITY_5_6_OR_NEWER - gestureSampler.End(); + gestureSampler.End(); #endif } From 78e78c1c244fb68aad67df4d41735e76fe221778 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 1 Aug 2017 21:10:44 +0300 Subject: [PATCH 56/58] Fixed an issue with touches and UI Slider. --- .../Scripts/Debugging/TouchScriptDebugger.cs | 2 +- .../Layers/UI/TouchScriptInputModule.cs | 51 +++++++++++++++++-- 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Debugging/TouchScriptDebugger.cs b/Source/Assets/TouchScript/Scripts/Debugging/TouchScriptDebugger.cs index b68ce0c07..382909cf8 100644 --- a/Source/Assets/TouchScript/Scripts/Debugging/TouchScriptDebugger.cs +++ b/Source/Assets/TouchScript/Scripts/Debugging/TouchScriptDebugger.cs @@ -48,7 +48,7 @@ public IPointerLogger PointerLogger { if (value == null) return; if (pointerLogger == value) return; - pointerLogger.Dispose(); + if (pointerLogger != null) pointerLogger.Dispose(); pointerLogger = value; } } diff --git a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs index ce813b6ca..9ee625d6f 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs @@ -198,6 +198,7 @@ internal int INTERNAL_Release() private void enable() { ui = new UIStandardInputModule(this); + TouchManager.Instance.PointersAdded += ui.ProcessAdded; TouchManager.Instance.PointersUpdated += ui.ProcessUpdated; TouchManager.Instance.PointersPressed += ui.ProcessPressed; TouchManager.Instance.PointersReleased += ui.ProcessReleased; @@ -209,6 +210,7 @@ private void disable() { if (TouchManager.Instance != null && ui != null) { + TouchManager.Instance.PointersAdded -= ui.ProcessAdded; TouchManager.Instance.PointersUpdated -= ui.ProcessUpdated; TouchManager.Instance.PointersPressed -= ui.ProcessPressed; TouchManager.Instance.PointersReleased -= ui.ProcessReleased; @@ -433,6 +435,43 @@ private void convertRaycast(RaycastHitUI old, ref RaycastResult current) #region Event processors + public virtual void ProcessAdded(object sender, PointerEventArgs pointerEventArgs) + { +#if UNITY_5_6_OR_NEWER + uiSampler.Begin(); +#endif + + var pointers = pointerEventArgs.Pointers; + var raycast = new RaycastResult(); + var count = pointers.Count; + for (var i = 0; i < count; i++) + { + var pointer = pointers[i]; + var over = pointer.GetOverData(); + + // Don't update the pointer if it is not over an UI element + if (over.Type != HitData.HitType.UI) continue; + + PointerEventData data; + GetPointerData(pointer.Id, out data, true); + data.Reset(); + var target = over.Target; + var currentOverGo = target == null ? null : target.gameObject; + + data.position = pointer.Position; + data.delta = Vector2.zero; + convertRaycast(over.RaycastHitUI, ref raycast); + raycast.screenPosition = data.position; + data.pointerCurrentRaycast = raycast; + + input.HandlePointerExitAndEnter(data, currentOverGo); + } + +#if UNITY_5_6_OR_NEWER + uiSampler.End(); +#endif + } + public virtual void ProcessUpdated(object sender, PointerEventArgs pointerEventArgs) { #if UNITY_5_6_OR_NEWER @@ -445,16 +484,19 @@ public virtual void ProcessUpdated(object sender, PointerEventArgs pointerEventA for (var i = 0; i < count; i++) { var pointer = pointers[i]; + var over = pointer.GetOverData(); + // Don't update the pointer if it is pressed not over an UI element if ((pointer.Buttons & Pointer.PointerButtonState.AnyButtonPressed) > 0) { var press = pointer.GetPressData(); if (press.Type != HitData.HitType.UI) continue; } - - var over = pointer.GetOverData(); - // Don't update the pointer if it is not over an UI element - if (over.Type != HitData.HitType.UI) continue; + else + { + // Don't update the pointer if it is not over an UI element + if (over.Type != HitData.HitType.UI) continue; + } PointerEventData data; GetPointerData(pointer.Id, out data, true); @@ -535,6 +577,7 @@ public virtual void ProcessPressed(object sender, PointerEventArgs pointerEventA data.delta = Vector2.zero; data.dragging = false; data.useDragThreshold = true; + data.position = pointer.Position; data.pressPosition = pointer.Position; data.pointerPressRaycast = data.pointerCurrentRaycast; From 6229054a6ea25c7f16324c7c4d0b16f2aef4c556 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Wed, 2 Aug 2017 13:50:00 +0300 Subject: [PATCH 57/58] Update README.md --- README.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 6b84dc97b..5a13dc27b 100644 --- a/README.md +++ b/README.md @@ -35,13 +35,19 @@ To test how built-in Gestures work, create an empty cube in the scene and attach Press Play. Note how you can drag the object with one touch and scale or rotate it with two touches. Don't forget that you can use Alt + click to simulate a second pointer ([read more more about testing multi-touch gestures](https://github.com/TouchScript/TouchScript/wiki/Testing-multitouch-on-a-PC)). ### Examples -TouchScript comes with many examples in `TouchScript/Examples` folder. Open `Examples.unity` scene and read description for every example to find out what it is about. Some of the features demonstrated in the example scenes are also described [here](https://github.com/TouchScript/TouchScript/wiki/Examples). +TouchScript comes with many examples in `TouchScript/Examples` folder. Open `Examples.unity` scene and read description for every example to find out what it is about. + +[All examples are explaned here.](https://github.com/TouchScript/TouchScript/wiki/Examples) ### What to read next +- [How to receive a pointer.](https://github.com/TouchScript/TouchScript/wiki/Pointer-Input) - [What is a Gesture and how to work with it.](https://github.com/TouchScript/TouchScript/wiki/Gestures) - [What is an Input Source and why it is needed.](https://github.com/TouchScript/TouchScript/wiki/Input-Sources) - [What is a Layer and why it is needed.](https://github.com/TouchScript/TouchScript/wiki/Layers) - [Some info on how TouchScript works internally.](https://github.com/TouchScript/TouchScript/wiki/Main-Ideas-Behind-TouchScript) +- [How to affect which objects can be touched.](https://github.com/TouchScript/TouchScript/wiki/Modifying-Hits) +- [How to change touch coordinates from an input device.](https://github.com/TouchScript/TouchScript/wiki/Remapping-Coordinates-From-an-Input-Source) +- [How to write a custom Gesture.](https://github.com/TouchScript/TouchScript/wiki/Tutorial.-Writing-a-Custom-Gesture.) - [How you can help.](https://github.com/TouchScript/TouchScript/wiki/How-to-Contribute) ## Need help? @@ -55,6 +61,3 @@ _Complete up-to-date generated docs with all public API annotated._ _Want to ask a question about TouchScript? Use the official Forum._ - [Issues](https://github.com/TouchScript/TouchScript/issues) _Found a bug? Got a feature request? Feel free to post it in Issues._ - -## Consulting and contract work -If you require custom functionality for your project or consulting services please contact me at **v@lent.in**. From 74f58155ddcd42c0a37428f2dd6814e05ec70215 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 1 Aug 2017 22:11:54 +0300 Subject: [PATCH 58/58] Allocation-free cursor spawning. --- .../Prefabs/Cursors/Mouse Cursor.prefab | 12 ++++++++++++ .../TouchScript/Prefabs/Cursors/Pen Cursor.prefab | 12 ++++++++++++ .../TouchScript/Prefabs/Cursors/Pointer.prefab | 12 ++++++++++++ .../Prefabs/Cursors/Touch Cursor.prefab | 12 ++++++++++++ .../Scripts/Behaviors/Cursors/PointerCursor.cs | 15 ++++++++++++--- 5 files changed, 60 insertions(+), 3 deletions(-) diff --git a/Source/Assets/TouchScript/Prefabs/Cursors/Mouse Cursor.prefab b/Source/Assets/TouchScript/Prefabs/Cursors/Mouse Cursor.prefab index 7697254f0..fa9cc149a 100644 --- a/Source/Assets/TouchScript/Prefabs/Cursors/Mouse Cursor.prefab +++ b/Source/Assets/TouchScript/Prefabs/Cursors/Mouse Cursor.prefab @@ -47,6 +47,7 @@ GameObject: - component: {fileID: 22499528} - component: {fileID: 11416202} - component: {fileID: 223878911915740246} + - component: {fileID: 225715774982127120} m_Layer: 0 m_Name: Mouse Cursor m_TagString: Untagged @@ -419,3 +420,14 @@ Canvas: m_SortingLayerID: 0 m_SortingOrder: 0 m_TargetDisplay: 0 +--- !u!225 &225715774982127120 +CanvasGroup: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 185820} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 0 + m_BlocksRaycasts: 0 + m_IgnoreParentGroups: 0 diff --git a/Source/Assets/TouchScript/Prefabs/Cursors/Pen Cursor.prefab b/Source/Assets/TouchScript/Prefabs/Cursors/Pen Cursor.prefab index e5767b17e..c77271042 100644 --- a/Source/Assets/TouchScript/Prefabs/Cursors/Pen Cursor.prefab +++ b/Source/Assets/TouchScript/Prefabs/Cursors/Pen Cursor.prefab @@ -28,6 +28,7 @@ GameObject: - component: {fileID: 22480400} - component: {fileID: 11486812} - component: {fileID: 223912096970254378} + - component: {fileID: 225894359780410702} m_Layer: 0 m_Name: Pen Cursor m_TagString: Untagged @@ -421,3 +422,14 @@ Canvas: m_SortingLayerID: 0 m_SortingOrder: 0 m_TargetDisplay: 0 +--- !u!225 &225894359780410702 +CanvasGroup: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 118164} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 0 + m_BlocksRaycasts: 0 + m_IgnoreParentGroups: 0 diff --git a/Source/Assets/TouchScript/Prefabs/Cursors/Pointer.prefab b/Source/Assets/TouchScript/Prefabs/Cursors/Pointer.prefab index e04ebf739..18c2dff48 100644 --- a/Source/Assets/TouchScript/Prefabs/Cursors/Pointer.prefab +++ b/Source/Assets/TouchScript/Prefabs/Cursors/Pointer.prefab @@ -28,6 +28,7 @@ GameObject: - component: {fileID: 22471328} - component: {fileID: 11468960} - component: {fileID: 223813922742015622} + - component: {fileID: 225429637618999960} m_Layer: 0 m_Name: Pointer m_TagString: Untagged @@ -188,3 +189,14 @@ Canvas: m_SortingLayerID: 0 m_SortingOrder: 0 m_TargetDisplay: 0 +--- !u!225 &225429637618999960 +CanvasGroup: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 183852} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 0 + m_BlocksRaycasts: 0 + m_IgnoreParentGroups: 0 diff --git a/Source/Assets/TouchScript/Prefabs/Cursors/Touch Cursor.prefab b/Source/Assets/TouchScript/Prefabs/Cursors/Touch Cursor.prefab index 99f53e781..3d6ffbbe2 100644 --- a/Source/Assets/TouchScript/Prefabs/Cursors/Touch Cursor.prefab +++ b/Source/Assets/TouchScript/Prefabs/Cursors/Touch Cursor.prefab @@ -46,6 +46,7 @@ GameObject: - component: {fileID: 22499528} - component: {fileID: 11435582} - component: {fileID: 223147991810450650} + - component: {fileID: 225477107791102178} m_Layer: 0 m_Name: Touch Cursor m_TagString: Untagged @@ -283,3 +284,14 @@ Canvas: m_SortingLayerID: 0 m_SortingOrder: 0 m_TargetDisplay: 0 +--- !u!225 &225477107791102178 +CanvasGroup: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 185820} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 0 + m_BlocksRaycasts: 0 + m_IgnoreParentGroups: 0 diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PointerCursor.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PointerCursor.cs index 417912115..dd9ee0321 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PointerCursor.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Cursors/PointerCursor.cs @@ -206,6 +206,8 @@ public float Size ///

Q5}1LV@c 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%0Dh9 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�SdKgrNSQk=Ww!I!J2Cb2V_43z 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

protected uint hash = uint.MaxValue; + private CanvasGroup group; + #endregion #region Public methods @@ -218,11 +220,13 @@ public float Size public void Init(RectTransform parent, IPointer pointer) { hash = uint.MaxValue; + group = GetComponent(); show(); rect.SetParent(parent); rect.SetAsLastSibling(); state = CursorState.Released; + UpdatePointer(pointer); } @@ -290,8 +294,10 @@ private void Awake() ///
protected virtual void hide() { - gameObject.SetActive(false); - gameObject.name = "inactive pointer"; + group.alpha = 0; +#if UNITY_EDITOR + gameObject.name = "Inactive Pointer"; +#endif } /// @@ -299,7 +305,10 @@ protected virtual void hide() /// protected virtual void show() { - gameObject.SetActive(true); + group.alpha = 1; +#if UNITY_EDITOR + gameObject.name = "Pointer"; +#endif } ///