From ff521e031c6fc851162b7e0fe40a131dc489daf3 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Wed, 24 Feb 2016 19:26:50 +0000 Subject: [PATCH 001/211] 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 81b0fd1dd..adbf2f20c 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, 0); + public static readonly Version VERSION = new Version(8, 1); #endregion From 6294838d98eebb696afd8f1053dd66744cd85614 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Wed, 16 Mar 2016 01:17:32 +0300 Subject: [PATCH 002/211] Ignoring test folder. --- Source/.gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Source/.gitignore b/Source/.gitignore index 1e63af9f8..69a627838 100644 --- a/Source/.gitignore +++ b/Source/.gitignore @@ -29,4 +29,6 @@ _ReSharper* *.pdb* *.mdb* -pdb2mdb.bat* \ No newline at end of file +pdb2mdb.bat* + +/Assets/Tests* \ No newline at end of file From f1fd8371d177233eaaad120033cc101d106e5b8d Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Wed, 13 Apr 2016 15:45:16 +0300 Subject: [PATCH 003/211] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e9f70637f..8ef8b21f2 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ Developed by Valentin Simonov at [Interactive Lab](http://interactivelab.ru). 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). +API documentation is available [here](http://touchscript.github.io/docs/index.html). ## Consulting and contract work If you require custom functionality for your project or consulting services please contact me at **v@lent.in**. From 1bfcea82b133634e98cf3d748754ae2857f0cae3 Mon Sep 17 00:00:00 2001 From: o1o1o1o1o2 Date: Wed, 15 Jun 2016 22:43:24 +0300 Subject: [PATCH 004/211] Update GestureEditor.cs --- Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs index 4c5d0220c..5151ad5be 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs @@ -151,6 +151,8 @@ protected virtual void drawLimitTouches() minTouchesFloat = 0; maxTouchesFloat = 10; } + else { minTouchesFloat = (float)minTouches.intValue; maxTouchesFloat = (float)maxTouches.intValue; } + //or this values doesn't change from script properly EditorGUI.indentLevel++; EditorGUILayout.LabelField("Min: " + (int)minTouchesFloat + ", Max: " + (int)maxTouchesFloat); EditorGUILayout.MinMaxSlider(ref minTouchesFloat, ref maxTouchesFloat, 0, 10); From c1a72122ec46fd559111b4a8c07a21e2a32ea11b Mon Sep 17 00:00:00 2001 From: danien Date: Mon, 20 Jun 2016 14:10:55 +0800 Subject: [PATCH 005/211] Fixes incorrect sorting order of hit objects. Using the distance between the center of the hit objects to the cameraPos will result in incorrect or unexpected sort order in the situation if both the objects' centers (transform.position) are not aligned with the camera's in the same axis, or even if one object is significantly larger than the other. Please see http://imgur.com/DUfXSGk for an illustration of the issue. Using the distance between the raycast origin and the point of impact (already provided in RaycastHit2D) gives the correct results. --- Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs b/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs index 9efdaa8ec..48360e7da 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs @@ -132,13 +132,10 @@ private void sortHits(RaycastHit2D[] hits) if (sprite1.sortingOrder > sprite2.sortingOrder) return -1; } - var cameraPos = GetComponent().transform.position; - var distA = (a.transform.position - cameraPos).sqrMagnitude; - var distB = (b.transform.position - cameraPos).sqrMagnitude; - return distA < distB ? -1 : 1; + return a.distance < b.distance ? -1 : 1; }); } #endregion } -} \ No newline at end of file +} From 4fe0f0049d40757fb79636cbb2ab0a7cfe35008f Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 21 Jun 2016 00:29:02 +0300 Subject: [PATCH 006/211] Updated formatting. --- .../TouchScript/Editor/Gestures/GestureEditor.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs index 5151ad5be..0fc79c0f1 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs @@ -151,8 +151,12 @@ protected virtual void drawLimitTouches() minTouchesFloat = 0; maxTouchesFloat = 10; } - else { minTouchesFloat = (float)minTouches.intValue; maxTouchesFloat = (float)maxTouches.intValue; } - //or this values doesn't change from script properly + else + { + minTouchesFloat = (float) minTouches.intValue; + maxTouchesFloat = (float) maxTouches.intValue; + } + //or this values doesn't change from script properly EditorGUI.indentLevel++; EditorGUILayout.LabelField("Min: " + (int)minTouchesFloat + ", Max: " + (int)maxTouchesFloat); EditorGUILayout.MinMaxSlider(ref minTouchesFloat, ref maxTouchesFloat, 0, 10); @@ -340,4 +344,4 @@ private void removeFromArray(SerializedProperty array, int index) #endregion } -} +} \ No newline at end of file From a5c01d289839bc046e657787d695954eff8aed75 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sat, 2 Jul 2016 07:39:00 +0300 Subject: [PATCH 007/211] Renamed *touch* to *pointer*. --- .../Visualizer/TouchVisualizerEditor.cs | 14 +- .../Base/PinnedTransformGestureBaseEditor.cs | 2 +- .../Base/TransformGestureBaseEditor.cs | 4 +- .../Editor/Gestures/FlickGestureEditor.cs | 6 +- .../Editor/Gestures/GestureEditor.cs | 60 +-- .../Editor/Gestures/LongPressGestureEditor.cs | 2 +- .../Gestures/PinnedTransformGestureEditor.cs | 4 +- .../Editor/Gestures/PressGestureEditor.cs | 2 +- .../Editor/Gestures/ReleaseGestureEditor.cs | 2 +- .../Editor/Gestures/TapGestureEditor.cs | 2 +- .../Editor/Gestures/TransformGestureEditor.cs | 4 +- .../InputSources/StandardInputEditor.cs | 4 +- .../TouchScript/Editor/TouchManagerEditor.cs | 6 +- .../Examples/Checkers/Scripts/Exclusive.cs | 2 +- .../TouchScript/Examples/Cube/Cube.unity | 29 +- .../{Touch Hit.prefab => Pointer Hit.prefab} | 2 +- ...it.prefab.meta => Pointer Hit.prefab.meta} | 0 .../Cube/Scripts/CustomPointerProxy.cs | 15 + ...oxy.cs.meta => CustomPointerProxy.cs.meta} | 0 .../Examples/Cube/Scripts/CustomTouchProxy.cs | 15 - .../Examples/Cube/Scripts/LayerDelegate.cs | 6 +- .../Examples/Cube/Scripts/RedirectInput.cs | 66 +-- .../Examples/RawInput/Scripts/Spawner.cs | 10 +- .../TUIO/Scripts/InputSources/TuioInput.cs | 76 ++-- .../{Touch Hit.prefab => Pointer Hit.prefab} | 2 +- ...it.prefab.meta => Pointer Hit.prefab.meta} | 0 ...lizer.prefab => Pointer Visualizer.prefab} | 15 +- ...ab.meta => Pointer Visualizer.prefab.meta} | 0 .../Behaviors/TouchScriptInputModule.cs | 90 ++-- .../{TouchProxy.cs => PointerProxy.cs} | 64 +-- ...ouchProxy.cs.meta => PointerProxy.cs.meta} | 0 .../Behaviors/Visualizer/PointerVisualizer.cs | 218 ++++++++++ ...izer.cs.meta => PointerVisualizer.cs.meta} | 0 .../Behaviors/Visualizer/TouchVisualizer.cs | 218 ---------- .../TouchScript/Scripts/Clusters/Clusters.cs | 52 +-- .../Scripts/GestureManagerInstance.cs | 166 ++++---- .../Base/PinnedTransformGestureBase.cs | 49 ++- .../Gestures/Base/TransformGestureBase.cs | 88 ++-- .../ClusteredPinnedTransformGesture.cs | 8 +- .../ClusteredScreenTransformGesture.cs | 28 +- .../Clustered/ClusteredTransformGesture.cs | 28 +- .../Scripts/Gestures/FlickGesture.cs | 32 +- .../TouchScript/Scripts/Gestures/Gesture.cs | 384 +++++++++--------- .../Scripts/Gestures/IGestureDelegate.cs | 8 +- .../Scripts/Gestures/LongPressGesture.cs | 24 +- .../Scripts/Gestures/MetaGesture.cs | 118 +++--- .../Gestures/PinnedTransformGesture.cs | 33 +- .../Scripts/Gestures/PressGesture.cs | 14 +- .../Scripts/Gestures/ReleaseGesture.cs | 16 +- .../Scripts/Gestures/TapGesture.cs | 42 +- .../Scripts/Gestures/TransformGesture.cs | 14 +- .../Scripts/Gestures/UI/UIGesture.cs | 114 +++--- .../Assets/TouchScript/Scripts/Hit/HitTest.cs | 12 +- .../TouchScript/Scripts/Hit/TouchHit.cs | 32 +- .../TouchScript/Scripts/Hit/Untouchable.cs | 10 +- .../TouchScript/Scripts/ITouchManager.cs | 114 +++--- .../InputSources/ICoordinatesRemapper.cs | 6 +- .../Scripts/InputSources/IInputSource.cs | 14 +- .../InputHandlers/MouseHandler.cs | 70 ++-- .../InputHandlers/TouchHandler.cs | 90 ++-- ...hHandlers.cs => WindowsPointerHandlers.cs} | 72 ++-- ...cs.meta => WindowsPointerHandlers.cs.meta} | 0 .../Scripts/InputSources/InputSource.cs | 44 +- .../Scripts/InputSources/MobileInput.cs | 14 +- .../Scripts/InputSources/MouseInput.cs | 14 +- .../Scripts/InputSources/StandardInput.cs | 88 ++-- .../TouchScript/Scripts/Layers/CameraLayer.cs | 2 +- .../Scripts/Layers/CameraLayer2D.cs | 2 +- .../Scripts/Layers/FullscreenLayer.cs | 8 +- .../Scripts/Layers/ILayerDelegate.cs | 6 +- .../Scripts/Layers/ProjectionParams.cs | 2 +- .../TouchScript/Scripts/Layers/TouchLayer.cs | 100 ++--- .../TouchScript/Scripts/Layers/UILayer.cs | 6 +- .../Scripts/{TouchPoint.cs => Pointer.cs} | 36 +- .../{TouchPoint.cs.meta => Pointer.cs.meta} | 0 Source/Assets/TouchScript/Scripts/Tags.cs | 2 +- .../TouchScript/Scripts/TouchManager.cs | 100 ++--- .../Scripts/TouchManagerInstance.cs | 354 ++++++++-------- .../TouchScript/Scripts/Utils/ClusterUtils.cs | 40 +- .../TouchScript/Scripts/Utils/Geom/TwoD.cs | 2 +- .../TouchScript/Scripts/Utils/PointerUtils.cs | 43 ++ ...ouchUtils.cs.meta => PointerUtils.cs.meta} | 0 .../Scripts/Utils/ProjectionUtils.cs | 1 - .../TouchScript/Scripts/Utils/TouchUtils.cs | 43 -- 84 files changed, 1748 insertions(+), 1737 deletions(-) rename Source/Assets/TouchScript/Examples/Cube/Prefabs/{Touch Hit.prefab => Pointer Hit.prefab} (99%) rename Source/Assets/TouchScript/Examples/Cube/Prefabs/{Touch Hit.prefab.meta => Pointer Hit.prefab.meta} (100%) create mode 100644 Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs rename Source/Assets/TouchScript/Examples/Cube/Scripts/{CustomTouchProxy.cs.meta => CustomPointerProxy.cs.meta} (100%) delete mode 100644 Source/Assets/TouchScript/Examples/Cube/Scripts/CustomTouchProxy.cs rename Source/Assets/TouchScript/Prefabs/{Touch Hit.prefab => Pointer Hit.prefab} (99%) rename Source/Assets/TouchScript/Prefabs/{Touch Hit.prefab.meta => Pointer Hit.prefab.meta} (100%) rename Source/Assets/TouchScript/Prefabs/{Touch Visualizer.prefab => Pointer Visualizer.prefab} (87%) rename Source/Assets/TouchScript/Prefabs/{Touch Visualizer.prefab.meta => Pointer Visualizer.prefab.meta} (100%) rename Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/{TouchProxy.cs => PointerProxy.cs} (65%) rename Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/{TouchProxy.cs.meta => PointerProxy.cs.meta} (100%) create mode 100644 Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs rename Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/{TouchVisualizer.cs.meta => PointerVisualizer.cs.meta} (100%) delete mode 100644 Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/TouchVisualizer.cs rename Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/{WindowsTouchHandlers.cs => WindowsPointerHandlers.cs} (85%) rename Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/{WindowsTouchHandlers.cs.meta => WindowsPointerHandlers.cs.meta} (100%) rename Source/Assets/TouchScript/Scripts/{TouchPoint.cs => Pointer.cs} (79%) rename Source/Assets/TouchScript/Scripts/{TouchPoint.cs.meta => Pointer.cs.meta} (100%) create mode 100644 Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs rename Source/Assets/TouchScript/Scripts/Utils/{TouchUtils.cs.meta => PointerUtils.cs.meta} (100%) delete mode 100644 Source/Assets/TouchScript/Scripts/Utils/TouchUtils.cs diff --git a/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs b/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs index 1c591e758..44fb4c1c8 100644 --- a/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs +++ b/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs @@ -6,7 +6,7 @@ namespace TouchScript.Editor.Behaviors.Visualizer { - [CustomEditor(typeof(TouchVisualizer))] + [CustomEditor(typeof(PointerVisualizer))] internal sealed class TouchVisualizerEditor : UnityEditor.Editor { @@ -14,11 +14,11 @@ internal sealed class TouchVisualizerEditor : UnityEditor.Editor private void OnEnable() { - showTouchId = serializedObject.FindProperty("showTouchId"); + showTouchId = serializedObject.FindProperty("showPointerId"); showTags = serializedObject.FindProperty("showTags"); - touchProxy = serializedObject.FindProperty("touchProxy"); + touchProxy = serializedObject.FindProperty("pointerProxy"); useDPI = serializedObject.FindProperty("useDPI"); - touchSize = serializedObject.FindProperty("touchSize"); + touchSize = serializedObject.FindProperty("pointerSize"); } public override void OnInspectorGUI() @@ -26,15 +26,15 @@ public override void OnInspectorGUI() serializedObject.Update(); EditorGUI.BeginChangeCheck(); - EditorGUILayout.PropertyField(touchProxy, new GUIContent("Touch Proxy")); - EditorGUILayout.PropertyField(showTouchId, new GUIContent("Show Touch Id")); + EditorGUILayout.PropertyField(touchProxy, new GUIContent("Pointer Proxy")); + EditorGUILayout.PropertyField(showTouchId, new GUIContent("Show Pointer Id")); EditorGUILayout.PropertyField(showTags, new GUIContent("Show Tags")); EditorGUILayout.PropertyField(useDPI, new GUIContent("Use DPI")); if (useDPI.boolValue) { EditorGUI.BeginChangeCheck(); - EditorGUILayout.PropertyField(touchSize, new GUIContent("Touch Size (cm)")); + EditorGUILayout.PropertyField(touchSize, new GUIContent("Pointer Size (cm)")); } serializedObject.ApplyModifiedProperties(); diff --git a/Source/Assets/TouchScript/Editor/Gestures/Base/PinnedTransformGestureBaseEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/Base/PinnedTransformGestureBaseEditor.cs index 6c9ab7b54..e30f044f5 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/Base/PinnedTransformGestureBaseEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/Base/PinnedTransformGestureBaseEditor.cs @@ -13,7 +13,7 @@ internal class PinnedTransformGestureBaseEditor : GestureEditor public static readonly GUIContent TYPE = new GUIContent("Transform Type", "Specifies what gestures should be detected: Rotation, Scaling."); public static readonly GUIContent TYPE_ROTATION = new GUIContent("Rotation", "Rotating with two or more fingers."); public static readonly GUIContent TYPE_SCALING = new GUIContent("Scaling", "Scaling with two or more fingers."); - public static readonly GUIContent SCREEN_TRANSFORM_THRESHOLD = new GUIContent("Movement Threshold (cm)", "Minimum distance in cm touch points must move for the gesture to begin."); + public static readonly GUIContent SCREEN_TRANSFORM_THRESHOLD = new GUIContent("Movement Threshold (cm)", "Minimum distance in cm pointers must move for the gesture to begin."); protected SerializedProperty type; protected SerializedProperty screenTransformThreshold; diff --git a/Source/Assets/TouchScript/Editor/Gestures/Base/TransformGestureBaseEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/Base/TransformGestureBaseEditor.cs index c5fc0ad99..149ce164a 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/Base/TransformGestureBaseEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/Base/TransformGestureBaseEditor.cs @@ -14,8 +14,8 @@ internal class TransformGestureBaseEditor : GestureEditor public static readonly GUIContent TYPE_TRANSLATION = new GUIContent("Translation", "Dragging with one ore more fingers."); public static readonly GUIContent TYPE_ROTATION = new GUIContent("Rotation", "Rotating with two or more fingers."); public static readonly GUIContent TYPE_SCALING = new GUIContent("Scaling", "Scaling with two or more fingers."); - public static readonly GUIContent MIN_SCREEN_POINTS_DISTANCE = new GUIContent("Min Points Distance (cm)", "Minimum distance between two points (clusters) in cm to consider this gesture started. Used to prevent fake touch points spawned near real ones on cheap multitouch hardware to mess everything up."); - public static readonly GUIContent SCREEN_TRANSFORM_THRESHOLD = new GUIContent("Movement Threshold (cm)", "Minimum distance in cm touch points must move for the gesture to begin."); + public static readonly GUIContent 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 SCREEN_TRANSFORM_THRESHOLD = new GUIContent("Movement Threshold (cm)", "Minimum distance in cm pointers must move for the gesture to begin."); protected SerializedProperty type; protected SerializedProperty minScreenPointsDistance; diff --git a/Source/Assets/TouchScript/Editor/Gestures/FlickGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/FlickGestureEditor.cs index 9753477bb..68e7918db 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/FlickGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/FlickGestureEditor.cs @@ -12,9 +12,9 @@ namespace TouchScript.Editor.Gestures internal sealed class FlickGestureEditor : GestureEditor { private static readonly GUIContent DIRECTION = new GUIContent("Direction", "Flick direction."); - private static readonly GUIContent MOVEMENT_THRESHOLD = new GUIContent("Movement Threshold (cm)", "Minimum distance in cm touch points must move for the gesture to begin."); - private static readonly GUIContent FLICK_TIME = new GUIContent("Flick Time (sec)", "Time interval in seconds during which touch points must move by for the gesture to be recognized."); - private static readonly GUIContent MIN_DISTANCE = new GUIContent("Minimum Distance (cm)", "Minimum distance in cm touch points must move in seconds for the gesture to be recognized."); + private static readonly GUIContent MOVEMENT_THRESHOLD = new GUIContent("Movement Threshold (cm)", "Minimum distance in cm pointers must move for the gesture to begin."); + private 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."); + private 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; private SerializedProperty flickTime; diff --git a/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs index 0fc79c0f1..08d8d394a 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs @@ -22,10 +22,10 @@ internal class GestureEditor : UnityEditor.Editor private static readonly GUIContent USE_SEND_MESSAGE = new GUIContent("Use SendMessage", "If you use UnityScript or prefer using Unity Messages you can turn them on with this option."); private static readonly GUIContent 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."); private static readonly GUIContent SEND_MESSAGE_TARGET = new GUIContent("Target", "The GameObject target of Unity Messages. If null, host GameObject is used."); - private static readonly GUIContent COMBINE_TOUCH_POINTS = new GUIContent("Combine Touch Points", "When several fingers are used to perform a tap, touch points released not earlier than seconds ago are used to calculate gesture's final screen position."); - private static readonly GUIContent COMBINE_TOUCH_POINTS_INTERVAL = new GUIContent("Combine Interval (sec)", COMBINE_TOUCH_POINTS.tooltip); + private static readonly GUIContent 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."); + private static readonly GUIContent COMBINE_TOUCH_POINTERS = new GUIContent("Combine Interval (sec)", COMBINE_POINTERS.tooltip); private static readonly GUIContent REQUIRE_GESTURE_TO_FAIL = new GUIContent("Require Other Gesture to Fail", "Gesture which must fail for this gesture to start."); - private static readonly GUIContent LIMIT_TOUCHES = new GUIContent("Limit Touches", ""); + private static readonly GUIContent LIMIT_POINTERS = new GUIContent("Limit Pointers", ""); protected bool shouldDrawCombineTouches = false; @@ -33,13 +33,13 @@ internal class GestureEditor : UnityEditor.Editor private SerializedProperty debugMode; private SerializedProperty friendlyGestures; private SerializedProperty requireGestureToFail; - private SerializedProperty minTouches, maxTouches; - private SerializedProperty combineTouches, combineTouchesInterval; + private SerializedProperty minPointers, maxPointers; + private SerializedProperty combinePointers, combinePointersInterval; private SerializedProperty useSendMessage, sendMessageTarget, sendStateChangeMessages; private ReorderableList friendlyGesturesList; private int indexToRemove = -1; - private float minTouchesFloat, maxTouchesFloat; + private float minPointersFloat, maxPointersFloat; protected virtual void OnEnable() { @@ -49,16 +49,16 @@ protected virtual void OnEnable() debugMode = serializedObject.FindProperty("debugMode"); friendlyGestures = serializedObject.FindProperty("friendlyGestures"); requireGestureToFail = serializedObject.FindProperty("requireGestureToFail"); - combineTouches = serializedObject.FindProperty("combineTouches"); - combineTouchesInterval = serializedObject.FindProperty("combineTouchesInterval"); + combinePointers = serializedObject.FindProperty("combinePointers"); + combinePointersInterval = serializedObject.FindProperty("combinePointersInterval"); useSendMessage = serializedObject.FindProperty("useSendMessage"); sendMessageTarget = serializedObject.FindProperty("sendMessageTarget"); sendStateChangeMessages = serializedObject.FindProperty("sendStateChangeMessages"); - minTouches = serializedObject.FindProperty("minTouches"); - maxTouches = serializedObject.FindProperty("maxTouches"); + minPointers = serializedObject.FindProperty("minPointers"); + maxPointers = serializedObject.FindProperty("maxPointers"); - minTouchesFloat = minTouches.intValue; - maxTouchesFloat = maxTouches.intValue; + minPointersFloat = minPointers.intValue; + maxPointersFloat = maxPointers.intValue; friendlyGesturesList = new ReorderableList(serializedObject, friendlyGestures, false, false, false, true); friendlyGesturesList.headerHeight = 0; @@ -126,14 +126,14 @@ protected virtual void drawCombineTouches() { if (shouldDrawCombineTouches) { - EditorGUILayout.PropertyField(combineTouches, COMBINE_TOUCH_POINTS); - if (combineTouches.boolValue) + EditorGUILayout.PropertyField(combinePointers, COMBINE_POINTERS); + if (combinePointers.boolValue) { EditorGUIUtility.labelWidth = 160; EditorGUILayout.BeginHorizontal(); GUILayout.Label(GUIContent.none, GUILayout.Width(10)); EditorGUILayout.BeginVertical(GUILayout.ExpandWidth(true)); - EditorGUILayout.PropertyField(combineTouchesInterval, COMBINE_TOUCH_POINTS_INTERVAL); + EditorGUILayout.PropertyField(combinePointersInterval, COMBINE_TOUCH_POINTERS); EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); } @@ -142,37 +142,37 @@ protected virtual void drawCombineTouches() protected virtual void drawLimitTouches() { - var limitTouches = (minTouches.intValue > 0) || (maxTouches.intValue > 0); - var newLimitTouches = EditorGUILayout.ToggleLeft(LIMIT_TOUCHES, limitTouches); - if (newLimitTouches) + var limitPointers = (minPointers.intValue > 0) || (maxPointers.intValue > 0); + var newLimitPointers = EditorGUILayout.ToggleLeft(LIMIT_POINTERS, limitPointers); + if (newLimitPointers) { - if (!limitTouches) + if (!limitPointers) { - minTouchesFloat = 0; - maxTouchesFloat = 10; + minPointersFloat = 0; + maxPointersFloat = 10; } else { - minTouchesFloat = (float) minTouches.intValue; - maxTouchesFloat = (float) maxTouches.intValue; + minPointersFloat = (float) minPointers.intValue; + maxPointersFloat = (float) maxPointers.intValue; } //or this values doesn't change from script properly EditorGUI.indentLevel++; - EditorGUILayout.LabelField("Min: " + (int)minTouchesFloat + ", Max: " + (int)maxTouchesFloat); - EditorGUILayout.MinMaxSlider(ref minTouchesFloat, ref maxTouchesFloat, 0, 10); + EditorGUILayout.LabelField("Min: " + (int)minPointersFloat + ", Max: " + (int)maxPointersFloat); + EditorGUILayout.MinMaxSlider(ref minPointersFloat, ref maxPointersFloat, 0, 10); EditorGUI.indentLevel--; } else { - if (limitTouches) + if (limitPointers) { - minTouchesFloat = 0; - maxTouchesFloat = 0; + minPointersFloat = 0; + maxPointersFloat = 0; } } - minTouches.intValue = (int)minTouchesFloat; - maxTouches.intValue = (int)maxTouchesFloat; + minPointers.intValue = (int)minPointersFloat; + maxPointers.intValue = (int)maxPointersFloat; } protected virtual void drawRequireToFail() diff --git a/Source/Assets/TouchScript/Editor/Gestures/LongPressGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/LongPressGestureEditor.cs index 74ac0e849..bba6573f6 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/LongPressGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/LongPressGestureEditor.cs @@ -11,7 +11,7 @@ namespace TouchScript.Editor.Gestures [CustomEditor(typeof(LongPressGesture), true)] internal sealed class LongPressGestureEditor : GestureEditor { - private static readonly GUIContent TIME_TO_PRESS = new GUIContent("Time to Press (sec)", "Limit maximum number of simultaneous touch points."); + private static readonly GUIContent TIME_TO_PRESS = new GUIContent("Time to Press (sec)", "Limit maximum number of simultaneous pointers."); private static readonly GUIContent DISTANCE_LIMIT = new GUIContent("Limit Movement (cm)", "Gesture fails if fingers move more than cm."); private SerializedProperty distanceLimit; diff --git a/Source/Assets/TouchScript/Editor/Gestures/PinnedTransformGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/PinnedTransformGestureEditor.cs index 3830971c6..f5946a0d4 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/PinnedTransformGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/PinnedTransformGestureEditor.cs @@ -12,8 +12,8 @@ namespace TouchScript.Editor.Gestures [CustomEditor(typeof(PinnedTransformGesture), true)] internal class PinnedTransformGestureEditor : PinnedTransformGestureBaseEditor { - private static readonly GUIContent PROJECTION = new GUIContent("Projection Type", "Method used to project 2d screen positions of touch points into 3d space."); - private static readonly GUIContent PROJECTION_NORMAL = new GUIContent("Projection Normal", "Normal of the plane in 3d space where touch points' positions are projected."); + private static readonly GUIContent PROJECTION = new GUIContent("Projection Type", "Method used to project 2d screen positions of pointers into 3d space."); + private static readonly GUIContent PROJECTION_NORMAL = new GUIContent("Projection Normal", "Normal of the plane in 3d space where pointers' positions are projected."); private SerializedProperty projection; private SerializedProperty projectionPlaneNormal; diff --git a/Source/Assets/TouchScript/Editor/Gestures/PressGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/PressGestureEditor.cs index 1293e37c1..85d9e71ea 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/PressGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/PressGestureEditor.cs @@ -11,7 +11,7 @@ namespace TouchScript.Editor.Gestures [CustomEditor(typeof(PressGesture), true)] internal sealed class PressGestureEditor : GestureEditor { - private static readonly GUIContent IGNORE_CHILDREN = new GUIContent("Ignore Children", "If selected this gesture ignores touch points from children."); + private static readonly GUIContent IGNORE_CHILDREN = new GUIContent("Ignore Children", "If selected this gesture ignores pointers from children."); private SerializedProperty ignoreChildren; diff --git a/Source/Assets/TouchScript/Editor/Gestures/ReleaseGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/ReleaseGestureEditor.cs index 28b711f13..cde880273 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/ReleaseGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/ReleaseGestureEditor.cs @@ -11,7 +11,7 @@ namespace TouchScript.Editor.Gestures [CustomEditor(typeof(ReleaseGesture), true)] internal sealed class ReleaseGestureEditor : GestureEditor { - private static readonly GUIContent IGNORE_CHILDREN = new GUIContent("Ignore Children", "If selected this gesture ignores touch points from children."); + private static readonly GUIContent IGNORE_CHILDREN = new GUIContent("Ignore Children", "If selected this gesture ignores pointers from children."); private SerializedProperty ignoreChildren; diff --git a/Source/Assets/TouchScript/Editor/Gestures/TapGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/TapGestureEditor.cs index 3cf54b49e..b7a81ebc9 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/TapGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/TapGestureEditor.cs @@ -12,7 +12,7 @@ namespace TouchScript.Editor.Gestures internal sealed class TapGestureEditor : GestureEditor { private static readonly GUIContent TIME_LIMIT = new GUIContent("Limit Time (sec)", "Gesture fails if in seconds user didn't do the required number of taps."); - private static readonly GUIContent DISTANCE_LIMIT = new GUIContent("Limit Movement (cm)", "Gesture fails if taps are made more than cm away from the first touch position."); + private static readonly GUIContent DISTANCE_LIMIT = new GUIContent("Limit Movement (cm)", "Gesture fails if taps are made more than cm away from the first pointer position."); private static readonly GUIContent NUMBER_OF_TAPS_REQUIRED = new GUIContent("Number of Taps Required", "Number of taps required for this gesture to be recognized."); private SerializedProperty numberOfTapsRequired; diff --git a/Source/Assets/TouchScript/Editor/Gestures/TransformGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/TransformGestureEditor.cs index 2df7a88d5..39b55a77b 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/TransformGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/TransformGestureEditor.cs @@ -12,8 +12,8 @@ namespace TouchScript.Editor.Gestures [CustomEditor(typeof(TransformGesture), true)] internal class TransformGestureEditor : TransformGestureBaseEditor { - private static readonly GUIContent PROJECTION = new GUIContent("Projection Type", "Method used to project 2d screen positions of touch points into 3d space."); - private static readonly GUIContent PROJECTION_NORMAL = new GUIContent("Projection Normal", "Normal of the plane in 3d space where touch points' positions are projected."); + private static readonly GUIContent PROJECTION = new GUIContent("Projection Type", "Method used to project 2d screen positions of pointers into 3d space."); + private static readonly GUIContent PROJECTION_NORMAL = new GUIContent("Projection Normal", "Normal of the plane in 3d space where pointers' positions are projected."); private SerializedProperty projection; private SerializedProperty projectionPlaneNormal; diff --git a/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs b/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs index 9daf62c5d..7facbcb33 100644 --- a/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs +++ b/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs @@ -23,8 +23,8 @@ protected override void OnEnable() touchTags = serializedObject.FindProperty("TouchTags"); mouseTags = serializedObject.FindProperty("MouseTags"); penTags = serializedObject.FindProperty("PenTags"); - windows8Touch = serializedObject.FindProperty("Windows8Touch"); - windows7Touch = serializedObject.FindProperty("Windows7Touch"); + windows8Touch = serializedObject.FindProperty("Windows8API"); + windows7Touch = serializedObject.FindProperty("Windows7API"); webPlayerTouch = serializedObject.FindProperty("WebPlayerTouch"); webGLTouch = serializedObject.FindProperty("WebGLTouch"); windows8Mouse = serializedObject.FindProperty("Windows8Mouse"); diff --git a/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs b/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs index 32d023582..4b46bced8 100644 --- a/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs +++ b/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs @@ -17,12 +17,12 @@ namespace TouchScript.Editor internal sealed class TouchManagerEditor : UnityEditor.Editor { private static readonly GUIContent DISPLAY_DEVICE = new GUIContent("Display Device", "Display device properties where such parameters as target DPI are stored."); - private static readonly GUIContent 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 touch input from some device."); + private static readonly GUIContent 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."); private static readonly GUIContent CREATE_STANDARD_INPUT = new GUIContent("Create Standard Input", ""); private static readonly GUIContent USE_SEND_MESSAGE = new GUIContent("Use SendMessage", "If you use UnityScript or prefer using Unity Messages you can turn them on with this option."); private static readonly GUIContent SEND_MESSAGE_TARGET = new GUIContent("SendMessage Target", "The GameObject target of Unity Messages. If null, host GameObject is used."); private static readonly GUIContent SEND_MESSAGE_EVENTS = new GUIContent("SendMessage Events", "Which events should be sent as Unity Messages."); - private static readonly GUIContent LAYERS_HEADER = new GUIContent("Touch Layers", "Sorted array of Touch Layers in the scene."); + private static readonly GUIContent LAYERS_HEADER = new GUIContent("Pointer Layers", "Sorted array of Pointer Layers in the scene."); private TouchManager instance; private ReorderableList layersList; @@ -133,4 +133,4 @@ private void refresh() serializedObject.ApplyModifiedProperties(); } } -} +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Examples/Checkers/Scripts/Exclusive.cs b/Source/Assets/TouchScript/Examples/Checkers/Scripts/Exclusive.cs index 70e05c42f..33eb305a8 100644 --- a/Source/Assets/TouchScript/Examples/Checkers/Scripts/Exclusive.cs +++ b/Source/Assets/TouchScript/Examples/Checkers/Scripts/Exclusive.cs @@ -45,7 +45,7 @@ public bool ShouldBegin(Gesture gesture) return true; } - public bool ShouldReceiveTouch(Gesture gesture, TouchPoint touch) + public bool ShouldReceivePointer(Gesture gesture, Pointer pointer) { if (exclusive) return gesture == Target; return true; diff --git a/Source/Assets/TouchScript/Examples/Cube/Cube.unity b/Source/Assets/TouchScript/Examples/Cube/Cube.unity index 018a5d0fd..c3e94de74 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Cube.unity +++ b/Source/Assets/TouchScript/Examples/Cube/Cube.unity @@ -370,8 +370,8 @@ MonoBehaviour: PenTags: tagList: - Pen - Windows8Touch: 0 - Windows7Touch: 0 + Windows8API: 0 + Windows7API: 0 WebPlayerTouch: 1 WebGLTouch: 1 Windows8Mouse: 1 @@ -762,10 +762,10 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -1220,6 +1220,15 @@ Prefab: value: objectReference: {fileID: 11468960, guid: 55576da10f8e2478e9aec42a40f85554, type: 2} + - target: {fileID: 22401058, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 11400000, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} + propertyPath: pointerProxy + value: + objectReference: {fileID: 11468960, guid: 55576da10f8e2478e9aec42a40f85554, + type: 2} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: c0dc5781cae4a6348b42ea6b818a3f9c, type: 2} m_IsPrefabParent: 0 @@ -1269,10 +1278,10 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} diff --git a/Source/Assets/TouchScript/Examples/Cube/Prefabs/Touch Hit.prefab b/Source/Assets/TouchScript/Examples/Cube/Prefabs/Pointer Hit.prefab similarity index 99% rename from Source/Assets/TouchScript/Examples/Cube/Prefabs/Touch Hit.prefab rename to Source/Assets/TouchScript/Examples/Cube/Prefabs/Pointer Hit.prefab index 6ace63305..a6e8459e7 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Prefabs/Touch Hit.prefab +++ b/Source/Assets/TouchScript/Examples/Cube/Prefabs/Pointer Hit.prefab @@ -30,7 +30,7 @@ GameObject: - 114: {fileID: 11454912} - 114: {fileID: 11468960} m_Layer: 0 - m_Name: Touch Hit + m_Name: Pointer Hit m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 diff --git a/Source/Assets/TouchScript/Examples/Cube/Prefabs/Touch Hit.prefab.meta b/Source/Assets/TouchScript/Examples/Cube/Prefabs/Pointer Hit.prefab.meta similarity index 100% rename from Source/Assets/TouchScript/Examples/Cube/Prefabs/Touch Hit.prefab.meta rename to Source/Assets/TouchScript/Examples/Cube/Prefabs/Pointer Hit.prefab.meta diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs new file mode 100644 index 000000000..f3f6a7a25 --- /dev/null +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs @@ -0,0 +1,15 @@ +using UnityEngine; +using System.Collections; +using TouchScript.Behaviors.Visualizer; + +namespace TouchScript.Examples.Cube +{ + public class CustomPointerProxy : TouchScript.Behaviors.Visualizer.PointerProxy + { + protected override void updateOnce(Pointer pointer) { + if (pointer.InputSource is RedirectInput) Hide(); + + base.updateOnce(pointer); + } + } +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomTouchProxy.cs.meta b/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Examples/Cube/Scripts/CustomTouchProxy.cs.meta rename to Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs.meta diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomTouchProxy.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomTouchProxy.cs deleted file mode 100644 index 02e0b4321..000000000 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomTouchProxy.cs +++ /dev/null @@ -1,15 +0,0 @@ -using UnityEngine; -using System.Collections; -using TouchScript.Behaviors.Visualizer; - -namespace TouchScript.Examples.Cube -{ - public class CustomTouchProxy : TouchScript.Behaviors.Visualizer.TouchProxy - { - protected override void updateOnce(TouchPoint touch) { - if (touch.InputSource is RedirectInput) Hide(); - - base.updateOnce(touch); - } - } -} \ 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 2e438fd55..7be3df4cb 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/LayerDelegate.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/LayerDelegate.cs @@ -9,11 +9,11 @@ public class LayerDelegate : MonoBehaviour, ILayerDelegate public RedirectInput Source; public TouchLayer RenderTextureLayer; - public bool ShouldReceiveTouch(TouchLayer layer, TouchPoint touch) + public bool ShouldReceivePointer(TouchLayer layer, Pointer pointer) { if (layer == RenderTextureLayer) - return touch.InputSource == Source; - return touch.InputSource != Source; + return pointer.InputSource == Source; + return pointer.InputSource != Source; } } } diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs index 4ca8a02d5..87722c8c3 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs @@ -15,16 +15,16 @@ public class RedirectInput : InputSource private MetaGesture gesture; private Dictionary map = new Dictionary(); - public override void CancelTouch(TouchPoint touch, bool @return) + public override void CancelPointer(Pointer pointer, bool @return) { - base.CancelTouch(touch, @return); + base.CancelPointer(pointer, @return); - map.Remove(touch.Id); + map.Remove(pointer.Id); if (@return) { TouchHit hit; - if (!gesture.GetTargetHitResult(touch.Position, out hit)) return; - map.Add(touch.Id, beginTouch(processCoords(hit.RaycastHit.textureCoord), touch.Tags).Id); + if (!gesture.GetTargetHitResult(pointer.Position, out hit)) return; + map.Add(pointer.Id, beginPointer(processCoords(hit.RaycastHit.textureCoord), pointer.Tags).Id); } } @@ -34,10 +34,10 @@ protected override void OnEnable() gesture = GetComponent(); if (gesture) { - gesture.TouchBegan += touchBeganHandler; - gesture.TouchMoved += touchMovedhandler; - gesture.TouchCancelled += touchCancelledhandler; - gesture.TouchEnded += touchEndedHandler; + gesture.PointerBegan += pointerBeganHandler; + gesture.PointerMoved += pointerMovedhandler; + gesture.PointerCancelled += pointerCancelledhandler; + gesture.PointerEnded += pointerEndedHandler; } } @@ -47,10 +47,10 @@ protected override void OnDisable() if (gesture) { - gesture.TouchBegan -= touchBeganHandler; - gesture.TouchMoved -= touchMovedhandler; - gesture.TouchCancelled -= touchCancelledhandler; - gesture.TouchEnded -= touchEndedHandler; + gesture.PointerBegan -= pointerBeganHandler; + gesture.PointerMoved -= pointerMovedhandler; + gesture.PointerCancelled -= pointerCancelledhandler; + gesture.PointerEnded -= pointerEndedHandler; } } @@ -59,40 +59,40 @@ private Vector2 processCoords(Vector2 value) return new Vector2(value.x * Width, value.y * Height); } - private void touchBeganHandler(object sender, MetaGestureEventArgs metaGestureEventArgs) + private void pointerBeganHandler(object sender, MetaGestureEventArgs metaGestureEventArgs) { - var touch = metaGestureEventArgs.Touch; - if (touch.InputSource == this) return; - map.Add(touch.Id, beginTouch(processCoords(touch.Hit.RaycastHit.textureCoord), touch.Tags).Id); + var pointer = metaGestureEventArgs.Pointer; + if (pointer.InputSource == this) return; + map.Add(pointer.Id, beginPointer(processCoords(pointer.Hit.RaycastHit.textureCoord), pointer.Tags).Id); } - private void touchMovedhandler(object sender, MetaGestureEventArgs metaGestureEventArgs) + private void pointerMovedhandler(object sender, MetaGestureEventArgs metaGestureEventArgs) { int id; TouchHit hit; - var touch = metaGestureEventArgs.Touch; - if (touch.InputSource == this) return; - if (!map.TryGetValue(touch.Id, out id)) return; - if (!gesture.GetTargetHitResult(touch.Position, out hit)) return; - moveTouch(id, processCoords(hit.RaycastHit.textureCoord)); + var pointer = metaGestureEventArgs.Pointer; + if (pointer.InputSource == this) return; + if (!map.TryGetValue(pointer.Id, out id)) return; + if (!gesture.GetTargetHitResult(pointer.Position, out hit)) return; + movePointer(id, processCoords(hit.RaycastHit.textureCoord)); } - private void touchEndedHandler(object sender, MetaGestureEventArgs metaGestureEventArgs) + private void pointerEndedHandler(object sender, MetaGestureEventArgs metaGestureEventArgs) { int id; - var touch = metaGestureEventArgs.Touch; - if (touch.InputSource == this) return; - if (!map.TryGetValue(touch.Id, out id)) return; - endTouch(id); + var pointer = metaGestureEventArgs.Pointer; + if (pointer.InputSource == this) return; + if (!map.TryGetValue(pointer.Id, out id)) return; + endPointer(id); } - private void touchCancelledhandler(object sender, MetaGestureEventArgs metaGestureEventArgs) + private void pointerCancelledhandler(object sender, MetaGestureEventArgs metaGestureEventArgs) { int id; - var touch = metaGestureEventArgs.Touch; - if (touch.InputSource == this) return; - if (!map.TryGetValue(touch.Id, out id)) return; - cancelTouch(id); + var pointer = metaGestureEventArgs.Pointer; + if (pointer.InputSource == this) return; + if (!map.TryGetValue(pointer.Id, out id)) return; + cancelPointer(id); } } diff --git a/Source/Assets/TouchScript/Examples/RawInput/Scripts/Spawner.cs b/Source/Assets/TouchScript/Examples/RawInput/Scripts/Spawner.cs index 0a74550ad..275aeace7 100644 --- a/Source/Assets/TouchScript/Examples/RawInput/Scripts/Spawner.cs +++ b/Source/Assets/TouchScript/Examples/RawInput/Scripts/Spawner.cs @@ -14,7 +14,7 @@ private void OnEnable() { if (TouchManager.Instance != null) { - TouchManager.Instance.TouchesBegan += touchesBeganHandler; + TouchManager.Instance.PointersBegan += pointersBeganHandler; } } @@ -22,7 +22,7 @@ private void OnDisable() { if (TouchManager.Instance != null) { - TouchManager.Instance.TouchesBegan -= touchesBeganHandler; + TouchManager.Instance.PointersBegan -= pointersBeganHandler; } } @@ -33,11 +33,11 @@ private void spawnPrefabAt(Vector2 position) obj.transform.rotation = transform.rotation; } - private void touchesBeganHandler(object sender, TouchEventArgs e) + private void pointersBeganHandler(object sender, PointerEventArgs e) { - foreach (var point in e.Touches) + foreach (var pointer in e.Pointers) { - spawnPrefabAt(point.Position); + spawnPrefabAt(pointer.Position); } } } diff --git a/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs b/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs index 32c55e7a1..8495bffd0 100644 --- a/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs +++ b/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs @@ -22,7 +22,7 @@ public sealed class TuioInput : InputSource #region Constants /// - /// TUIO tag used for touches. + /// TUIO tag used for pointers. /// public const string SOURCE_TUIO = "TUIO"; @@ -33,7 +33,7 @@ public sealed class TuioInput : InputSource public enum InputType { /// - /// Touch/pointer. + /// Pointer. /// Cursors = 1 << 0, @@ -139,9 +139,9 @@ public Tags ObjectTags private ObjectProcessor objectProcessor; private BlobProcessor blobProcessor; - private Dictionary cursorToInternalId = new Dictionary(); - private Dictionary blobToInternalId = new Dictionary(); - private Dictionary objectToInternalId = new Dictionary(); + private Dictionary cursorToInternalId = new Dictionary(); + private Dictionary blobToInternalId = new Dictionary(); + private Dictionary objectToInternalId = new Dictionary(); private int screenWidth; private int screenHeight; @@ -158,15 +158,15 @@ public override void UpdateInput() } /// - public override void CancelTouch(TouchPoint touch, bool @return) + public override void CancelPointer(Pointer pointer, bool @return) { - base.CancelTouch(touch, @return); + base.CancelPointer(pointer, @return); lock (this) { TuioCursor cursor = null; foreach (var touchPoint in cursorToInternalId) { - if (touchPoint.Value.Id == touch.Id) + if (touchPoint.Value.Id == pointer.Id) { cursor = touchPoint.Key; break; @@ -174,10 +174,10 @@ public override void CancelTouch(TouchPoint touch, bool @return) } if (cursor != null) { - cancelTouch(touch.Id); + cancelPointer(pointer.Id); if (@return) { - cursorToInternalId[cursor] = beginTouch(touch.Position, touch.Tags, false); + cursorToInternalId[cursor] = beginPointer(pointer.Position, pointer.Tags, false); } else { @@ -189,7 +189,7 @@ public override void CancelTouch(TouchPoint touch, bool @return) TuioBlob blob = null; foreach (var touchPoint in blobToInternalId) { - if (touchPoint.Value.Id == touch.Id) + if (touchPoint.Value.Id == pointer.Id) { blob = touchPoint.Key; break; @@ -197,11 +197,11 @@ public override void CancelTouch(TouchPoint touch, bool @return) } if (blob != null) { - cancelTouch(touch.Id); + cancelPointer(pointer.Id); if (@return) { - var t = beginTouch(touch.Position, touch.Tags, false); - t.Properties = touch.Properties; + var t = beginPointer(pointer.Position, pointer.Tags, false); + t.Properties = pointer.Properties; blobToInternalId[blob] = t; } else @@ -214,7 +214,7 @@ public override void CancelTouch(TouchPoint touch, bool @return) TuioObject obj = null; foreach (var touchPoint in objectToInternalId) { - if (touchPoint.Value.Id == touch.Id) + if (touchPoint.Value.Id == pointer.Id) { obj = touchPoint.Key; break; @@ -222,11 +222,11 @@ public override void CancelTouch(TouchPoint touch, bool @return) } if (obj != null) { - cancelTouch(touch.Id); + cancelPointer(pointer.Id); if (@return) { - var t = beginTouch(touch.Position, touch.Tags, false); - t.Properties = touch.Properties; + var t = beginPointer(pointer.Position, pointer.Tags, false); + t.Properties = pointer.Properties; objectToInternalId[obj] = t; } else @@ -297,9 +297,9 @@ private void disconnect() server = null; } - foreach (var i in cursorToInternalId) cancelTouch(i.Value.Id); - foreach (var i in blobToInternalId) cancelTouch(i.Value.Id); - foreach (var i in objectToInternalId) cancelTouch(i.Value.Id); + foreach (var i in cursorToInternalId) cancelPointer(i.Value.Id); + foreach (var i in blobToInternalId) cancelPointer(i.Value.Id); + foreach (var i in objectToInternalId) cancelPointer(i.Value.Id); } private void updateInputs() @@ -314,7 +314,7 @@ private void updateInputs() else server.RemoveDataProcessor(objectProcessor); } - private void updateBlobProperties(TouchPoint touch, TuioBlob blob) + private void updateBlobProperties(Pointer touch, TuioBlob blob) { var props = touch.Properties; @@ -326,7 +326,7 @@ private void updateBlobProperties(TouchPoint touch, TuioBlob blob) props["RotationAcceleration"] = blob.RotationAcceleration; } - private void updateObjectProperties(TouchPoint touch, TuioObject obj) + private void updateObjectProperties(Pointer touch, TuioObject obj) { var props = touch.Properties; @@ -358,7 +358,7 @@ private void OnCursorAdded(object sender, TuioCursorEventArgs e) { var x = entity.X * screenWidth; var y = (1 - entity.Y) * screenHeight; - cursorToInternalId.Add(entity, beginTouch(new Vector2(x, y), CursorTags)); + cursorToInternalId.Add(entity, beginPointer(new Vector2(x, y), CursorTags)); } } @@ -367,13 +367,13 @@ private void OnCursorUpdated(object sender, TuioCursorEventArgs e) var entity = e.Cursor; lock (this) { - TouchPoint touch; + Pointer touch; if (!cursorToInternalId.TryGetValue(entity, out touch)) return; var x = entity.X * screenWidth; var y = (1 - entity.Y) * screenHeight; - moveTouch(touch.Id, new Vector2(x, y)); + movePointer(touch.Id, new Vector2(x, y)); } } @@ -382,11 +382,11 @@ private void OnCursorRemoved(object sender, TuioCursorEventArgs e) var entity = e.Cursor; lock (this) { - TouchPoint touch; + Pointer touch; if (!cursorToInternalId.TryGetValue(entity, out touch)) return; cursorToInternalId.Remove(entity); - endTouch(touch.Id); + endPointer(touch.Id); } } @@ -397,7 +397,7 @@ private void OnBlobAdded(object sender, TuioBlobEventArgs e) { var x = entity.X * screenWidth; var y = (1 - entity.Y) * screenHeight; - var touch = beginTouch(new Vector2(x, y), BlobTags); + var touch = beginPointer(new Vector2(x, y), BlobTags); updateBlobProperties(touch, entity); blobToInternalId.Add(entity, touch); } @@ -408,13 +408,13 @@ private void OnBlobUpdated(object sender, TuioBlobEventArgs e) var entity = e.Blob; lock (this) { - TouchPoint touch; + Pointer touch; if (!blobToInternalId.TryGetValue(entity, out touch)) return; var x = entity.X * screenWidth; var y = (1 - entity.Y) * screenHeight; - moveTouch(touch.Id, new Vector2(x, y)); + movePointer(touch.Id, new Vector2(x, y)); updateBlobProperties(touch, entity); } } @@ -424,11 +424,11 @@ private void OnBlobRemoved(object sender, TuioBlobEventArgs e) var entity = e.Blob; lock (this) { - TouchPoint touch; + Pointer touch; if (!blobToInternalId.TryGetValue(entity, out touch)) return; blobToInternalId.Remove(entity); - endTouch(touch.Id); + endPointer(touch.Id); } } @@ -439,7 +439,7 @@ private void OnObjectAdded(object sender, TuioObjectEventArgs e) { var x = entity.X * screenWidth; var y = (1 - entity.Y) * screenHeight; - var touch = beginTouch(new Vector2(x, y), new Tags(ObjectTags, getTagById(entity.ClassId))); + var touch = beginPointer(new Vector2(x, y), new Tags(ObjectTags, getTagById(entity.ClassId))); updateObjectProperties(touch, entity); objectToInternalId.Add(entity, touch); } @@ -450,13 +450,13 @@ private void OnObjectUpdated(object sender, TuioObjectEventArgs e) var entity = e.Object; lock (this) { - TouchPoint touch; + Pointer touch; if (!objectToInternalId.TryGetValue(entity, out touch)) return; var x = entity.X * screenWidth; var y = (1 - entity.Y) * screenHeight; - moveTouch(touch.Id, new Vector2(x, y)); + movePointer(touch.Id, new Vector2(x, y)); updateObjectProperties(touch, entity); } } @@ -466,11 +466,11 @@ private void OnObjectRemoved(object sender, TuioObjectEventArgs e) var entity = e.Object; lock (this) { - TouchPoint touch; + Pointer touch; if (!objectToInternalId.TryGetValue(entity, out touch)) return; objectToInternalId.Remove(entity); - endTouch(touch.Id); + endPointer(touch.Id); } } diff --git a/Source/Assets/TouchScript/Prefabs/Touch Hit.prefab b/Source/Assets/TouchScript/Prefabs/Pointer Hit.prefab similarity index 99% rename from Source/Assets/TouchScript/Prefabs/Touch Hit.prefab rename to Source/Assets/TouchScript/Prefabs/Pointer Hit.prefab index 48d66cf97..4522d7116 100644 --- a/Source/Assets/TouchScript/Prefabs/Touch Hit.prefab +++ b/Source/Assets/TouchScript/Prefabs/Pointer Hit.prefab @@ -30,7 +30,7 @@ GameObject: - 114: {fileID: 11454912} - 114: {fileID: 11468960} m_Layer: 0 - m_Name: Touch Hit + m_Name: Pointer Hit m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 diff --git a/Source/Assets/TouchScript/Prefabs/Touch Hit.prefab.meta b/Source/Assets/TouchScript/Prefabs/Pointer Hit.prefab.meta similarity index 100% rename from Source/Assets/TouchScript/Prefabs/Touch Hit.prefab.meta rename to Source/Assets/TouchScript/Prefabs/Pointer Hit.prefab.meta diff --git a/Source/Assets/TouchScript/Prefabs/Touch Visualizer.prefab b/Source/Assets/TouchScript/Prefabs/Pointer Visualizer.prefab similarity index 87% rename from Source/Assets/TouchScript/Prefabs/Touch Visualizer.prefab rename to Source/Assets/TouchScript/Prefabs/Pointer Visualizer.prefab index 3ceaf4f72..11630fb79 100644 --- a/Source/Assets/TouchScript/Prefabs/Touch Visualizer.prefab +++ b/Source/Assets/TouchScript/Prefabs/Pointer Visualizer.prefab @@ -11,7 +11,7 @@ GameObject: - 114: {fileID: 11400000} - 223: {fileID: 22341586} m_Layer: 0 - m_Name: Touch Visualizer + m_Name: Pointer Visualizer m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -43,11 +43,11 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 75324aa372886435faa21a4145210f8e, type: 3} m_Name: m_EditorClassIdentifier: - touchProxy: {fileID: 11468960, guid: 4230502e1973f4c9e9ef6767dcc8c602, type: 2} - showTouchId: 1 + pointerProxy: {fileID: 11468960, guid: 4230502e1973f4c9e9ef6767dcc8c602, type: 2} + showPointerId: 1 showTags: 1 useDPI: 1 - touchSize: 1 + pointerSize: 1 --- !u!1002 &11400001 EditorExtensionImpl: serializedVersion: 6 @@ -94,7 +94,12 @@ Prefab: serializedVersion: 2 m_Modification: m_TransformParent: {fileID: 0} - m_Modifications: [] + m_Modifications: + - target: {fileID: 0} + propertyPath: pointerProxy + value: + objectReference: {fileID: 11468960, guid: 4230502e1973f4c9e9ef6767dcc8c602, + type: 2} m_RemovedComponents: [] m_ParentPrefab: {fileID: 0} m_RootGameObject: {fileID: 100000} diff --git a/Source/Assets/TouchScript/Prefabs/Touch Visualizer.prefab.meta b/Source/Assets/TouchScript/Prefabs/Pointer Visualizer.prefab.meta similarity index 100% rename from Source/Assets/TouchScript/Prefabs/Touch Visualizer.prefab.meta rename to Source/Assets/TouchScript/Prefabs/Pointer Visualizer.prefab.meta diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/TouchScriptInputModule.cs b/Source/Assets/TouchScript/Scripts/Behaviors/TouchScriptInputModule.cs index 52149cd84..dcf5a4d94 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/TouchScriptInputModule.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/TouchScriptInputModule.cs @@ -132,10 +132,10 @@ public override void ActivateModule() var touchManager = TouchManager.Instance; if (touchManager != null) { - touchManager.TouchesBegan += touchesBeganHandler; - touchManager.TouchesMoved += touchesMovedHandler; - touchManager.TouchesEnded += touchesEndedHandler; - touchManager.TouchesCancelled += touchesCancelledHandler; + touchManager.PointersBegan += pointersBeganHandler; + touchManager.PointersMoved += pointersMovedHandler; + touchManager.PointersEnded += pointersEndedHandler; + touchManager.PointersCancelled += pointersCancelledHandler; } var toSelect = eventSystem.currentSelectedGameObject; @@ -153,10 +153,10 @@ public override void DeactivateModule() var touchManager = TouchManager.Instance; if (touchManager != null) { - touchManager.TouchesBegan -= touchesBeganHandler; - touchManager.TouchesMoved -= touchesMovedHandler; - touchManager.TouchesEnded -= touchesEndedHandler; - touchManager.TouchesCancelled -= touchesCancelledHandler; + touchManager.PointersBegan -= pointersBeganHandler; + touchManager.PointersMoved -= pointersMovedHandler; + touchManager.PointersEnded -= pointersEndedHandler; + touchManager.PointersCancelled -= pointersCancelledHandler; } clearSelection(); @@ -209,16 +209,16 @@ protected void raycastPointer(PointerEventData pointerEvent) } /// - /// Initializes pointer data for a touch. + /// Initializes pointer data for a pointer. /// - /// The touch to initialize pointer data from. - /// Pointer data for the touch. - protected PointerEventData initPointerData(TouchPoint touch) + /// The pointer to initialize pointer data from. + /// Pointer data for the pointer. + protected PointerEventData initPointerData(Pointer pointer) { PointerEventData pointerEvent; - getPointerData(touch.Id, out pointerEvent, true); + getPointerData(pointer.Id, out pointerEvent, true); - pointerEvent.position = touch.Position; + pointerEvent.position = pointer.Position; pointerEvent.button = PointerEventData.InputButton.Left; pointerEvent.eligibleForClick = true; pointerEvent.delta = Vector2.zero; @@ -271,17 +271,17 @@ protected void injectPointer(PointerEventData pointerEvent) } /// - /// Updates pointer data for touch. + /// Updates pointer data for pointer. /// - /// The touch. + /// The pointer. /// Updated pointer data. - protected PointerEventData updatePointerData(TouchPoint touch) + protected PointerEventData updatePointerData(Pointer pointer) { PointerEventData pointerEvent; - getPointerData(touch.Id, out pointerEvent, true); + getPointerData(pointer.Id, out pointerEvent, true); - pointerEvent.position = touch.Position; - pointerEvent.delta = touch.Position - touch.PreviousPosition; + pointerEvent.position = pointer.Position; + pointerEvent.delta = pointer.Position - pointer.PreviousPosition; return pointerEvent; } @@ -357,7 +357,7 @@ protected void endPointer(PointerEventData pointerEvent) pointerEvent.dragging = false; pointerEvent.pointerDrag = null; - // send exit events as we need to simulate this on touch up on touch device + // send exit events as we need to simulate this on pointer up on pointer device ExecuteEvents.ExecuteHierarchy(pointerEvent.pointerEnter, pointerEvent, ExecuteEvents.pointerExitHandler); pointerEvent.pointerEnter = null; @@ -365,9 +365,9 @@ protected void endPointer(PointerEventData pointerEvent) } /// - /// Gets pointer data for a touch. + /// Gets pointer data for a pointer. /// - /// Touch id. + /// Pointer id. /// Pointer data. /// If set to true not found pointer data is created. /// true if pointer data is found or created; false otherwise. @@ -397,7 +397,7 @@ protected void removePointerData(PointerEventData data) /// /// Gets the last pointer event data. /// - /// Touch id. + /// Pointer id. /// Pointer data. protected PointerEventData getLastPointerEventData(int id) { @@ -426,8 +426,8 @@ protected void clearSelection() /// /// Deselects if selection changed. /// - /// GameObject which has the touch over it. - /// Pointer data for the touch. + /// GameObject which has the pointer over it. + /// Pointer data for the pointer. protected void deselectIfSelectionChanged(GameObject currentOverGo, BaseEventData pointerEvent) { // Selection tracking @@ -442,23 +442,23 @@ protected void deselectIfSelectionChanged(GameObject currentOverGo, BaseEventDat #region Private functions - private void processBegan(TouchPoint touch) + private void processBegan(Pointer pointer) { - PointerEventData pointerEvent = initPointerData(touch); + PointerEventData pointerEvent = initPointerData(pointer); raycastPointer(pointerEvent); injectPointer(pointerEvent); } - private void processMove(TouchPoint touch) + private void processMove(Pointer pointer) { - PointerEventData pointerEvent = updatePointerData(touch); + PointerEventData pointerEvent = updatePointerData(pointer); raycastPointer(pointerEvent); movePointer(pointerEvent); } - private void processEnded(TouchPoint touch) + private void processEnded(Pointer pointer) { - PointerEventData pointerEvent = updatePointerData(touch); + PointerEventData pointerEvent = updatePointerData(pointer); raycastPointer(pointerEvent); endPointer(pointerEvent); } @@ -559,30 +559,30 @@ private bool sendUpdateEventToSelectedObject() #endregion - #region Touch event callbacks + #region Pointer event callbacks - private void touchesBeganHandler(object sender, TouchEventArgs touchEventArgs) + private void pointersBeganHandler(object sender, PointerEventArgs pointerEventArgs) { - var touches = touchEventArgs.Touches; - for (var i = 0; i < touches.Count; i++) processBegan(touches[i]); + var pointers = pointerEventArgs.Pointers; + for (var i = 0; i < pointers.Count; i++) processBegan(pointers[i]); } - private void touchesMovedHandler(object sender, TouchEventArgs touchEventArgs) + private void pointersMovedHandler(object sender, PointerEventArgs pointerEventArgs) { - var touches = touchEventArgs.Touches; - for (var i = 0; i < touches.Count; i++) processMove(touches[i]); + var pointers = pointerEventArgs.Pointers; + for (var i = 0; i < pointers.Count; i++) processMove(pointers[i]); } - private void touchesEndedHandler(object sender, TouchEventArgs touchEventArgs) + private void pointersEndedHandler(object sender, PointerEventArgs pointerEventArgs) { - var touches = touchEventArgs.Touches; - for (var i = 0; i < touches.Count; i++) processEnded(touches[i]); + var pointers = pointerEventArgs.Pointers; + for (var i = 0; i < pointers.Count; i++) processEnded(pointers[i]); } - private void touchesCancelledHandler(object sender, TouchEventArgs touchEventArgs) + private void pointersCancelledHandler(object sender, PointerEventArgs pointerEventArgs) { - var touches = touchEventArgs.Touches; - for (var i = 0; i < touches.Count; i++) processEnded(touches[i]); + var pointers = pointerEventArgs.Pointers; + for (var i = 0; i < pointers.Count; i++) processEnded(pointers[i]); } #endregion diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/TouchProxy.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs similarity index 65% rename from Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/TouchProxy.cs rename to Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs index ebccbbc0c..e7512e25b 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/TouchProxy.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs @@ -12,7 +12,7 @@ namespace TouchScript.Behaviors.Visualizer /// Visual cursor implementation used by TouchScript. /// [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Behaviors_TouchProxy.htm")] - public class TouchProxy : TouchProxyBase + public class PointerProxy : PointerProxyBase { /// /// The link to UI.Text component. @@ -24,29 +24,29 @@ public class TouchProxy : TouchProxyBase #region Protected methods /// - protected override void updateOnce(TouchPoint touch) + protected override void updateOnce(Pointer pointer) { - base.updateOnce(touch); + base.updateOnce(pointer); stringBuilder.Length = 0; - stringBuilder.Append("Touch id: "); - stringBuilder.Append(touch.Id); + stringBuilder.Append("Pointer id: "); + stringBuilder.Append(pointer.Id); gameObject.name = stringBuilder.ToString(); if (Text == null) return; - if (!ShowTouchId && !ShowTags) return; + if (!ShowPointerId && !ShowTags) return; stringBuilder.Length = 0; - if (ShowTouchId) + if (ShowPointerId) { stringBuilder.Append("Id: "); - stringBuilder.Append(touch.Id); + stringBuilder.Append(pointer.Id); } if (ShowTags) { if (stringBuilder.Length > 0) stringBuilder.Append("\n"); stringBuilder.Append("Tags: "); - stringBuilder.Append(touch.Tags.ToString()); + stringBuilder.Append(pointer.Tags.ToString()); } Text.text = stringBuilder.ToString(); } @@ -55,9 +55,9 @@ protected override void updateOnce(TouchPoint touch) } /// - /// Base class for cursors. + /// Base class for cursors. /// - public class TouchProxyBase : MonoBehaviour + public class PointerProxyBase : MonoBehaviour { #region Public properties @@ -76,15 +76,15 @@ public int Size } /// - /// Gets or sets a value indicating whether touch id text should be displayed on screen. + /// Gets or sets a value indicating whether pointer id text should be displayed on screen. /// - /// true if touch id text should be displayed on screen; otherwise, false. - public bool ShowTouchId { get; set; } + /// true if pointer id text should be displayed on screen; otherwise, false. + public bool ShowPointerId { get; set; } /// - /// Gets or sets a value indicating whether touch tags text should be displayed on screen. + /// Gets or sets a value indicating whether pointer tags text should be displayed on screen. /// - /// true if touch tags text should be displayed on screen; otherwise, false. + /// true if pointer tags text should be displayed on screen; otherwise, false. public bool ShowTags { get; set; } #endregion @@ -109,23 +109,23 @@ public int Size /// Initializes (resets) the cursor. /// /// Parent container. - /// Touch this cursor represents. - public void Init(RectTransform parent, TouchPoint touch) + /// Pointer this cursor represents. + public void Init(RectTransform parent, Pointer pointer) { show(); rect.SetParent(parent); rect.SetAsLastSibling(); - updateOnce(touch); - update(touch); + updateOnce(pointer); + update(pointer); } /// - /// Updates the touch. This method is called when the touch is moved. + /// Updates the pointer. This method is called when the pointer is moved. /// - /// Touch this cursor represents. - public void UpdateTouch(TouchPoint touch) + /// Pointer this cursor represents. + public void UpdatePointer(Pointer pointer) { - update(touch); + update(pointer); } /// @@ -145,7 +145,7 @@ private void Awake() rect = transform as RectTransform; if (rect == null) { - Debug.LogError("TouchProxy must be on an UI element!"); + Debug.LogError("PointerProxy must be on an UI element!"); enabled = false; return; } @@ -162,7 +162,7 @@ private void Awake() protected virtual void hide() { gameObject.SetActive(false); - gameObject.name = "inactive touch"; + gameObject.name = "inactive pointer"; } /// @@ -176,16 +176,16 @@ protected virtual void show() /// /// This method is called once when the cursor is initialized. /// - /// The touch. - protected virtual void updateOnce(TouchPoint touch) {} + /// The pointer. + protected virtual void updateOnce(Pointer pointer) {} /// - /// This method is called every time when the touch changes. + /// This method is called every time when the pointer changes. /// - /// The touch. - public virtual void update(TouchPoint touch) + /// The pointer. + public virtual void update(Pointer pointer) { - rect.anchoredPosition = touch.Position; + rect.anchoredPosition = pointer.Position; } #endregion diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/TouchProxy.cs.meta b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/TouchProxy.cs.meta rename to Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs new file mode 100644 index 000000000..b3ac8b772 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs @@ -0,0 +1,218 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using System.Collections.Generic; +using TouchScript.Utils; +using UnityEngine; + +namespace TouchScript.Behaviors.Visualizer +{ + /// + /// 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_TouchVisualizer.htm")] + 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 + { + get { return pointerProxy; } + set + { + pointerProxy = value; + updateDefaultSize(); + } + } + + /// + /// 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 { return showPointerId; } + set { showPointerId = value; } + } + + /// + /// Gets or sets a value indicating whether pointer tags text should be displayed on screen. + /// + /// true if pointer tags text should be displayed on screen; otherwise, false. + public bool ShowTags + { + get { return showTags; } + set { showTags = value; } + } + + /// + /// Gets or sets whether is using DPI to scale pointer cursors. + /// + /// true if DPI value is used; otherwise, false. + public bool UseDPI + { + get { return useDPI; } + set { useDPI = value; } + } + + /// + /// 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 + { + get { return pointerSize; } + set { pointerSize = value; } + } + + #endregion + + #region Private variables + + [SerializeField] + private PointerProxyBase pointerProxy; + + [SerializeField] + private bool showPointerId = true; + + [SerializeField] + private bool showTags = false; + + [SerializeField] + private bool useDPI = true; + + [SerializeField] + private float pointerSize = 1f; + + private int defaultSize = 64; + private RectTransform rect; + private ObjectPool pool; + private Dictionary proxies = new Dictionary(10); + + #endregion + + #region Unity methods + + private void Awake() + { + pool = new ObjectPool(10, instantiateProxy, 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.PointersBegan += pointersBeganHandler; + TouchManager.Instance.PointersEnded += pointersEndedHandler; + TouchManager.Instance.PointersMoved += pointersMovedHandler; + TouchManager.Instance.PointersCancelled += pointersCancelledHandler; + } + } + + private void OnDisable() + { + if (TouchManager.Instance != null) + { + TouchManager.Instance.PointersBegan -= pointersBeganHandler; + TouchManager.Instance.PointersEnded -= pointersEndedHandler; + TouchManager.Instance.PointersMoved -= pointersMovedHandler; + TouchManager.Instance.PointersCancelled -= pointersCancelledHandler; + } + } + + #endregion + + #region Private functions + + private PointerProxyBase instantiateProxy() + { + return Instantiate(pointerProxy); + } + + private void clearProxy(PointerProxyBase proxy) + { + proxy.Hide(); + } + + private int getPointerSize() + { + if (useDPI) return (int) (pointerSize * TouchManager.Instance.DotsPerCentimeter); + return defaultSize; + } + + private void updateDefaultSize() + { + if (pointerProxy != null) + { + var rt = pointerProxy.GetComponent(); + if (rt) defaultSize = (int) rt.sizeDelta.x; + } + } + + #endregion + + #region Event handlers + + private void pointersBeganHandler(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.ShowTags = showTags; + proxy.Init(rect, pointer); + proxies.Add(pointer.Id, proxy); + } + } + + private void pointersMovedHandler(object sender, PointerEventArgs e) + { + var count = e.Pointers.Count; + for (var i = 0; i < count; i++) + { + var pointer = e.Pointers[i]; + PointerProxyBase proxy; + if (!proxies.TryGetValue(pointer.Id, out proxy)) return; + proxy.UpdatePointer(pointer); + } + } + + private void pointersEndedHandler(object sender, PointerEventArgs e) + { + var count = e.Pointers.Count; + for (var i = 0; i < count; i++) + { + var pointer = e.Pointers[i]; + PointerProxyBase proxy; + if (!proxies.TryGetValue(pointer.Id, out proxy)) return; + proxies.Remove(pointer.Id); + pool.Release(proxy); + } + } + + private void pointersCancelledHandler(object sender, PointerEventArgs e) + { + pointersEndedHandler(sender, e); + } + + #endregion + } +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/TouchVisualizer.cs.meta b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/TouchVisualizer.cs.meta rename to Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/TouchVisualizer.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/TouchVisualizer.cs deleted file mode 100644 index 1b91e259e..000000000 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/TouchVisualizer.cs +++ /dev/null @@ -1,218 +0,0 @@ -/* - * @author Valentin Simonov / http://va.lent.in/ - */ - -using System.Collections.Generic; -using TouchScript.Utils; -using UnityEngine; - -namespace TouchScript.Behaviors.Visualizer -{ - /// - /// Touch visualizer which shows touch 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_TouchVisualizer.htm")] - public class TouchVisualizer : MonoBehaviour - { - #region Public properties - - /// - /// Gets or sets touch UI element prefab which represents a touch on screen. - /// - /// A prefab with a script derived from TouchProxyBase. - public TouchProxyBase TouchProxy - { - get { return touchProxy; } - set - { - touchProxy = value; - updateDefaultSize(); - } - } - - /// - /// Gets or sets a value indicating whether touch id text should be displayed on screen. - /// - /// true if touch id text should be displayed on screen; otherwise, false. - public bool ShowTouchId - { - get { return showTouchId; } - set { showTouchId = value; } - } - - /// - /// Gets or sets a value indicating whether touch tags text should be displayed on screen. - /// - /// true if touch tags text should be displayed on screen; otherwise, false. - public bool ShowTags - { - get { return showTags; } - set { showTags = value; } - } - - /// - /// Gets or sets whether is using DPI to scale touch cursors. - /// - /// true if DPI value is used; otherwise, false. - public bool UseDPI - { - get { return useDPI; } - set { useDPI = value; } - } - - /// - /// Gets or sets the size of touch cursors in cm. This value is only used when is set to true. - /// - /// The size of touch cursors in cm. - public float TouchSize - { - get { return touchSize; } - set { touchSize = value; } - } - - #endregion - - #region Private variables - - [SerializeField] - private TouchProxyBase touchProxy; - - [SerializeField] - private bool showTouchId = true; - - [SerializeField] - private bool showTags = false; - - [SerializeField] - private bool useDPI = true; - - [SerializeField] - private float touchSize = 1f; - - private int defaultSize = 64; - private RectTransform rect; - private ObjectPool pool; - private Dictionary proxies = new Dictionary(10); - - #endregion - - #region Unity methods - - private void Awake() - { - pool = new ObjectPool(10, instantiateProxy, null, clearProxy); - rect = transform as RectTransform; - if (rect == null) - { - Debug.LogError("TouchVisualizer must be on an UI element!"); - enabled = false; - } - updateDefaultSize(); - } - - private void OnEnable() - { - if (TouchManager.Instance != null) - { - TouchManager.Instance.TouchesBegan += touchesBeganHandler; - TouchManager.Instance.TouchesEnded += touchesEndedHandler; - TouchManager.Instance.TouchesMoved += touchesMovedHandler; - TouchManager.Instance.TouchesCancelled += touchesCancelledHandler; - } - } - - private void OnDisable() - { - if (TouchManager.Instance != null) - { - TouchManager.Instance.TouchesBegan -= touchesBeganHandler; - TouchManager.Instance.TouchesEnded -= touchesEndedHandler; - TouchManager.Instance.TouchesMoved -= touchesMovedHandler; - TouchManager.Instance.TouchesCancelled -= touchesCancelledHandler; - } - } - - #endregion - - #region Private functions - - private TouchProxyBase instantiateProxy() - { - return Instantiate(touchProxy); - } - - private void clearProxy(TouchProxyBase proxy) - { - proxy.Hide(); - } - - private int getTouchSize() - { - if (useDPI) return (int) (touchSize * TouchManager.Instance.DotsPerCentimeter); - return defaultSize; - } - - private void updateDefaultSize() - { - if (touchProxy != null) - { - var rt = touchProxy.GetComponent(); - if (rt) defaultSize = (int) rt.sizeDelta.x; - } - } - - #endregion - - #region Event handlers - - private void touchesBeganHandler(object sender, TouchEventArgs e) - { - if (touchProxy == null) return; - - var count = e.Touches.Count; - for (var i = 0; i < count; i++) - { - var touch = e.Touches[i]; - var proxy = pool.Get(); - proxy.Size = getTouchSize(); - proxy.ShowTouchId = showTouchId; - proxy.ShowTags = showTags; - proxy.Init(rect, touch); - proxies.Add(touch.Id, proxy); - } - } - - private void touchesMovedHandler(object sender, TouchEventArgs e) - { - var count = e.Touches.Count; - for (var i = 0; i < count; i++) - { - var touch = e.Touches[i]; - TouchProxyBase proxy; - if (!proxies.TryGetValue(touch.Id, out proxy)) return; - proxy.UpdateTouch(touch); - } - } - - private void touchesEndedHandler(object sender, TouchEventArgs e) - { - var count = e.Touches.Count; - for (var i = 0; i < count; i++) - { - var touch = e.Touches[i]; - TouchProxyBase proxy; - if (!proxies.TryGetValue(touch.Id, out proxy)) return; - proxies.Remove(touch.Id); - pool.Release(proxy); - } - } - - private void touchesCancelledHandler(object sender, TouchEventArgs e) - { - touchesEndedHandler(sender, e); - } - - #endregion - } -} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Clusters/Clusters.cs b/Source/Assets/TouchScript/Scripts/Clusters/Clusters.cs index 6d4649e9f..f0b6d9a55 100644 --- a/Source/Assets/TouchScript/Scripts/Clusters/Clusters.cs +++ b/Source/Assets/TouchScript/Scripts/Clusters/Clusters.cs @@ -69,10 +69,10 @@ public bool HasClusters #region Private variables - private List points = new List(); + private List points = new List(); private bool dirty; - private List cluster1 = new List(); - private List cluster2 = new List(); + private List cluster1 = new List(); + private List cluster2 = new List(); private float minPointDistance, minPointDistanceSqr; private bool hasClusters = false; @@ -93,7 +93,7 @@ public Clusters() /// Calculates the center position of one of the clusters. /// /// Cluster id. Either or . - /// Cluster's centroid position or if cluster contains no points. + /// Cluster's centroid position or if cluster contains no pointers. public Vector2 GetCenterPosition(int id) { if (!HasClusters) return TouchManager.INVALID_POSITION; @@ -117,7 +117,7 @@ public Vector2 GetCenterPosition(int id) /// Calculates previous center position of one of the clusters. /// /// Cluster id. Either or . - /// Cluster's centroid previous position or if cluster contains no points. + /// Cluster's centroid previous position or if cluster contains no pointers. public Vector2 GetPreviousCenterPosition(int id) { if (!HasClusters) return TouchManager.INVALID_POSITION; @@ -138,50 +138,50 @@ public Vector2 GetPreviousCenterPosition(int id) } /// - /// Adds a point to cluster. - /// A point. - public void AddPoint(TouchPoint point) + /// Adds a pointer to cluster. + /// A pointer. + public void AddPoint(Pointer pointer) { - if (points.Contains(point)) return; + if (points.Contains(pointer)) return; - points.Add(point); + points.Add(pointer); markDirty(); } /// - /// Adds a list of points to cluster. + /// Adds a list of pointers to cluster. /// - /// List of points. - public void AddPoints(IList points) + /// List of pointers. + public void AddPoints(IList pointers) { - var count = points.Count; - for (var i = 0; i < count; i++) AddPoint(points[i]); + var count = pointers.Count; + for (var i = 0; i < count; i++) AddPoint(pointers[i]); } /// - /// Removes a point from cluster. + /// Removes a pointer from cluster. /// - /// A point. - public void RemovePoint(TouchPoint point) + /// A pointer. + public void RemovePoint(Pointer pointer) { - if (!points.Contains(point)) return; + if (!points.Contains(pointer)) return; - points.Remove(point); + points.Remove(pointer); markDirty(); } /// - /// Removes a list of points from cluster. + /// Removes a list of pointers from cluster. /// - /// List of points. - public void RemovePoints(IList points) + /// List of pointers. + public void RemovePoints(IList points) { var count = points.Count; for (var i = 0; i < count; i++) RemovePoint(points[i]); } /// - /// Removes all points from cluster. + /// Removes all pointers from cluster. /// public void RemoveAllPoints() { @@ -224,8 +224,8 @@ private void distributePoints() { var center1 = ClusterUtils.Get2DCenterPosition(cluster1); var center2 = ClusterUtils.Get2DCenterPosition(cluster2); - TouchPoint obj1 = null; - TouchPoint obj2 = null; + Pointer obj1 = null; + Pointer obj2 = null; // Take most distant points from cluster1 and cluster2 var maxDist1 = -float.MaxValue; diff --git a/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs b/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs index aa22127d8..54faa5e7f 100644 --- a/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs @@ -52,7 +52,7 @@ public static IGestureManager Instance // Upcoming changes private List gesturesToReset = new List(20); - private Action> _updateBegan, _updateMoved, _updateEnded, _updateCancelled; + private Action> _updateBegan, _updateMoved, _updateEnded, _updateCancelled; private Action _processTarget, _processTargetBegan; #endregion @@ -60,17 +60,17 @@ public static IGestureManager Instance #region Temporary variables // Temporary variables for update methods. - // Dictionary> - touch points sorted by targets - private Dictionary> targetTouches = new Dictionary>(10); - // Dictionary> - touch points sorted by gesture - private Dictionary> gestureTouches = new Dictionary>(10); + // Dictionary> - pointers sorted by targets + private Dictionary> targetPointers = new Dictionary>(10); + // Dictionary> - pointers sorted by gesture + private Dictionary> gesturePointers = new Dictionary>(10); private List activeGestures = new List(20); private static ObjectPool> gestureListPool = new ObjectPool>(10, () => new List(20), null, (l) => l.Clear()); - private static ObjectPool> touchListPool = new ObjectPool>(20, - () => new List(10), null, (l) => l.Clear()); + private static ObjectPool> pointerListPool = new ObjectPool>(20, + () => new List(10), null, (l) => l.Clear()); private static ObjectPool> transformListPool = new ObjectPool>(10, () => new List(10), null, (l) => l.Clear()); @@ -102,7 +102,7 @@ private void Awake() _updateCancelled = doUpdateCancelled; gestureListPool.WarmUp(5); - touchListPool.WarmUp(10); + pointerListPool.WarmUp(10); transformListPool.WarmUp(5); } @@ -113,10 +113,10 @@ private void OnEnable() { touchManager.FrameStarted += frameStartedHandler; touchManager.FrameFinished += frameFinishedHandler; - touchManager.TouchesBegan += touchesBeganHandler; - touchManager.TouchesMoved += touchesMovedHandler; - touchManager.TouchesEnded += touchesEndedHandler; - touchManager.TouchesCancelled += touchesCancelledHandler; + touchManager.PointersBegan += pointersBeganHandler; + touchManager.PointersMoved += pointersMovedHandler; + touchManager.PointersEnded += pointersEndedHandler; + touchManager.PointersCancelled += pointersCancelledHandler; } } @@ -127,10 +127,10 @@ private void OnDisable() { touchManager.FrameStarted -= frameStartedHandler; touchManager.FrameFinished -= frameFinishedHandler; - touchManager.TouchesBegan -= touchesBeganHandler; - touchManager.TouchesMoved -= touchesMovedHandler; - touchManager.TouchesEnded -= touchesEndedHandler; - touchManager.TouchesCancelled -= touchesCancelledHandler; + touchManager.PointersBegan -= pointersBeganHandler; + touchManager.PointersMoved -= pointersMovedHandler; + touchManager.PointersEnded -= pointersEndedHandler; + touchManager.PointersCancelled -= pointersCancelledHandler; } } @@ -214,50 +214,50 @@ internal Gesture.GestureState INTERNAL_GestureChangeState(Gesture gesture, Gestu #region Private functions - private void doUpdateBegan(Gesture gesture, IList touches) + private void doUpdateBegan(Gesture gesture, IList pointers) { - gesture.INTERNAL_TouchesBegan(touches); + gesture.INTERNAL_PointerBegan(pointers); } - private void doUpdateMoved(Gesture gesture, IList touches) + private void doUpdateMoved(Gesture gesture, IList pointers) { - gesture.INTERNAL_TouchesMoved(touches); + gesture.INTERNAL_PointersMoved(pointers); } - private void doUpdateEnded(Gesture gesture, IList touches) + private void doUpdateEnded(Gesture gesture, IList pointers) { - gesture.INTERNAL_TouchesEnded(touches); + gesture.INTERNAL_PointersEnded(pointers); } - private void doUpdateCancelled(Gesture gesture, IList touches) + private void doUpdateCancelled(Gesture gesture, IList pointers) { - gesture.INTERNAL_TouchesCancelled(touches); + gesture.INTERNAL_PointersCancelled(pointers); } - private void update(IList touches, Action process, - Action> dispatch) + private void update(IList pointers, Action process, + Action> dispatch) { // WARNING! Arcane magic ahead! - // gestures which got any touch points + // gestures which got any pointers // needed because there's no order in dictionary activeGestures.Clear(); var targets = transformListPool.Get(); - // arrange touch points by target - var count = touches.Count; + // arrange pointers by target + var count = pointers.Count; for (var i = 0; i < count; i++) { - var touch = touches[i]; - if (touch.Target != null) + var pointer = pointers[i]; + if (pointer.Target != null) { - List list; - if (!targetTouches.TryGetValue(touch.Target, out list)) + List list; + if (!targetPointers.TryGetValue(pointer.Target, out list)) { - list = touchListPool.Get(); - targetTouches.Add(touch.Target, list); - targets.Add(touch.Target); + list = pointerListPool.Get(); + targetPointers.Add(pointer.Target, list); + targets.Add(pointer.Target); } - list.Add(touch); + list.Add(pointer); } } @@ -267,28 +267,28 @@ private void update(IList touches, Action process, { var target = targets[i]; process(target); - touchListPool.Release(targetTouches[target]); + pointerListPool.Release(targetPointers[target]); } transformListPool.Release(targets); - // dispatch gesture events with touches assigned to them + // dispatch gesture events with pointers assigned to them count = activeGestures.Count; for (var i = 0; i < count; i++) { var gesture = activeGestures[i]; - var list = gestureTouches[gesture]; + var list = gesturePointers[gesture]; if (gestureIsActive(gesture)) dispatch(gesture, list); - touchListPool.Release(list); + pointerListPool.Release(list); } - targetTouches.Clear(); - gestureTouches.Clear(); + targetPointers.Clear(); + gesturePointers.Clear(); } private void processTarget(Transform target) { - var targetList = targetTouches[target]; - var touchCount = targetList.Count; + var targetList = targetPointers[target]; + var pointerCount = targetList.Count; // gestures on objects in the hierarchy from "root" to target var list = gestureListPool.Get(); @@ -300,29 +300,29 @@ private void processTarget(Transform target) var gesture = list[i]; if (!gestureIsActive(gesture)) continue; - var touchList = touchListPool.Get(); - for (var j = 0; j < touchCount; j++) + var pointerList = pointerListPool.Get(); + for (var j = 0; j < pointerCount; j++) { - var touch = targetList[j]; - if (gesture.HasTouch(touch)) touchList.Add(touch); + var pointer = targetList[j]; + if (gesture.HasPointer(pointer)) pointerList.Add(pointer); } - if (touchList.Count > 0) + if (pointerList.Count > 0) { - if (gestureTouches.ContainsKey(gesture)) + if (gesturePointers.ContainsKey(gesture)) { - gestureTouches[gesture].AddRange(touchList); - touchListPool.Release(touchList); + gesturePointers[gesture].AddRange(pointerList); + pointerListPool.Release(pointerList); } else { activeGestures.Add(gesture); - gestureTouches.Add(gesture, touchList); + gesturePointers.Add(gesture, pointerList); } } else { - touchListPool.Release(touchList); + pointerListPool.Release(pointerList); } } gestureListPool.Release(list); @@ -330,8 +330,8 @@ private void processTarget(Transform target) private void processTargetBegan(Transform target) { - var targetList = targetTouches[target]; - var touchCount = targetList.Count; + var targetList = targetPointers[target]; + var pointerCount = targetList.Count; var containingList = gestureListPool.Get(); var endingList = gestureListPool.Get(); @@ -347,7 +347,7 @@ private void processTargetBegan(Transform target) // For example when one of them recognizes. if (!gestureIsActive(gesture)) continue; - var canReceiveTouches = true; + var canReceivePointers = true; var activeCount = containingList.Count; for (var j = 0; j < activeCount; j++) { @@ -359,36 +359,36 @@ private void processTargetBegan(Transform target) (canPreventGesture(activeGesture, gesture))) { // there's a started gesture which prevents this one - canReceiveTouches = false; + canReceivePointers = false; break; } } - // check gesture's ShouldReceiveTouch callback - if (!canReceiveTouches) continue; + // check gesture's ShouldReceivePointer callback + if (!canReceivePointers) continue; - var touchList = touchListPool.Get(); - for (var j = 0; j < touchCount; j++) + var pointerList = pointerListPool.Get(); + for (var j = 0; j < pointerCount; j++) { - var touch = targetList[j]; - if (shouldReceiveTouch(gesture, touch)) touchList.Add(touch); + var pointer = targetList[j]; + if (shouldReceivePointer(gesture, pointer)) pointerList.Add(pointer); } - if (touchList.Count > 0) + if (pointerList.Count > 0) { - if (gestureTouches.ContainsKey(gesture)) + if (gesturePointers.ContainsKey(gesture)) { - gestureTouches[gesture].AddRange(touchList); - touchListPool.Release(touchList); + gesturePointers[gesture].AddRange(pointerList); + pointerListPool.Release(pointerList); } else { activeGestures.Add(gesture); - gestureTouches.Add(gesture, touchList); + gesturePointers.Add(gesture, pointerList); } } else { - touchListPool.Release(touchList); + pointerListPool.Release(pointerList); } } @@ -527,11 +527,11 @@ private void failGesture(Gesture gesture) gesture.INTERNAL_SetState(Gesture.GestureState.Failed); } - private bool shouldReceiveTouch(Gesture gesture, TouchPoint touch) + private bool shouldReceivePointer(Gesture gesture, Pointer pointer) { bool result = true; - if (GlobalGestureDelegate != null) result = GlobalGestureDelegate.ShouldReceiveTouch(gesture, touch); - return result && gesture.ShouldReceiveTouch(touch); + if (GlobalGestureDelegate != null) result = GlobalGestureDelegate.ShouldReceivePointer(gesture, pointer); + return result && gesture.ShouldReceivePointer(pointer); } private bool shouldBegin(Gesture gesture) @@ -550,7 +550,7 @@ private bool canPreventGesture(Gesture first, Gesture second) #endregion - #region Touch events handlers + #region Pointer events handlers private void frameFinishedHandler(object sender, EventArgs eventArgs) { @@ -562,24 +562,24 @@ private void frameStartedHandler(object sender, EventArgs eventArgs) resetGestures(); } - private void touchesBeganHandler(object sender, TouchEventArgs touchEventArgs) + private void pointersBeganHandler(object sender, PointerEventArgs pointerEventArgs) { - update(touchEventArgs.Touches, _processTargetBegan, _updateBegan); + update(pointerEventArgs.Pointers, _processTargetBegan, _updateBegan); } - private void touchesMovedHandler(object sender, TouchEventArgs touchEventArgs) + private void pointersMovedHandler(object sender, PointerEventArgs pointerEventArgs) { - update(touchEventArgs.Touches, _processTarget, _updateMoved); + update(pointerEventArgs.Pointers, _processTarget, _updateMoved); } - private void touchesEndedHandler(object sender, TouchEventArgs touchEventArgs) + private void pointersEndedHandler(object sender, PointerEventArgs pointerEventArgs) { - update(touchEventArgs.Touches, _processTarget, _updateEnded); + update(pointerEventArgs.Pointers, _processTarget, _updateEnded); } - private void touchesCancelledHandler(object sender, TouchEventArgs touchEventArgs) + private void pointersCancelledHandler(object sender, PointerEventArgs pointerEventArgs) { - update(touchEventArgs.Touches, _processTarget, _updateCancelled); + update(pointerEventArgs.Pointers, _processTarget, _updateCancelled); } #endregion diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Base/PinnedTransformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/Base/PinnedTransformGestureBase.cs index c96ad0788..82efd05e2 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Base/PinnedTransformGestureBase.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Base/PinnedTransformGestureBase.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; -using TouchScript.Layers; using TouchScript.Utils; using UnityEngine; @@ -97,7 +96,7 @@ public TransformType Type } /// - /// Gets or sets minimum distance in cm for touch points to move for gesture to begin. + /// Gets or sets minimum distance in cm for pointers to move for gesture to begin. /// /// Minimum value in cm user must move their fingers to start this gesture. public float ScreenTransformThreshold @@ -132,8 +131,8 @@ public override Vector2 ScreenPosition { get { - if (NumTouches == 0) return TouchManager.INVALID_POSITION; - return activeTouches[0].Position; + if (NumPointers == 0) return TouchManager.INVALID_POSITION; + return activePointers[0].Position; } } @@ -142,8 +141,8 @@ public override Vector2 PreviousScreenPosition { get { - if (NumTouches == 0) return TouchManager.INVALID_POSITION; - return activeTouches[0].PreviousPosition; + if (NumPointers == 0) return TouchManager.INVALID_POSITION; + return activePointers[0].PreviousPosition; } } @@ -223,7 +222,7 @@ protected override void Awake() base.Awake(); debugID = DebugHelper.GetDebugId(this); - debugTouchSize = Vector2.one * TouchManager.Instance.DotsPerCentimeter * 1.1f; + debugPointerSize = Vector2.one * TouchManager.Instance.DotsPerCentimeter * 1.1f; } #endif @@ -241,12 +240,12 @@ protected override void OnEnable() #region Gesture callbacks /// - protected override void touchesBegan(IList touches) + protected override void pointersBegan(IList pointers) { - base.touchesBegan(touches); + base.pointersBegan(pointers); - if (touchesNumState == TouchesNumState.PassedMaxThreshold || - touchesNumState == TouchesNumState.PassedMinMaxThreshold) + if (pointersNumState == PointersNumState.PassedMaxThreshold || + pointersNumState == PointersNumState.PassedMinMaxThreshold) { switch (State) { @@ -259,11 +258,11 @@ protected override void touchesBegan(IList touches) } /// - protected override void touchesEnded(IList touches) + protected override void pointersEnded(IList pointers) { - base.touchesEnded(touches); + base.pointersEnded(pointers); - if (touchesNumState == TouchesNumState.PassedMinThreshold) + if (pointersNumState == PointersNumState.PassedMinThreshold) { switch (State) { @@ -332,17 +331,17 @@ protected override void reset() #region Protected methods /// - /// Checks if there are touch points in the list which matter for the gesture. + /// Checks if there are pointers in the list which matter for the gesture. /// - /// List of touch points - /// true if there are relevant touch points; false otherwise. - protected virtual bool relevantTouches(IList touches) + /// List of pointers + /// true if there are relevant pointers; false otherwise. + protected virtual bool relevantPointers(IList pointers) { - // We care only about the first touch point - var count = touches.Count; + // We care only about the first pointer + var count = pointers.Count; for (var i = 0; i < count; i++) { - if (touches[i] == activeTouches[0]) return true; + if (pointers[i] == activePointers[0]) return true; } return false; } @@ -352,7 +351,7 @@ protected virtual bool relevantTouches(IList touches) /// protected virtual Vector2 getPointScreenPosition() { - return activeTouches[0].Position; + return activePointers[0].Position; } /// @@ -360,13 +359,13 @@ protected virtual Vector2 getPointScreenPosition() /// protected virtual Vector2 getPointPreviousScreenPosition() { - return activeTouches[0].PreviousPosition; + return activePointers[0].PreviousPosition; } #if TOUCHSCRIPT_DEBUG protected int debugID; protected Coroutine debugCoroutine; - protected Vector2 debugTouchSize; + protected Vector2 debugPointerSize; protected virtual void clearDebug() { @@ -387,7 +386,7 @@ protected void drawDebugDelayed(Vector2 point1, Vector2 point2) protected virtual void drawDebug(Vector2 point1, Vector2 point2) { var color = State == GestureState.Possible ? Color.red : Color.green; - GLDebug.DrawSquareScreenSpace(debugID + 1, point2, 0f, debugTouchSize, color, float.PositiveInfinity); + GLDebug.DrawSquareScreenSpace(debugID + 1, point2, 0f, debugPointerSize, color, float.PositiveInfinity); GLDebug.DrawLineScreenSpace(debugID + 2, point1, point2, color, float.PositiveInfinity); } diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs index a9f2e1538..e8c8497f2 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs @@ -117,7 +117,7 @@ public virtual float MinScreenPointsDistance } /// - /// Gets or sets minimum distance in cm for touch points to move for gesture to begin. + /// Gets or sets minimum distance in cm for pointers to move for gesture to begin. /// /// Minimum value in cm user must move their fingers to start this gesture. public float ScreenTransformThreshold @@ -160,8 +160,8 @@ public override Vector2 ScreenPosition { get { - if (NumTouches == 0) return TouchManager.INVALID_POSITION; - if (NumTouches == 1) return activeTouches[0].Position; + if (NumPointers == 0) return TouchManager.INVALID_POSITION; + if (NumPointers == 1) return activePointers[0].Position; return (getPointScreenPosition(0) + getPointScreenPosition(1)) * .5f; } } @@ -171,8 +171,8 @@ public override Vector2 PreviousScreenPosition { get { - if (NumTouches == 0) return TouchManager.INVALID_POSITION; - if (NumTouches == 1) return activeTouches[0].PreviousPosition; + if (NumPointers == 0) return TouchManager.INVALID_POSITION; + if (NumPointers == 1) return activePointers[0].PreviousPosition; return (getPointPreviousScreenPosition(0) + getPointPreviousScreenPosition(1)) * .5f; } } @@ -267,7 +267,7 @@ protected override void Awake() base.Awake(); debugID = DebugHelper.GetDebugId(this); - debugTouchSize = Vector2.one*TouchManager.Instance.DotsPerCentimeter*1.1f; + debugPointerSize = Vector2.one*TouchManager.Instance.DotsPerCentimeter*1.1f; } #endif @@ -285,12 +285,12 @@ protected override void OnEnable() #region Gesture callbacks /// - protected override void touchesBegan(IList touches) + protected override void pointersBegan(IList pointers) { - base.touchesBegan(touches); + base.pointersBegan(pointers); - if (touchesNumState == TouchesNumState.PassedMaxThreshold || - touchesNumState == TouchesNumState.PassedMinMaxThreshold) + if (pointersNumState == PointersNumState.PassedMaxThreshold || + pointersNumState == PointersNumState.PassedMinMaxThreshold) { switch (State) { @@ -306,11 +306,11 @@ protected override void touchesBegan(IList touches) } /// - protected override void touchesMoved(IList touches) + protected override void pointersMoved(IList pointers) { - base.touchesMoved(touches); + base.pointersMoved(pointers); - var projectionParams = activeTouches[0].ProjectionParams; + var projectionParams = activePointers[0].ProjectionParams; var dP = deltaPosition = Vector3.zero; var dR = deltaRotation = 0; var dS = deltaScale = 1f; @@ -319,25 +319,25 @@ protected override void touchesMoved(IList touches) drawDebugDelayed(getNumPoints()); #endif - if (touchesNumState != TouchesNumState.InRange) return; + if (pointersNumState != PointersNumState.InRange) return; var translationEnabled = (Type & TransformType.Translation) == TransformType.Translation; var rotationEnabled = (Type & TransformType.Rotation) == TransformType.Rotation; var scalingEnabled = (Type & TransformType.Scaling) == TransformType.Scaling; - // one touch or one cluster (points might be too close to each other for 2 clusters) + // one pointer or one cluster (points might be too close to each other for 2 clusters) if (getNumPoints() == 1 || (!rotationEnabled && !scalingEnabled)) { if (!translationEnabled) return; // don't look for translates - if (!relevantTouches1(touches)) return; + if (!relevantPointers1(pointers)) return; // translate using one point dP = doOnePointTranslation(getPointPreviousScreenPosition(0), getPointScreenPosition(0), projectionParams); } else { - // Make sure that we actually care about the touches moved. - if (!relevantTouches2(touches)) return; + // Make sure that we actually care about the pointers moved. + if (!relevantPointers2(pointers)) return; var newScreenPos1 = getPointScreenPosition(0); var newScreenPos2 = getPointScreenPosition(1); @@ -428,11 +428,11 @@ protected override void touchesMoved(IList touches) } /// - protected override void touchesEnded(IList touches) + protected override void pointersEnded(IList pointers) { - base.touchesEnded(touches); + base.pointersEnded(pointers); - if (touchesNumState == TouchesNumState.PassedMinThreshold) + if (pointersNumState == PointersNumState.PassedMinThreshold) { switch (State) { @@ -571,38 +571,38 @@ protected virtual Vector3 doTwoPointTranslation(Vector2 oldScreenPos1, Vector2 o /// Number of points. protected virtual int getNumPoints() { - return NumTouches; + return NumPointers; } /// - /// Checks if there are touch points in the list which matter for the gesture. + /// Checks if there are pointers in the list which matter for the gesture. /// - /// List of touch points. - /// true if there are relevant touch points; false otherwise. - protected virtual bool relevantTouches1(IList touches) + /// List of pointers. + /// true if there are relevant pointers; false otherwise. + protected virtual bool relevantPointers1(IList pointers) { - // We care only about the first touch point - var count = touches.Count; + // We care only about the first pointer + var count = pointers.Count; for (var i = 0; i < count; i++) { - if (touches[i] == activeTouches[0]) return true; + if (pointers[i] == activePointers[0]) return true; } return false; } /// - /// Checks if there are touch points in the list which matter for the gesture. + /// Checks if there are pointers in the list which matter for the gesture. /// - /// List of touch points. - /// true if there are relevant touch points; false otherwise. - protected virtual bool relevantTouches2(IList touches) + /// List of pointers. + /// true if there are relevant pointers; false otherwise. + protected virtual bool relevantPointers2(IList pointers) { - // We care only about the first and the second touch points - var count = touches.Count; + // We care only about the first and the second pointers + var count = pointers.Count; for (var i = 0; i < count; i++) { - var touch = touches[i]; - if (touch == activeTouches[0] || touch == activeTouches[1]) return true; + var pointer = pointers[i]; + if (pointer == activePointers[0] || pointer == activePointers[1]) return true; } return false; } @@ -613,7 +613,7 @@ protected virtual bool relevantTouches2(IList touches) /// The index. protected virtual Vector2 getPointScreenPosition(int index) { - return activeTouches[index].Position; + return activePointers[index].Position; } /// @@ -622,13 +622,13 @@ protected virtual Vector2 getPointScreenPosition(int index) /// The index. protected virtual Vector2 getPointPreviousScreenPosition(int index) { - return activeTouches[index].PreviousPosition; + return activePointers[index].PreviousPosition; } #if TOUCHSCRIPT_DEBUG protected int debugID; protected Coroutine debugCoroutine; - protected Vector2 debugTouchSize; + protected Vector2 debugPointerSize; protected virtual void clearDebug() { @@ -654,7 +654,7 @@ protected virtual void drawDebug(int touchPoints) switch (touchPoints) { case 1: - GLDebug.DrawSquareScreenSpace(debugID, getPointScreenPosition(0), 0f, debugTouchSize, color, + GLDebug.DrawSquareScreenSpace(debugID, getPointScreenPosition(0), 0f, debugPointerSize, color, float.PositiveInfinity); GLDebug.RemoveFigure(debugID + 1); GLDebug.RemoveFigure(debugID + 2); @@ -662,12 +662,12 @@ protected virtual void drawDebug(int touchPoints) default: var newScreenPos1 = getPointScreenPosition(0); var newScreenPos2 = getPointScreenPosition(1); - GLDebug.DrawSquareScreenSpace(debugID, newScreenPos1, 0f, debugTouchSize, color, + GLDebug.DrawSquareScreenSpace(debugID, newScreenPos1, 0f, debugPointerSize, color, float.PositiveInfinity); - GLDebug.DrawSquareScreenSpace(debugID + 1, newScreenPos2, 0f, debugTouchSize, color, + GLDebug.DrawSquareScreenSpace(debugID + 1, newScreenPos2, 0f, debugPointerSize, color, float.PositiveInfinity); GLDebug.DrawLineWithCrossScreenSpace(debugID + 2, newScreenPos1, newScreenPos2, .5f, - debugTouchSize * .3f, color, float.PositiveInfinity); + debugPointerSize * .3f, color, float.PositiveInfinity); break; } } diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredPinnedTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredPinnedTransformGesture.cs index 8c0c19fbf..af4c04f78 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredPinnedTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredPinnedTransformGesture.cs @@ -9,7 +9,7 @@ namespace TouchScript.Gestures.Clustered { /// - /// ScreenTransformGesture which works with centroid of all touches instead of with just the first touch. + /// ScreenTransformGesture which works with centroid of all pointers instead of with just the first one. /// Should be used for large touch surfaces. /// [AddComponentMenu("TouchScript/Gestures/Clustered/Pinned Transform Gesture (Clustered)")] @@ -19,7 +19,7 @@ public class ClusteredPinnedTransformGesture : PinnedTransformGesture #region Protected methods /// - protected override bool relevantTouches(IList touches) + protected override bool relevantPointers(IList pointers) { return true; } @@ -27,13 +27,13 @@ protected override bool relevantTouches(IList touches) /// protected override Vector2 getPointScreenPosition() { - return ClusterUtils.Get2DCenterPosition(activeTouches); + return ClusterUtils.Get2DCenterPosition(activePointers); } /// protected override Vector2 getPointPreviousScreenPosition() { - return ClusterUtils.GetPrevious2DCenterPosition(activeTouches); + return ClusterUtils.GetPrevious2DCenterPosition(activePointers); } #endregion diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredScreenTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredScreenTransformGesture.cs index c43888c78..c91660f57 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredScreenTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredScreenTransformGesture.cs @@ -9,7 +9,7 @@ namespace TouchScript.Gestures.Clustered { /// - /// ScreenTransformGesture which splits all touch points into 2 clusters and works with them. + /// ScreenTransformGesture which splits all pointers into 2 clusters and works with them. /// Should be used for large touch surfaces. /// [AddComponentMenu("TouchScript/Gestures/Clustered/Screen Transform Gesture (Clustered)")] @@ -25,27 +25,27 @@ public class ClusteredScreenTransformGesture : ScreenTransformGesture #region Gesture callbacks /// - protected override void touchesBegan(IList touches) + protected override void pointersBegan(IList pointers) { - clusters.AddPoints(touches); + clusters.AddPoints(pointers); - base.touchesBegan(touches); + base.pointersBegan(pointers); } /// - protected override void touchesMoved(IList touches) + protected override void pointersMoved(IList pointers) { clusters.Invalidate(); - base.touchesMoved(touches); + base.pointersMoved(pointers); } /// - protected override void touchesEnded(IList touches) + protected override void pointersEnded(IList pointers) { - clusters.RemovePoints(touches); + clusters.RemovePoints(pointers); - base.touchesEnded(touches); + base.pointersEnded(pointers); } /// @@ -64,18 +64,18 @@ protected override void reset() protected override int getNumPoints() { if (clusters.HasClusters) return 2; - if (NumTouches > 0) return 1; + if (NumPointers > 0) return 1; return 0; } /// - protected override bool relevantTouches1(IList touches) + protected override bool relevantPointers1(IList pointers) { return true; } /// - protected override bool relevantTouches2(IList touches) + protected override bool relevantPointers2(IList pointers) { return true; } @@ -83,7 +83,7 @@ protected override bool relevantTouches2(IList touches) /// protected override Vector2 getPointScreenPosition(int index) { - if (!clusters.HasClusters) return ClusterUtils.Get2DCenterPosition(activeTouches); + if (!clusters.HasClusters) return ClusterUtils.Get2DCenterPosition(activePointers); return clusters.GetCenterPosition(index); } @@ -91,7 +91,7 @@ protected override Vector2 getPointScreenPosition(int index) /// protected override Vector2 getPointPreviousScreenPosition(int index) { - if (!clusters.HasClusters) return ClusterUtils.GetPrevious2DCenterPosition(activeTouches); + if (!clusters.HasClusters) return ClusterUtils.GetPrevious2DCenterPosition(activePointers); return clusters.GetPreviousCenterPosition(index); } diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredTransformGesture.cs index e0094ac4d..ab28e336f 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredTransformGesture.cs @@ -9,7 +9,7 @@ namespace TouchScript.Gestures.Clustered { /// - /// TransformGesture which splits all touch points into 2 clusters and works with them. + /// TransformGesture which splits all pointers into 2 clusters and works with them. /// Should be used for large touch surfaces. /// [AddComponentMenu("TouchScript/Gestures/Clustered/Transform Gesture (Clustered)")] @@ -25,27 +25,27 @@ public class ClusteredTransformGesture : TransformGesture #region Gesture callbacks /// - protected override void touchesBegan(IList touches) + protected override void pointersBegan(IList pointers) { - clusters.AddPoints(touches); + clusters.AddPoints(pointers); - base.touchesBegan(touches); + base.pointersBegan(pointers); } /// - protected override void touchesMoved(IList touches) + protected override void pointersMoved(IList pointers) { clusters.Invalidate(); - base.touchesMoved(touches); + base.pointersMoved(pointers); } /// - protected override void touchesEnded(IList touches) + protected override void pointersEnded(IList pointers) { - clusters.RemovePoints(touches); + clusters.RemovePoints(pointers); - base.touchesEnded(touches); + base.pointersEnded(pointers); } /// @@ -64,18 +64,18 @@ protected override void reset() protected override int getNumPoints() { if (clusters.HasClusters) return 2; - if (NumTouches > 0) return 1; + if (NumPointers > 0) return 1; return 0; } /// - protected override bool relevantTouches1(IList touches) + protected override bool relevantPointers1(IList pointers) { return true; } /// - protected override bool relevantTouches2(IList touches) + protected override bool relevantPointers2(IList pointers) { return true; } @@ -83,7 +83,7 @@ protected override bool relevantTouches2(IList touches) /// protected override Vector2 getPointScreenPosition(int index) { - if (!clusters.HasClusters) return ClusterUtils.Get2DCenterPosition(activeTouches); + if (!clusters.HasClusters) return ClusterUtils.Get2DCenterPosition(activePointers); return clusters.GetCenterPosition(index); } @@ -91,7 +91,7 @@ protected override Vector2 getPointScreenPosition(int index) /// protected override Vector2 getPointPreviousScreenPosition(int index) { - if (!clusters.HasClusters) return ClusterUtils.GetPrevious2DCenterPosition(activeTouches); + if (!clusters.HasClusters) return ClusterUtils.GetPrevious2DCenterPosition(activePointers); return clusters.GetPreviousCenterPosition(index); } diff --git a/Source/Assets/TouchScript/Scripts/Gestures/FlickGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/FlickGesture.cs index d5ed9ad6a..79785c7b5 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/FlickGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/FlickGesture.cs @@ -10,7 +10,7 @@ namespace TouchScript.Gestures { /// - /// Recognizes fast movement before releasing touches. Doesn't care how much time touch points were on surface and how much they moved. + /// Recognizes fast movement before releasing pointers. Doesn't care how much time pointers were on surface and how much they moved. /// [AddComponentMenu("TouchScript/Gestures/Flick Gesture")] [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Gestures_FlickGesture.htm")] @@ -65,9 +65,9 @@ public event EventHandler Flicked #region Public properties /// - /// Gets or sets time interval in seconds in which touch points must move by for gesture to succeed. + /// Gets or sets time interval in seconds in which pointers must move by for gesture to succeed. /// - /// Interval in seconds in which touch points must move by for gesture to succeed. + /// Interval in seconds in which pointers must move by for gesture to succeed. public float FlickTime { get { return flickTime; } @@ -85,9 +85,9 @@ public float MinDistance } /// - /// Gets or sets minimum distance in cm touches must move to start recognizing this gesture. + /// Gets or sets minimum distance in cm pointers must move to start recognizing this gesture. /// - /// Minimum distance in cm touches must move to start recognizing this gesture. + /// Minimum distance in cm pointers must move to start recognizing this gesture. /// Prevents misinterpreting taps. public float MovementThreshold { @@ -111,7 +111,7 @@ public GestureDirection Direction public Vector2 ScreenFlickVector { get; private set; } /// - /// Gets flick time in seconds touches moved by . + /// Gets flick time in seconds pointers moved by . /// public float ScreenFlickTime { get; private set; } @@ -153,16 +153,16 @@ protected void LateUpdate() #region Gesture callbacks /// - protected override void touchesBegan(IList touches) + protected override void pointersBegan(IList pointers) { - base.touchesBegan(touches); + base.pointersBegan(pointers); - if (touchesNumState == TouchesNumState.PassedMaxThreshold || - touchesNumState == TouchesNumState.PassedMinMaxThreshold) + if (pointersNumState == PointersNumState.PassedMaxThreshold || + pointersNumState == PointersNumState.PassedMinMaxThreshold) { if (State == GestureState.Possible) setState(GestureState.Failed); } - else if (touchesNumState == TouchesNumState.PassedMinThreshold) + else if (pointersNumState == PointersNumState.PassedMinThreshold) { // Starting the gesture when it is already active? => we released one finger and pressed again while moving if (isActive) setState(GestureState.Failed); @@ -171,9 +171,9 @@ protected override void touchesBegan(IList touches) } /// - protected override void touchesMoved(IList touches) + protected override void pointersMoved(IList pointers) { - base.touchesMoved(touches); + base.pointersMoved(pointers); if (isActive || !moving) { @@ -187,11 +187,11 @@ protected override void touchesMoved(IList touches) } /// - protected override void touchesEnded(IList touches) + protected override void pointersEnded(IList pointers) { - base.touchesEnded(touches); + base.pointersEnded(pointers); - if (NumTouches == 0) + if (NumPointers == 0) { if (!isActive || !moving) { diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs index 6f6fcebbb..9ca24a9d9 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs @@ -72,37 +72,37 @@ public enum GestureState } /// - /// Current state of the number of touch points. + /// Current state of the number of pointers. /// - protected enum TouchesNumState + protected enum PointersNumState { /// - /// The number of touch points is between min and max thresholds. + /// The number of pointers is between min and max thresholds. /// InRange, /// - /// The number of touch points is less than min threshold. + /// The number of pointers is less than min threshold. /// TooFew, /// - /// The number of touch points is greater than max threshold. + /// The number of pointers is greater than max threshold. /// TooMany, /// - /// The number of touch points passed min threshold this frame and is now in range. + /// The number of pointers passed min threshold this frame and is now in range. /// PassedMinThreshold, /// - /// The number of touch points passed max threshold this frame and is now in range. + /// The number of pointers passed max threshold this frame and is now in range. /// PassedMaxThreshold, /// - /// The number of touch points passed both min and max thresholds. + /// The number of pointers passed both min and max thresholds. /// PassedMinMaxThreshold } @@ -138,32 +138,32 @@ public event EventHandler Cancelled #region Public properties /// - /// Gets or sets minimum number of touches this gesture reacts to. - /// The gesture will not be recognized if it has less than touches. + /// Gets or sets minimum number of pointers this gesture reacts to. + /// The gesture will not be recognized if it has less than pointers. /// - /// Minimum number of touches. - public int MinTouches + /// Minimum number of pointers. + public int MinPointers { - get { return minTouches; } + get { return minPointers; } set { if (value < 0) return; - minTouches = value; + minPointers = value; } } /// - /// Gets or sets maximum number of touches this gesture reacts to. - /// The gesture will not be recognized if it has more than touches. + /// Gets or sets maximum number of pointers this gesture reacts to. + /// The gesture will not be recognized if it has more than pointers. /// - /// Maximum number of touches. - public int MaxTouches + /// Maximum number of pointers. + public int MaxPointers { - get { return maxTouches; } + get { return maxPointers; } set { if (value < 0) return; - maxTouches = value; + maxPointers = value; } } @@ -185,26 +185,26 @@ public Gesture RequireGestureToFail } /// - /// Gets or sets the flag if touches should be treated as a cluster. + /// Gets or sets the flag if pointers should be treated as a cluster. /// - /// true if touches should be treated as a cluster; otherwise, false. + /// true if pointers should be treated as a cluster; otherwise, false. /// - /// At the end of a gesture when touches are lifted off due to the fact that computers are faster than humans the very last touch's position will be gesture's after that. This flag is used to combine several touch which from the point of a user were lifted off simultaneously and set their centroid as gesture's . + /// 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 CombineTouches + public bool CombinePointers { - get { return combineTouches; } - set { combineTouches = value; } + get { return combinePointers; } + set { combinePointers = value; } } /// - /// Gets or sets time interval before gesture is recognized to combine all lifted touch points into a cluster to use its center as . + /// 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 touches lifted off during this interval as a single gesture. - public float CombineTouchesInterval + /// Time in seconds to treat pointers lifted off during this interval as a single gesture. + public float CombinePointersInterval { - get { return combineTouchesInterval; } - set { combineTouchesInterval = value; } + get { return combinePointersInterval; } + set { combinePointersInterval = value; } } /// @@ -259,16 +259,16 @@ private set onPossible(); break; case GestureState.Began: - retainTouches(); + retainPointers(); onBegan(); break; case GestureState.Changed: onChanged(); break; case GestureState.Recognized: - // Only retain/release touches for continuos gestures + // Only retain/release pointers for continuos gestures if (PreviousState == GestureState.Changed || PreviousState == GestureState.Began) - releaseTouches(true); + releasePointers(true); onRecognized(); break; case GestureState.Failed: @@ -276,7 +276,7 @@ private set break; case GestureState.Cancelled: if (PreviousState == GestureState.Changed || PreviousState == GestureState.Began) - releaseTouches(false); + releasePointers(false); onCancelled(); break; } @@ -303,12 +303,12 @@ public virtual Vector2 ScreenPosition { get { - if (NumTouches == 0) + if (NumPointers == 0) { if (!TouchManager.IsInvalidPosition(cachedScreenPosition)) return cachedScreenPosition; return TouchManager.INVALID_POSITION; } - return ClusterUtils.Get2DCenterPosition(activeTouches); + return ClusterUtils.Get2DCenterPosition(activePointers); } } @@ -320,13 +320,13 @@ public virtual Vector2 PreviousScreenPosition { get { - if (NumTouches == 0) + if (NumPointers == 0) { if (!TouchManager.IsInvalidPosition(cachedPreviousScreenPosition)) return cachedPreviousScreenPosition; return TouchManager.INVALID_POSITION; } - return ClusterUtils.GetPrevious2DCenterPosition(activeTouches); + return ClusterUtils.GetPrevious2DCenterPosition(activePointers); } } @@ -359,26 +359,26 @@ public Vector2 PreviousNormalizedScreenPosition } /// - /// Gets list of gesture's active touch points. + /// Gets list of gesture's active pointers. /// - /// The list of touches owned by this gesture. - public IList ActiveTouches + /// The list of pointers owned by this gesture. + public IList ActivePointers { get { - if (readonlyActiveTouches == null) - readonlyActiveTouches = new ReadOnlyCollection(activeTouches); - return readonlyActiveTouches; + if (readonlyActivePointers == null) + readonlyActivePointers = new ReadOnlyCollection(activePointers); + return readonlyActivePointers; } } /// - /// Gets the number of active touch points. + /// Gets the number of active pointerss. /// - /// The number of touches owned by this gesture. - public int NumTouches + /// The number of pointers owned by this gesture. + public int NumPointers { - get { return numTouches; } + get { return numPointers; } } /// @@ -406,14 +406,14 @@ protected IGestureManager gestureManager protected ITouchManager touchManager { get; private set; } /// - /// The state of min/max number of touches. + /// The state of min/max number of pointers. /// - protected TouchesNumState touchesNumState { get; private set; } + protected PointersNumState pointersNumState { get; private set; } /// - /// Touch points the gesture currently owns and works with. + /// Pointers the gesture currently owns and works with. /// - protected List activeTouches = new List(10); + protected List activePointers = new List(10); /// /// Cached transform of the parent object. @@ -424,17 +424,17 @@ protected IGestureManager gestureManager private bool advancedProps; // is used to save if advanced properties are opened or closed [SerializeField] - private int minTouches = 0; + private int minPointers = 0; [SerializeField] - private int maxTouches = 0; + private int maxPointers = 0; [SerializeField] [ToggleLeft] - private bool combineTouches = false; + private bool combinePointers = false; [SerializeField] - private float combineTouchesInterval = .3f; + private float combinePointersInterval = .3f; [SerializeField] [ToggleLeft] @@ -455,10 +455,10 @@ protected IGestureManager gestureManager // Serialized list of gestures for Unity IDE. private List friendlyGestures = new List(); - private int numTouches; + private int numPointers; private TouchLayer layer; - private ReadOnlyCollection readonlyActiveTouches; - private TimedSequence touchSequence = new TimedSequence(); + private ReadOnlyCollection readonlyActivePointers; + private TimedSequence pointerSequence = new TimedSequence(); private GestureManagerInstance gestureManagerInstance; private GestureState delayedStateChange = GestureState.Possible; private bool requiredGestureFailed = false; @@ -466,13 +466,13 @@ protected IGestureManager gestureManager /// /// Cached screen position. - /// Used to keep tap's position which can't be calculated from touch points when the gesture is recognized since all touch points are gone. + /// 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; /// /// Cached previous screen position. - /// Used to keep tap's position which can't be calculated from touch points when the gesture is recognized since all touch points are gone. + /// 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; @@ -503,7 +503,7 @@ public bool IsFriendly(Gesture gesture) } /// - /// Gets result of casting a ray from gesture touch points' centroid screen position. + /// Gets result of casting a ray from gesture pointers centroid screen position. /// /// true if ray hits gesture's target; false otherwise. public bool GetTargetHitResult() @@ -513,7 +513,7 @@ public bool GetTargetHitResult() } /// - /// Gets result of casting a ray from gesture touch points centroid screen position. + /// Gets result of casting a ray from gesture pointers centroid screen position. /// /// Raycast result /// true if ray hits gesture's target; false otherwise. @@ -556,13 +556,13 @@ public virtual bool GetTargetHitResult(Vector2 position, out TouchHit hit) } /// - /// Determines whether gesture controls a touch point. + /// Determines whether gesture controls a pointer. /// - /// The touch. - /// true if gesture controls the touch point; false otherwise. - public bool HasTouch(TouchPoint touch) + /// The pointer. + /// true if gesture controls the pointer point; false otherwise. + public bool HasPointer(Pointer pointer) { - return activeTouches.Contains(touch); + return activePointers.Contains(pointer); } /// @@ -592,14 +592,14 @@ public virtual bool CanBePreventedByGesture(Gesture gesture) } /// - /// Specifies if gesture can receive this specific touch point. + /// Specifies if gesture can receive this specific pointer point. /// - /// The touch. - /// true if this touch should be received by the gesture; false otherwise. - public virtual bool ShouldReceiveTouch(TouchPoint touch) + /// The pointer. + /// true if this pointer should be received by the gesture; false otherwise. + public virtual bool ShouldReceivePointer(Pointer pointer) { if (Delegate == null) return true; - return Delegate.ShouldReceiveTouch(this, touch); + return Delegate.ShouldReceivePointer(this, pointer); } /// @@ -615,9 +615,9 @@ public virtual bool ShouldBegin() /// /// Cancels this gesture. /// - /// if set to true also implicitly cancels all touches owned by the gesture. - /// if set to true redispatched all canceled touches. - public void Cancel(bool cancelTouches, bool returnTouches) + /// if set to true also implicitly cancels all pointers owned by the gesture. + /// if set to true redispatched all canceled pointers. + public void Cancel(bool cancelPointers, bool returnPointers) { switch (state) { @@ -629,8 +629,8 @@ public void Cancel(bool cancelTouches, bool returnTouches) setState(GestureState.Cancelled); - if (!cancelTouches) return; - for (var i = 0; i < numTouches; i++) touchManager.CancelTouch(activeTouches[i].Id, returnTouches); + if (!cancelPointers) return; + for (var i = 0; i < numPointers; i++) touchManager.CancelPointer(activePointers[i].Id, returnPointers); } /// @@ -709,131 +709,131 @@ internal void INTERNAL_SetState(GestureState value) internal void INTERNAL_Reset() { - activeTouches.Clear(); - numTouches = 0; + activePointers.Clear(); + numPointers = 0; delayedStateChange = GestureState.Possible; - touchesNumState = TouchesNumState.TooFew; + pointersNumState = PointersNumState.TooFew; requiredGestureFailed = false; reset(); } - internal void INTERNAL_TouchesBegan(IList touches) + internal void INTERNAL_PointerBegan(IList pointers) { - if (numTouches == 0) layer = touches[0].Layer; + if (numPointers == 0) layer = pointers[0].Layer; - var count = touches.Count; - var total = numTouches + count; - touchesNumState = TouchesNumState.InRange; + var count = pointers.Count; + var total = numPointers + count; + pointersNumState = PointersNumState.InRange; - if (minTouches <= 0) + if (minPointers <= 0) { - // minTouches is not set and we got our first touches - if (numTouches == 0) touchesNumState = TouchesNumState.PassedMinThreshold; + // MinPointers is not set and we got our first pointers + if (numPointers == 0) pointersNumState = PointersNumState.PassedMinThreshold; } else { - if (numTouches < minTouches) + if (numPointers < minPointers) { - // had < minTouches, got >= minTouches - if (total >= minTouches) touchesNumState = TouchesNumState.PassedMinThreshold; - else touchesNumState = TouchesNumState.TooFew; + // had < MinPointers, got >= MinPointers + if (total >= minPointers) pointersNumState = PointersNumState.PassedMinThreshold; + else pointersNumState = PointersNumState.TooFew; } } - if (maxTouches > 0) + if (maxPointers > 0) { - if (numTouches <= maxTouches) + if (numPointers <= maxPointers) { - if (total > maxTouches) + if (total > maxPointers) { - // this event we crossed both minTouches and maxTouches - if (touchesNumState == TouchesNumState.PassedMinThreshold) touchesNumState = TouchesNumState.PassedMinMaxThreshold; - // this event we crossed maxTouches - else touchesNumState = TouchesNumState.PassedMaxThreshold; + // this event we crossed both MinPointers and MaxPointers + if (pointersNumState == PointersNumState.PassedMinThreshold) pointersNumState = PointersNumState.PassedMinMaxThreshold; + // this event we crossed MaxPointers + else pointersNumState = PointersNumState.PassedMaxThreshold; } } - // last event we already were over maxTouches - else touchesNumState = TouchesNumState.TooMany; + // last event we already were over MaxPointers + else pointersNumState = PointersNumState.TooMany; } if (state == GestureState.Began || state == GestureState.Changed) { - for (var i = 0; i < count; i++) touches[i].INTERNAL_Retain(); + for (var i = 0; i < count; i++) pointers[i].INTERNAL_Retain(); } - activeTouches.AddRange(touches); - numTouches = total; - touchesBegan(touches); + activePointers.AddRange(pointers); + numPointers = total; + pointersBegan(pointers); } - internal void INTERNAL_TouchesMoved(IList touches) + internal void INTERNAL_PointersMoved(IList pointers) { - touchesNumState = TouchesNumState.InRange; - if (minTouches > 0 && numTouches < minTouches) touchesNumState = TouchesNumState.TooFew; - if (maxTouches > 0 && touchesNumState == TouchesNumState.InRange && numTouches > maxTouches) touchesNumState = TouchesNumState.TooMany; - touchesMoved(touches); + pointersNumState = PointersNumState.InRange; + if (minPointers > 0 && numPointers < minPointers) pointersNumState = PointersNumState.TooFew; + if (maxPointers > 0 && pointersNumState == PointersNumState.InRange && numPointers > maxPointers) pointersNumState = PointersNumState.TooMany; + pointersMoved(pointers); } - internal void INTERNAL_TouchesEnded(IList touches) + internal void INTERNAL_PointersEnded(IList pointers) { - var count = touches.Count; - var total = numTouches - count; - touchesNumState = TouchesNumState.InRange; + var count = pointers.Count; + var total = numPointers - count; + pointersNumState = PointersNumState.InRange; - if (minTouches <= 0) + if (minPointers <= 0) { - // have no touches - if (total == 0) touchesNumState = TouchesNumState.PassedMinThreshold; + // have no pointers + if (total == 0) pointersNumState = PointersNumState.PassedMinThreshold; } else { - if (numTouches >= minTouches) + if (numPointers >= minPointers) { - // had >= minTouches, got < minTouches - if (total < minTouches) touchesNumState = TouchesNumState.PassedMinThreshold; + // had >= MinPointers, got < MinPointers + if (total < minPointers) pointersNumState = PointersNumState.PassedMinThreshold; } - // last event we already were under minTouches - else touchesNumState = TouchesNumState.TooFew; + // last event we already were under MinPointers + else pointersNumState = PointersNumState.TooFew; } - if (maxTouches > 0) + if (maxPointers > 0) { - if (numTouches > maxTouches) + if (numPointers > maxPointers) { - if (total <= maxTouches) + if (total <= maxPointers) { - // this event we crossed both minTouches and maxTouches - if (touchesNumState == TouchesNumState.PassedMinThreshold) touchesNumState = TouchesNumState.PassedMinMaxThreshold; - // this event we crossed maxTouches - else touchesNumState = TouchesNumState.PassedMaxThreshold; + // this event we crossed both MinPointers and MaxPointers + if (pointersNumState == PointersNumState.PassedMinThreshold) pointersNumState = PointersNumState.PassedMinMaxThreshold; + // this event we crossed MaxPointers + else pointersNumState = PointersNumState.PassedMaxThreshold; } - // last event we already were over maxTouches - else touchesNumState = TouchesNumState.TooMany; + // last event we already were over MaxPointers + else pointersNumState = PointersNumState.TooMany; } } - for (var i = 0; i < count; i++) activeTouches.Remove(touches[i]); - numTouches = total; + for (var i = 0; i < count; i++) activePointers.Remove(pointers[i]); + numPointers = total; - if (combineTouches) + if (combinePointers) { - for (var i = 0; i < count; i++) touchSequence.Add(touches[i]); + for (var i = 0; i < count; i++) pointerSequence.Add(pointers[i]); - if (NumTouches == 0) + if (NumPointers == 0) { // Checking which points were removed in clusterExistenceTime seconds to set their centroid as cached screen position - var cluster = touchSequence.FindElementsLaterThan(Time.time - combineTouchesInterval, - shouldCacheTouchPosition); + var cluster = pointerSequence.FindElementsLaterThan(Time.time - combinePointersInterval, + shouldCachePointerPosition); cachedScreenPosition = ClusterUtils.Get2DCenterPosition(cluster); cachedPreviousScreenPosition = ClusterUtils.GetPrevious2DCenterPosition(cluster); } } else { - if (NumTouches == 0) + if (NumPointers == 0) { - var lastPoint = touches[count - 1]; - if (shouldCacheTouchPosition(lastPoint)) + var lastPoint = pointers[count - 1]; + if (shouldCachePointerPosition(lastPoint)) { cachedScreenPosition = lastPoint.Position; cachedPreviousScreenPosition = lastPoint.PreviousPosition; @@ -846,50 +846,50 @@ internal void INTERNAL_TouchesEnded(IList touches) } } - touchesEnded(touches); + pointersEnded(pointers); } - internal void INTERNAL_TouchesCancelled(IList touches) + internal void INTERNAL_PointersCancelled(IList pointers) { - var count = touches.Count; - var total = numTouches - count; - touchesNumState = TouchesNumState.InRange; + var count = pointers.Count; + var total = numPointers - count; + pointersNumState = PointersNumState.InRange; - if (minTouches <= 0) + if (minPointers <= 0) { - // have no touches - if (total == 0) touchesNumState = TouchesNumState.PassedMinThreshold; + // have no pointers + if (total == 0) pointersNumState = PointersNumState.PassedMinThreshold; } else { - if (numTouches >= minTouches) + if (numPointers >= minPointers) { - // had >= minTouches, got < minTouches - if (total < minTouches) touchesNumState = TouchesNumState.PassedMinThreshold; + // had >= MinPointers, got < MinPointers + if (total < minPointers) pointersNumState = PointersNumState.PassedMinThreshold; } - // last event we already were under minTouches - else touchesNumState = TouchesNumState.TooFew; + // last event we already were under MinPointers + else pointersNumState = PointersNumState.TooFew; } - if (maxTouches > 0) + if (maxPointers > 0) { - if (numTouches > maxTouches) + if (numPointers > maxPointers) { - if (total <= maxTouches) + if (total <= maxPointers) { - // this event we crossed both minTouches and maxTouches - if (touchesNumState == TouchesNumState.PassedMinThreshold) touchesNumState = TouchesNumState.PassedMinMaxThreshold; - // this event we crossed maxTouches - else touchesNumState = TouchesNumState.PassedMaxThreshold; + // this event we crossed both MinPointers and MaxPointers + if (pointersNumState == PointersNumState.PassedMinThreshold) pointersNumState = PointersNumState.PassedMinMaxThreshold; + // this event we crossed MaxPointers + else pointersNumState = PointersNumState.PassedMaxThreshold; } - // last event we already were over maxTouches - else touchesNumState = TouchesNumState.TooMany; + // last event we already were over MaxPointers + else pointersNumState = PointersNumState.TooMany; } } - for (var i = 0; i < count; i++) activeTouches.Remove(touches[i]); - numTouches = total; - touchesCancelled(touches); + for (var i = 0; i < count; i++) activePointers.Remove(pointers[i]); + numPointers = total; + pointersCancelled(pointers); } internal virtual void INTERNAL_RemoveFriendlyGesture(Gesture gesture) @@ -905,11 +905,11 @@ internal virtual void INTERNAL_RemoveFriendlyGesture(Gesture gesture) #region Protected methods /// - /// Should the gesture cache this touches to use it later in calculation of . + /// Should the gesture cache this pointers to use it later in calculation of . /// - /// Touch to cache. - /// true if touches should be cached; false otherwise. - protected virtual bool shouldCacheTouchPosition(TouchPoint value) + /// Pointer to cache. + /// true if pointers should be cached; false otherwise. + protected virtual bool shouldCachePointerPosition(Pointer value) { return true; } @@ -953,30 +953,30 @@ protected bool setState(GestureState value) #region Callbacks /// - /// Called when new touches appear. + /// Called when new pointers appear. /// - /// The touches. - protected virtual void touchesBegan(IList touches) {} + /// The pointers. + protected virtual void pointersBegan(IList pointers) {} /// - /// Called for moved touches. + /// Called for moved pointers. /// - /// The touches. - protected virtual void touchesMoved(IList touches) {} + /// The pointers. + protected virtual void pointersMoved(IList pointers) {} /// - /// Called if touches are removed. + /// Called if pointers are removed. /// - /// The touches. - protected virtual void touchesEnded(IList touches) {} + /// The pointers. + protected virtual void pointersEnded(IList pointers) {} /// - /// Called when touches are cancelled. + /// Called when pointers are cancelled. /// - /// The touches. - protected virtual void touchesCancelled(IList touches) + /// The pointers. + protected virtual void pointersCancelled(IList pointers) { - if (touchesNumState == TouchesNumState.PassedMinThreshold) + if (pointersNumState == PointersNumState.PassedMinThreshold) { // moved below the threshold switch (state) @@ -1039,19 +1039,19 @@ protected virtual void onCancelled() #region Private functions - private void retainTouches() + private void retainPointers() { - var total = NumTouches; - for (var i = 0; i < total; i++) activeTouches[i].INTERNAL_Retain(); + var total = NumPointers; + for (var i = 0; i < total; i++) activePointers[i].INTERNAL_Retain(); } - private void releaseTouches(bool cancel) + private void releasePointers(bool cancel) { - var total = NumTouches; + var total = NumPointers; for (var i = 0; i < total; i++) { - var touch = activeTouches[i]; - if (touch.INTERNAL_Release() == 0 && cancel) touchManager.CancelTouch(touch.Id, true); + var pointer = activePointers[i]; + if (pointer.INTERNAL_Release() == 0 && cancel) touchManager.CancelPointer(pointer.Id, true); } } diff --git a/Source/Assets/TouchScript/Scripts/Gestures/IGestureDelegate.cs b/Source/Assets/TouchScript/Scripts/Gestures/IGestureDelegate.cs index f75e00cbe..b7c269a10 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/IGestureDelegate.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/IGestureDelegate.cs @@ -14,13 +14,13 @@ namespace TouchScript public interface IGestureDelegate { /// - /// Returns whether a gesture should receive a touch. + /// Returns whether a gesture should receive a pointer. /// /// The gesture. - /// The touch. + /// The pointer. /// true if it should; false otherwise. - /// Can be used to restrict what touches a gesture can receive and ignore the ones it shouldn't. - bool ShouldReceiveTouch(Gesture gesture, TouchPoint touch); + /// Can be used to restrict what pointers a gesture can receive and ignore the ones it shouldn't. + bool ShouldReceivePointer(Gesture gesture, Pointer pointer); /// /// Returns whether a gesture can now begin. diff --git a/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs index 2cfb9cbfe..ecd208ce3 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs @@ -46,7 +46,7 @@ public event EventHandler LongPressed #region Public properties /// - /// Gets or sets total time in seconds required to hold touches still. + /// Gets or sets total time in seconds required to hold pointers still. /// /// Time in seconds. public float TimeToPress @@ -56,7 +56,7 @@ public float TimeToPress } /// - /// Gets or sets maximum distance in cm touch points can move before gesture fails. + /// Gets or sets maximum distance in cm pointers can move before gesture fails. /// /// Distance in cm. public float DistanceLimit @@ -101,25 +101,25 @@ protected override void OnEnable() #region Gesture callbacks /// - protected override void touchesBegan(IList touches) + protected override void pointersBegan(IList pointers) { - base.touchesBegan(touches); + base.pointersBegan(pointers); - if (touchesNumState == TouchesNumState.PassedMaxThreshold || - touchesNumState == TouchesNumState.PassedMinMaxThreshold) + if (pointersNumState == PointersNumState.PassedMaxThreshold || + pointersNumState == PointersNumState.PassedMinMaxThreshold) { setState(GestureState.Failed); } - else if (touchesNumState == TouchesNumState.PassedMinThreshold) + else if (pointersNumState == PointersNumState.PassedMinThreshold) { StartCoroutine("wait"); } } /// - protected override void touchesMoved(IList touches) + protected override void pointersMoved(IList pointers) { - base.touchesMoved(touches); + base.pointersMoved(pointers); if (distanceLimit < float.PositiveInfinity) { @@ -129,11 +129,11 @@ protected override void touchesMoved(IList touches) } /// - protected override void touchesEnded(IList touches) + protected override void pointersEnded(IList pointers) { - base.touchesEnded(touches); + base.pointersEnded(pointers); - if (touchesNumState == TouchesNumState.PassedMinThreshold) + if (pointersNumState == PointersNumState.PassedMinThreshold) { setState(GestureState.Failed); } diff --git a/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs index 7b7db7d21..81f02b716 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs @@ -10,7 +10,7 @@ namespace TouchScript.Gestures { /// - /// Converts touch events for target object into separate events to be used somewhere else. + /// Converts Pointer events for target object into separate events to be used somewhere else. /// [AddComponentMenu("TouchScript/Gestures/Meta Gesture")] [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Gestures_MetaGesture.htm")] @@ -19,146 +19,146 @@ public sealed class MetaGesture : Gesture #region Constants /// - /// Message dispatched when a touch begins. + /// Message dispatched when a pointer begins. /// - public const string TOUCH_BEGAN_MESSAGE = "OnTouchBegan"; + public const string POINTER_BEGAN_MESSAGE = "OnPointerBegan"; /// - /// Message dispatched when a touch moves. + /// Message dispatched when a pointer moves. /// - public const string TOUCH_MOVED_MESSAGE = "OnTouchMoved"; + public const string POINTER_MOVED_MESSAGE = "OnPointerMoved"; /// - /// Message dispatched when a touch ends. + /// Message dispatched when a pointer ends. /// - public const string TOUCH_ENDED_MESSAGE = "OnTouchEnded"; + public const string POINTER_ENDED_MESSAGE = "OnPointerEnded"; /// - /// Message dispatched when a touch is cancelled. + /// Message dispatched when a pointer is cancelled. /// - public const string TOUCH_CANCELLED_MESSAGE = "OnTouchCancelled"; + public const string POINTER_CANCELLED_MESSAGE = "OnPointerCancelled"; #endregion #region Events /// - /// Occurs when a touch point is added. + /// Occurs when a pointer is added. /// - public event EventHandler TouchBegan + public event EventHandler PointerBegan { - add { touchBeganInvoker += value; } - remove { touchBeganInvoker -= value; } + add { pointerBeganInvoker += value; } + remove { pointerBeganInvoker -= value; } } /// - /// Occurs when a touch point is updated. + /// Occurs when a pointer is updated. /// - public event EventHandler TouchMoved + public event EventHandler PointerMoved { - add { touchMovedInvoker += value; } - remove { touchMovedInvoker -= value; } + add { pointerMovedInvoker += value; } + remove { pointerMovedInvoker -= value; } } /// - /// Occurs when a touch point is removed. + /// Occurs when a pointer is removed. /// - public event EventHandler TouchEnded + public event EventHandler PointerEnded { - add { touchEndedInvoker += value; } - remove { touchEndedInvoker -= value; } + add { pointerEndedInvoker += value; } + remove { pointerEndedInvoker -= value; } } /// - /// Occurs when a touch point is cancelled. + /// Occurs when a pointer is cancelled. /// - public event EventHandler TouchCancelled + public event EventHandler PointerCancelled { - add { touchCancelledInvoker += value; } - remove { touchCancelledInvoker -= value; } + add { pointerCancelledInvoker += value; } + remove { pointerCancelledInvoker -= value; } } // Needed to overcome iOS AOT limitations - private EventHandler touchBeganInvoker, - touchMovedInvoker, - touchEndedInvoker, - touchCancelledInvoker; + private EventHandler pointerBeganInvoker, + pointerMovedInvoker, + pointerEndedInvoker, + pointerCancelledInvoker; #endregion #region Gesture callbacks /// - protected override void touchesBegan(IList touches) + protected override void pointersBegan(IList pointers) { - base.touchesBegan(touches); + base.pointersBegan(pointers); if (State == GestureState.Possible) setState(GestureState.Began); - var length = touches.Count; - if (touchBeganInvoker != null) + var length = pointers.Count; + if (pointerBeganInvoker != null) { for (var i = 0; i < length; i++) - touchBeganInvoker.InvokeHandleExceptions(this, new MetaGestureEventArgs(touches[i])); + pointerBeganInvoker.InvokeHandleExceptions(this, new MetaGestureEventArgs(pointers[i])); } if (UseSendMessage && SendMessageTarget != null) { - for (var i = 0; i < length; i++) SendMessageTarget.SendMessage(TOUCH_BEGAN_MESSAGE, touches[i], SendMessageOptions.DontRequireReceiver); + for (var i = 0; i < length; i++) SendMessageTarget.SendMessage(POINTER_BEGAN_MESSAGE, pointers[i], SendMessageOptions.DontRequireReceiver); } } /// - protected override void touchesMoved(IList touches) + protected override void pointersMoved(IList pointers) { - base.touchesMoved(touches); + base.pointersMoved(pointers); if (State == GestureState.Began || State == GestureState.Changed) setState(GestureState.Changed); - var length = touches.Count; - if (touchMovedInvoker != null) + var length = pointers.Count; + if (pointerMovedInvoker != null) { for (var i = 0; i < length; i++) - touchMovedInvoker.InvokeHandleExceptions(this, new MetaGestureEventArgs(touches[i])); + pointerMovedInvoker.InvokeHandleExceptions(this, new MetaGestureEventArgs(pointers[i])); } if (UseSendMessage && SendMessageTarget != null) { - for (var i = 0; i < length; i++) SendMessageTarget.SendMessage(TOUCH_MOVED_MESSAGE, touches[i], SendMessageOptions.DontRequireReceiver); + for (var i = 0; i < length; i++) SendMessageTarget.SendMessage(POINTER_MOVED_MESSAGE, pointers[i], SendMessageOptions.DontRequireReceiver); } } /// - protected override void touchesEnded(IList touches) + protected override void pointersEnded(IList pointers) { - base.touchesEnded(touches); + base.pointersEnded(pointers); - if ((State == GestureState.Began || State == GestureState.Changed) && NumTouches == 0) setState(GestureState.Ended); + if ((State == GestureState.Began || State == GestureState.Changed) && NumPointers == 0) setState(GestureState.Ended); - var length = touches.Count; - if (touchEndedInvoker != null) + var length = pointers.Count; + if (pointerEndedInvoker != null) { for (var i = 0; i < length; i++) - touchEndedInvoker.InvokeHandleExceptions(this, new MetaGestureEventArgs(touches[i])); + pointerEndedInvoker.InvokeHandleExceptions(this, new MetaGestureEventArgs(pointers[i])); } if (UseSendMessage && SendMessageTarget != null) { - for (var i = 0; i < length; i++) SendMessageTarget.SendMessage(TOUCH_ENDED_MESSAGE, touches[i], SendMessageOptions.DontRequireReceiver); + for (var i = 0; i < length; i++) SendMessageTarget.SendMessage(POINTER_ENDED_MESSAGE, pointers[i], SendMessageOptions.DontRequireReceiver); } } /// - protected override void touchesCancelled(IList touches) + protected override void pointersCancelled(IList pointers) { - base.touchesCancelled(touches); + base.pointersCancelled(pointers); - var length = touches.Count; - if (touchCancelledInvoker != null) + var length = pointers.Count; + if (pointerCancelledInvoker != null) { for (var i = 0; i < length; i++) - touchCancelledInvoker.InvokeHandleExceptions(this, new MetaGestureEventArgs(touches[i])); + pointerCancelledInvoker.InvokeHandleExceptions(this, new MetaGestureEventArgs(pointers[i])); } if (UseSendMessage && SendMessageTarget != null) { - for (var i = 0; i < length; i++) SendMessageTarget.SendMessage(TOUCH_CANCELLED_MESSAGE, touches[i], SendMessageOptions.DontRequireReceiver); + for (var i = 0; i < length; i++) SendMessageTarget.SendMessage(POINTER_CANCELLED_MESSAGE, pointers[i], SendMessageOptions.DontRequireReceiver); } } @@ -171,17 +171,17 @@ protected override void touchesCancelled(IList touches) public class MetaGestureEventArgs : EventArgs { /// - /// Current touch point. + /// Current pointer. /// - public TouchPoint Touch { get; private set; } + public Pointer Pointer { get; private set; } /// /// Initializes a new instance of the class. /// - /// Touch point the event is for. - public MetaGestureEventArgs(TouchPoint touch) + /// Pointer the event is for. + public MetaGestureEventArgs(Pointer pointer) { - Touch = touch; + Pointer = pointer; } } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs index 0cd9aa62d..49fe99107 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs @@ -2,7 +2,6 @@ * @author Valentin Simonov / http://va.lent.in/ */ -using System; using System.Collections.Generic; using TouchScript.Gestures.Base; using TouchScript.Layers; @@ -150,28 +149,28 @@ protected override void OnEnable() #region Gesture callbacks /// - protected override void touchesBegan(IList touches) + protected override void pointersBegan(IList pointers) { - base.touchesBegan(touches); + base.pointersBegan(pointers); if (State != GestureState.Possible) return; - if (NumTouches == touches.Count) + if (NumPointers == pointers.Count) { - projectionLayer = activeTouches[0].Layer; + projectionLayer = activePointers[0].Layer; updateProjectionPlane(); #if TOUCHSCRIPT_DEBUG - drawDebug(activeTouches[0].ProjectionParams.ProjectFrom(cachedTransform.position), activeTouches[0].Position); + drawDebug(activePointers[0].ProjectionParams.ProjectFrom(cachedTransform.position), activePointers[0].Position); #endif } } /// - protected override void touchesMoved(IList touches) + protected override void pointersMoved(IList pointers) { - base.touchesMoved(touches); + base.pointersMoved(pointers); - var projectionParams = activeTouches[0].ProjectionParams; + var projectionParams = activePointers[0].ProjectionParams; var dR = deltaRotation = 0; var dS = deltaScale = 1f; @@ -182,18 +181,18 @@ protected override void touchesMoved(IList touches) drawDebug(screenCenter, newScreenPos); #endif - if (touchesNumState != TouchesNumState.InRange) return; + if (pointersNumState != PointersNumState.InRange) return; var rotationEnabled = (Type & TransformType.Rotation) == TransformType.Rotation; var scalingEnabled = (Type & TransformType.Scaling) == TransformType.Scaling; if (!rotationEnabled && !scalingEnabled) return; - if (!relevantTouches(touches)) return; + if (!relevantPointers(pointers)) return; #if !TOUCHSCRIPT_DEBUG - var theTouch = activeTouches[0]; + var thePointer = activePointers[0]; var worldCenter = cachedTransform.position; var screenCenter = projectionParams.ProjectFrom(worldCenter); - var newScreenPos = theTouch.Position; + var newScreenPos = thePointer.Position; #endif // Here we can't reuse last frame screen positions because points 0 and 1 can change. @@ -259,12 +258,12 @@ protected override void touchesMoved(IList touches) #if TOUCHSCRIPT_DEBUG /// - protected override void touchesEnded(IList touches) + protected override void pointersEnded(IList pointers) { - base.touchesEnded(touches); + base.pointersEnded(pointers); - if (NumTouches == 0) return; - drawDebug(activeTouches[0].ProjectionParams.ProjectFrom(cachedTransform.position), activeTouches[0].Position); + if (NumPointers == 0) return; + drawDebug(activePointers[0].ProjectionParams.ProjectFrom(cachedTransform.position), activePointers[0].Position); } #endif diff --git a/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs index 6914d1836..8746354ae 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs @@ -68,12 +68,12 @@ public bool IgnoreChildren #region Gesture callbacks /// - public override bool ShouldReceiveTouch(TouchPoint touch) + public override bool ShouldReceivePointer(Pointer pointer) { - if (!IgnoreChildren) return base.ShouldReceiveTouch(touch); - if (!base.ShouldReceiveTouch(touch)) return false; + if (!IgnoreChildren) return base.ShouldReceivePointer(pointer); + if (!base.ShouldReceivePointer(pointer)) return false; - if (touch.Target != cachedTransform) return false; + if (pointer.Target != cachedTransform) return false; return true; } @@ -92,11 +92,11 @@ public override bool CanBePreventedByGesture(Gesture gesture) } /// - protected override void touchesBegan(IList touches) + protected override void pointersBegan(IList pointers) { - base.touchesBegan(touches); + base.pointersBegan(pointers); - if (touchesNumState == TouchesNumState.PassedMinThreshold) setState(GestureState.Recognized); + if (pointersNumState == PointersNumState.PassedMinThreshold) setState(GestureState.Recognized); } /// diff --git a/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs index bdea821b1..604a4b0cb 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs @@ -11,7 +11,7 @@ namespace TouchScript.Gestures { /// - /// Recognizes when last touch is released from target. + /// Recognizes when last pointer is released from target. /// Works with any gesture unless a Delegate is set. /// [AddComponentMenu("TouchScript/Gestures/Release Gesture")] @@ -68,12 +68,12 @@ public bool IgnoreChildren #region Gesture callbacks /// - public override bool ShouldReceiveTouch(TouchPoint touch) + public override bool ShouldReceivePointer(Pointer pointer) { - if (!IgnoreChildren) return base.ShouldReceiveTouch(touch); - if (!base.ShouldReceiveTouch(touch)) return false; + if (!IgnoreChildren) return base.ShouldReceivePointer(pointer); + if (!base.ShouldReceivePointer(pointer)) return false; - if (touch.Target != cachedTransform) return false; + if (pointer.Target != cachedTransform) return false; return true; } @@ -92,11 +92,11 @@ public override bool CanBePreventedByGesture(Gesture gesture) } /// - protected override void touchesEnded(IList touches) + protected override void pointersEnded(IList pointers) { - base.touchesEnded(touches); + base.pointersEnded(pointers); - if (touchesNumState == TouchesNumState.PassedMinThreshold) setState(GestureState.Recognized); + if (pointersNumState == PointersNumState.PassedMinThreshold) setState(GestureState.Recognized); } /// diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs index a0c23adbb..ff1c5ad64 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs @@ -70,9 +70,9 @@ public float TimeLimit } /// - /// Gets or sets maximum distance for touch cluster must move for the gesture to fail. + /// Gets or sets maximum distance for point cluster must move for the gesture to fail. /// - /// Distance in cm touches must move before gesture fails. + /// Distance in cm pointers must move before gesture fails. public float DistanceLimit { get { return distanceLimit; } @@ -124,37 +124,37 @@ protected override void OnEnable() #region Gesture callbacks /// - protected override void touchesBegan(IList touches) + protected override void pointersBegan(IList pointers) { - base.touchesBegan(touches); + base.pointersBegan(pointers); - if (touchesNumState == TouchesNumState.PassedMaxThreshold || - touchesNumState == TouchesNumState.PassedMinMaxThreshold) + if (pointersNumState == PointersNumState.PassedMaxThreshold || + pointersNumState == PointersNumState.PassedMinMaxThreshold) { setState(GestureState.Failed); return; } - if (NumTouches == touches.Count) + if (NumPointers == pointers.Count) { - // the first ever touch + // the first ever pointer if (tapsDone == 0) { - startPosition = touches[0].Position; + startPosition = pointers[0].Position; if (timeLimit < float.PositiveInfinity) StartCoroutine("wait"); } else if (tapsDone >= numberOfTapsRequired) // Might be delayed and retapped while waiting { setState(GestureState.Possible); reset(); - startPosition = touches[0].Position; + startPosition = pointers[0].Position; if (timeLimit < float.PositiveInfinity) StartCoroutine("wait"); } else { if (distanceLimit < float.PositiveInfinity) { - if ((touches[0].Position - startPosition).sqrMagnitude > distanceLimitInPixelsSquared) + if ((pointers[0].Position - startPosition).sqrMagnitude > distanceLimitInPixelsSquared) { setState(GestureState.Failed); return; @@ -162,7 +162,7 @@ protected override void touchesBegan(IList touches) } } } - if (touchesNumState == TouchesNumState.PassedMinThreshold) + if (pointersNumState == PointersNumState.PassedMinThreshold) { // Starting the gesture when it is already active? => we released one finger and pressed again if (isActive) setState(GestureState.Failed); @@ -171,23 +171,23 @@ protected override void touchesBegan(IList touches) } /// - protected override void touchesMoved(IList touches) + protected override void pointersMoved(IList pointers) { - base.touchesMoved(touches); + base.pointersMoved(pointers); if (distanceLimit < float.PositiveInfinity) { - totalMovement += touches[0].Position - touches[0].PreviousPosition; + totalMovement += pointers[0].Position - pointers[0].PreviousPosition; if (totalMovement.sqrMagnitude > distanceLimitInPixelsSquared) setState(GestureState.Failed); } } /// - protected override void touchesEnded(IList touches) + protected override void pointersEnded(IList pointers) { - base.touchesEnded(touches); + base.pointersEnded(pointers); - if (NumTouches == 0) + if (NumPointers == 0) { if (!isActive) { @@ -195,8 +195,8 @@ protected override void touchesEnded(IList touches) return; } - // touches outside of gesture target are ignored in shouldCacheTouchPosition() - // if all touches are outside ScreenPosition will be invalid + // 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); @@ -232,7 +232,7 @@ protected override void reset() } /// - protected override bool shouldCacheTouchPosition(TouchPoint value) + protected override bool shouldCachePointerPosition(Pointer value) { // Points must be over target when released return GetTargetHitResult(value.Position); diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs index 618ecf02c..b6a436ed8 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs @@ -157,14 +157,14 @@ protected override void OnEnable() #region Gesture callbacks /// - protected override void touchesBegan(IList touches) + protected override void pointersBegan(IList pointers) { - base.touchesBegan(touches); + base.pointersBegan(pointers); if (State != GestureState.Possible) return; - if (NumTouches == touches.Count) + if (NumPointers == pointers.Count) { - projectionLayer = activeTouches[0].Layer; + projectionLayer = activePointers[0].Layer; updateProjectionPlane(); } } @@ -255,12 +255,12 @@ protected override void clearDebug() GLDebug.RemoveFigure(debugID + 3); } - protected override void drawDebug(int touchPoints) + protected override void drawDebug(int pointers) { - base.drawDebug(touchPoints); + base.drawDebug(pointers); if (!DebugMode) return; - switch (touchPoints) + switch (pointers) { case 1: if (projection == ProjectionType.Global || projection == ProjectionType.Object) diff --git a/Source/Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs index 89c4b5ea0..e71216833 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs @@ -10,7 +10,7 @@ namespace TouchScript.Gestures.UI { /// - /// Gesture which receives touch input from TouchScript and routes it to Unity UI components on the same GameObject. + /// Gesture which receives pointer input from TouchScript and routes it to Unity UI components on the same GameObject. /// Mostly needed for UI buttons to work with . /// [AddComponentMenu("TouchScript/Gestures/UI Gesture")] @@ -20,9 +20,9 @@ public class UIGesture : Gesture #region Protected variables /// - /// Touch id -> pointer data. + /// Pointer id -> pointer data. /// - protected Dictionary pointerData = new Dictionary(); + protected Dictionary pointerData = new Dictionary(); #endregion @@ -43,31 +43,31 @@ public override bool CanBePreventedByGesture(Gesture gesture) } /// - protected override void touchesBegan(IList touches) + protected override void pointersBegan(IList pointers) { - base.touchesBegan(touches); + base.pointersBegan(pointers); - if (NumTouches == touches.Count) setState(GestureState.Began); + if (NumPointers == pointers.Count) setState(GestureState.Began); - for (var i = 0; i < touches.Count; i++) + for (var i = 0; i < pointers.Count; i++) { - var touch = touches[i]; - var data = getPointerData(touch); + var pointer = pointers[i]; + var data = getPointerData(pointer); ExecuteEvents.Execute(gameObject, data.Data, ExecuteEvents.pointerEnterHandler); ExecuteEvents.Execute(gameObject, data.Data, ExecuteEvents.pointerDownHandler); } } /// - protected override void touchesMoved(IList touches) + protected override void pointersMoved(IList pointers) { - base.touchesMoved(touches); + base.pointersMoved(pointers); - for (var i = 0; i < touches.Count; i++) + for (var i = 0; i < pointers.Count; i++) { - var touch = touches[i]; - var data = getPointerData(touch); - if (TouchUtils.IsTouchOnTarget(touch, cachedTransform)) + var pointer = pointers[i]; + var data = getPointerData(pointer); + if (PointerUtils.IsPointerOnTarget(pointer, cachedTransform)) { if (!data.OnTarget) { @@ -83,45 +83,45 @@ protected override void touchesMoved(IList touches) ExecuteEvents.Execute(gameObject, data.Data, ExecuteEvents.pointerExitHandler); } } - setPointerData(touch, data); + setPointerData(pointer, data); } } /// - protected override void touchesEnded(IList touches) + protected override void pointersEnded(IList pointers) { - base.touchesEnded(touches); + base.pointersEnded(pointers); - TouchData onTarget = new TouchData(); - for (var i = 0; i < touches.Count; i++) + PointerData onTarget = new PointerData(); + for (var i = 0; i < pointers.Count; i++) { - var touch = touches[i]; - var data = getPointerData(touch); + var pointer = pointers[i]; + var data = getPointerData(pointer); ExecuteEvents.Execute(gameObject, data.Data, ExecuteEvents.pointerUpHandler); if (data.OnTarget) onTarget = data; - removePointerData(touch); + removePointerData(pointer); } - // One of the touches was released ontop of the target + // One of the pointers was released ontop of the target if (onTarget.OnTarget) ExecuteEvents.Execute(gameObject, onTarget.Data, ExecuteEvents.pointerClickHandler); - if (activeTouches.Count == 0) setState(GestureState.Ended); + if (activePointers.Count == 0) setState(GestureState.Ended); } /// - protected override void touchesCancelled(IList touches) + protected override void pointersCancelled(IList pointers) { - base.touchesCancelled(touches); + base.pointersCancelled(pointers); - for (var i = 0; i < touches.Count; i++) + for (var i = 0; i < pointers.Count; i++) { - var touch = touches[i]; - var data = getPointerData(touch); + var pointer = pointers[i]; + var data = getPointerData(pointer); ExecuteEvents.Execute(gameObject, data.Data, ExecuteEvents.pointerUpHandler); - removePointerData(touch); + removePointerData(pointer); } - if (activeTouches.Count == 0) setState(GestureState.Ended); + if (activePointers.Count == 0) setState(GestureState.Ended); } #endregion @@ -129,63 +129,63 @@ protected override void touchesCancelled(IList touches) #region Protected methods /// - /// Gets or creates pointer data for touch. + /// Gets or creates pointer data for pointer. /// - /// The touch. + /// The pointer. /// Pointer data. - protected virtual TouchData getPointerData(TouchPoint touch) + protected virtual PointerData getPointerData(Pointer pointer) { - TouchData data; - if (!pointerData.TryGetValue(touch.Id, out data)) + PointerData data; + if (!pointerData.TryGetValue(pointer.Id, out data)) { - data = new TouchData + data = new PointerData { OnTarget = true, Data = new PointerEventData(EventSystem.current) { - pointerId = touch.Id, + pointerId = pointer.Id, pointerEnter = gameObject, pointerPress = gameObject, eligibleForClick = true, delta = Vector2.zero, dragging = false, useDragThreshold = true, - position = touch.Position, - pressPosition = touch.Position, - pointerPressRaycast = touch.Hit.RaycastResult, - pointerCurrentRaycast = touch.Hit.RaycastResult + position = pointer.Position, + pressPosition = pointer.Position, + pointerPressRaycast = pointer.Hit.RaycastResult, + pointerCurrentRaycast = pointer.Hit.RaycastResult } }; - pointerData.Add(touch.Id, data); + pointerData.Add(pointer.Id, data); } return data; } /// - /// Sets pointer data for touch. + /// Sets pointer data for pointer. /// - /// The touch. + /// The pointer. /// The data. - protected virtual void setPointerData(TouchPoint touch, TouchData data) + protected virtual void setPointerData(Pointer pointer, PointerData data) { - if (pointerData.ContainsKey(touch.Id)) pointerData[touch.Id] = data; + if (pointerData.ContainsKey(pointer.Id)) pointerData[pointer.Id] = data; } /// - /// Removes pointer data for touch. + /// Removes pointer data for pointer. /// - /// The touch. - protected virtual void removePointerData(TouchPoint touch) + /// The pointer. + protected virtual void removePointerData(Pointer pointer) { - pointerData.Remove(touch.Id); + pointerData.Remove(pointer.Id); } #endregion /// - /// Touch pointer data value object. + /// Pointer data value object. /// - protected struct TouchData + protected struct PointerData { /// /// Is the object over the target it first hit? @@ -198,11 +198,11 @@ protected struct TouchData public PointerEventData Data; /// - /// Initializes a new instance of the struct. + /// Initializes a new instance of the struct. /// - /// if set to true touch is on target. + /// if set to true pointer is on target. /// The data. - public TouchData(bool onTarget = false, PointerEventData data = null) + public PointerData(bool onTarget = false, PointerEventData data = null) { OnTarget = onTarget; Data = data; diff --git a/Source/Assets/TouchScript/Scripts/Hit/HitTest.cs b/Source/Assets/TouchScript/Scripts/Hit/HitTest.cs index 0c6981762..ffc3accdc 100644 --- a/Source/Assets/TouchScript/Scripts/Hit/HitTest.cs +++ b/Source/Assets/TouchScript/Scripts/Hit/HitTest.cs @@ -14,7 +14,7 @@ public abstract class HitTest : MonoBehaviour #region Constants /// - /// Result of a check to find if a hit object should recieve this touch or not. + /// Result of a check to find if a hit object should recieve this pointer or not. /// public enum ObjectHitResult { @@ -24,17 +24,17 @@ public enum ObjectHitResult Error = 0, /// - /// This is a hit, object should recieve touch. + /// This is a hit, object should recieve pointer. /// Hit = 1, /// - /// Object should not recieve touch. + /// Object should not recieve pointer. /// Miss = 2, /// - /// Object should not recieve touch and this touch should be discarded and not tested with any other object. + /// Object should not recieve pointer and this pointer should be discarded and not tested with any other object. /// Discard = 3 } @@ -44,10 +44,10 @@ public enum ObjectHitResult #region Public methods /// - /// Determines whether a touch point hit the object. + /// Determines whether a pointer hit the object. /// /// Data from a raycast. - /// if touch point hits the object, if it doesn't, if it doesn't and this touch must be ignored, Error otherwise. + /// if pointer hits the object, if it doesn't, if it doesn't and this pointer must be ignored, Error otherwise. public virtual ObjectHitResult IsHit(TouchHit hit) { return ObjectHitResult.Hit; diff --git a/Source/Assets/TouchScript/Scripts/Hit/TouchHit.cs b/Source/Assets/TouchScript/Scripts/Hit/TouchHit.cs index 7b8e85584..84546bdb0 100644 --- a/Source/Assets/TouchScript/Scripts/Hit/TouchHit.cs +++ b/Source/Assets/TouchScript/Scripts/Hit/TouchHit.cs @@ -8,7 +8,7 @@ namespace TouchScript.Hit { /// - /// An object representing a point hit by a touch in 3D, 2D or UI space. + /// An object representing a point hit by a pointer in 3D, 2D or UI space. /// public struct TouchHit { @@ -17,7 +17,7 @@ public struct TouchHit /// /// Type of hit /// - public enum TouchHitType + public enum PointerHitType { /// /// 3D hit. @@ -43,15 +43,15 @@ public enum TouchHitType /// Gets the type of the hit. /// /// The type. - public TouchHitType Type + public PointerHitType Type { get { return type; } } /// - /// Gets target transform the touch hit. + /// Gets target transform the hit. /// - /// Transform the touch hit. + /// Hit transform. public Transform Transform { get { return transform; } @@ -94,11 +94,11 @@ public Vector3 Point { switch (type) { - case TouchHitType.Hit3D: + case PointerHitType.Hit3D: return RaycastHit.point; - case TouchHitType.Hit2D: + case PointerHitType.Hit2D: return RaycastHit2D.point; - case TouchHitType.HitUI: + case PointerHitType.HitUI: return RaycastResult.worldPosition; } return Vector3.zero; @@ -115,11 +115,11 @@ public Vector3 Normal { switch (type) { - case TouchHitType.Hit3D: + case PointerHitType.Hit3D: return RaycastHit.normal; - case TouchHitType.Hit2D: + case PointerHitType.Hit2D: return RaycastHit2D.normal; - case TouchHitType.HitUI: + case PointerHitType.HitUI: return RaycastResult.worldNormal; } return Vector3.forward; @@ -130,7 +130,7 @@ public Vector3 Normal #region Private variables - private TouchHitType type; + private PointerHitType type; private Transform transform; private RaycastHit raycastHit; private RaycastHit2D raycastHit2D; @@ -150,7 +150,7 @@ public TouchHit(Transform transform) raycastHit = default(RaycastHit); raycastHit2D = default(RaycastHit2D); raycastResult = default(RaycastResult); - type = TouchHitType.Hit3D; + type = PointerHitType.Hit3D; } /// @@ -160,7 +160,7 @@ public TouchHit(Transform transform) public TouchHit(RaycastHit value) : this(value.collider.transform) { raycastHit = value; - type = TouchHitType.Hit3D; + type = PointerHitType.Hit3D; } /// @@ -171,7 +171,7 @@ public TouchHit(RaycastHit2D value) : this(value.collider.transform) { raycastHit2D = value; - type = TouchHitType.Hit2D; + type = PointerHitType.Hit2D; } /// @@ -182,7 +182,7 @@ public TouchHit(RaycastResult value) : this(value.gameObject.transform) { raycastResult = value; - type = TouchHitType.HitUI; + type = PointerHitType.HitUI; } #endregion diff --git a/Source/Assets/TouchScript/Scripts/Hit/Untouchable.cs b/Source/Assets/TouchScript/Scripts/Hit/Untouchable.cs index 1c0af04bf..6ebb990ed 100644 --- a/Source/Assets/TouchScript/Scripts/Hit/Untouchable.cs +++ b/Source/Assets/TouchScript/Scripts/Hit/Untouchable.cs @@ -7,7 +7,7 @@ namespace TouchScript.Hit { /// - /// Makes an object it is attached to untouchable, i.e. it completely ignores all touch points landing on it. + /// Makes an object it is attached to untouchable, i.e. it completely ignores all pointers landing on it. /// [AddComponentMenu("TouchScript/Behaviors/Untouchable")] [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Hit_Untouchable.htm")] @@ -16,10 +16,10 @@ public class Untouchable : HitTest #region Public properties /// - /// Indicates if instead of not reacting to touches the object should completely discard them making it impossible for other gestures to receive them. + /// Indicates if instead of not reacting to pointers the object should completely discard them making it impossible for other gestures to receive them. /// - /// If true touch points are not only prevented but discarded making it impossible for other gestures to receive them. - public bool DiscardTouch = false; + /// If true pointers are not only prevented but discarded making it impossible for other gestures to receive them. + public bool DiscardPointer = false; #endregion @@ -28,7 +28,7 @@ public class Untouchable : HitTest /// public override ObjectHitResult IsHit(TouchHit hit) { - return DiscardTouch ? ObjectHitResult.Discard : ObjectHitResult.Miss; + return DiscardPointer ? ObjectHitResult.Discard : ObjectHitResult.Miss; } #endregion diff --git a/Source/Assets/TouchScript/Scripts/ITouchManager.cs b/Source/Assets/TouchScript/Scripts/ITouchManager.cs index 28334a124..2312262b0 100644 --- a/Source/Assets/TouchScript/Scripts/ITouchManager.cs +++ b/Source/Assets/TouchScript/Scripts/ITouchManager.cs @@ -13,29 +13,29 @@ namespace TouchScript { /// - /// Core manager of all touch input in TouchScript. It is responsible for assigning unique touch ids and keeping the list of active touches. Controls touch frames and dispatches touch events. + /// Core manager of all pointer input in TouchScript. It is responsible for assigning unique pointer ids and keeping the list of active pointers. Controls pointer frames and dispatches pointer events. /// /// - /// Every frame touch events are dispatched in this order: + /// Every frame pointer events are dispatched in this order: /// /// FrameStarted - /// TouchesBegan - /// TouchesMoved - /// TouchesEnded - /// TouchesCancelled + /// PointersBegan + /// PointersMoved + /// PointersEnded + /// PointersCancelled /// FrameFinished /// - /// FrameStarted and FrameFinished events mark the start and the end of current touch frame and allow to implement specific logic at these moments. + /// FrameStarted and FrameFinished events mark the start and the end of current pointer frame and allow to implement specific logic at these moments. /// Current instance of an active object implementing can be obtained via . /// - /// + /// /// - /// This sample shows how to get Touch Manager instance and subscribe to events. + /// This sample shows how to get TouchManager instance and subscribe to events. /// - /// TouchManager.Instance.TouchesBegan += - /// (sender, args) => { foreach (var touch in args.Touches) Debug.Log("Began: " + touch.Id); }; - /// TouchManager.Instance.TouchesEnded += - /// (sender, args) => { foreach (var touch in args.Touches) Debug.Log("Ended: " + touch.Id); }; + /// TouchManager.Instance.PointersBegan += + /// (sender, args) => { foreach (var pointer in args.Pointers) Debug.Log("Began: " + pointer.Id); }; + /// TouchManager.Instance.PointersEnded += + /// (sender, args) => { foreach (var pointer in args.Pointers) Debug.Log("Ended: " + pointer.Id); }; /// /// public interface ITouchManager @@ -51,24 +51,24 @@ public interface ITouchManager event EventHandler FrameFinished; /// - /// Occurs when new touch points are added. + /// Occurs when new pointers are added. /// - event EventHandler TouchesBegan; + event EventHandler PointersBegan; /// - /// Occurs when touch points are updated. + /// Occurs when pointers are updated. /// - event EventHandler TouchesMoved; + event EventHandler PointersMoved; /// - /// Occurs when touch points are removed. + /// Occurs when pointers are removed. /// - event EventHandler TouchesEnded; + event EventHandler PointersEnded; /// - /// Occurs when touch points are cancelled. + /// Occurs when pointers are cancelled. /// - event EventHandler TouchesCancelled; + event EventHandler PointersCancelled; /// /// Gets or sets current display device. @@ -86,7 +86,7 @@ public interface ITouchManager /// 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 touch input from some device. + /// 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. bool ShouldCreateCameraLayer { get; set; } /// @@ -99,7 +99,7 @@ public interface ITouchManager /// /// Gets the list of . /// - /// A sorted list of currently active touch layers. + /// A sorted list of currently active layers. IList Layers { get; } /// @@ -114,18 +114,18 @@ public interface ITouchManager float DotsPerCentimeter { get; } /// - /// Gets number of active touches. + /// Gets number of active pointers. /// - int NumberOfTouches { get; } + int NumberOfPointers { get; } /// - /// Gets the list of active touches. + /// Gets the list of active pointers. /// - /// An unsorted list of all touches which began but have not ended yet. - IList ActiveTouches { get; } + /// An unsorted list of all pointers which began but have not ended yet. + IList ActivePointers { get; } /// - /// Adds a touch layer in a specific position. + /// 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. @@ -136,7 +136,7 @@ public interface ITouchManager bool AddLayer(TouchLayer layer, int index = -1, bool addIfExists = true); /// - /// Removes a touch layer. + /// Removes a layer. /// /// The layer to remove. /// True if the layer was removed. @@ -164,74 +164,74 @@ public interface ITouchManager bool RemoveInput(IInputSource input); /// - /// Checks if a touch hits anything. + /// Checks if a pointer hits anything. /// - /// Screen position of the touch. + /// Screen position of the pointer. /// Transform which has been hit or null otherwise. Transform GetHitTarget(Vector2 position); /// - /// Checks if a touch hits anything. + /// Checks if a pointer hits anything. /// /// - /// Screen position of the touch. + /// Screen position of the pointer. /// An object which represents hit information. - /// True if the touch hits any Transform. + /// True if the pointer hits any Transform. bool GetHitTarget(Vector2 position, out TouchHit hit); /// - /// Checks if a touch hits anything. + /// Checks if a pointer hits anything. /// /// /// - /// Screen position of the touch. + /// Screen position of the pointer. /// An object which represents hit information. /// A layer which was hit. - /// True if the touch hits any Transform. + /// True if the pointer hits any Transform. bool GetHitTarget(Vector2 position, out TouchHit hit, out TouchLayer layer); /// - /// Cancels a touch and returns it to the system of need. + /// Cancels a pointer and returns it to the system of need. /// - /// Touch id to cancel. - /// Should the touch be returned to the system. - void CancelTouch(int id, bool @return); + /// Pointer id to cancel. + /// Should the pointer be returned to the system. + void CancelPointer(int id, bool @return); /// - /// Cancels a touch. + /// Cancels a pointer. /// - /// Touch id to cancel. - void CancelTouch(int id); + /// Pointer id to cancel. + void CancelPointer(int id); } /// - /// Arguments dispatched with Touch Manager events. + /// Arguments dispatched with TouchManager events. /// - public class TouchEventArgs : EventArgs + public class PointerEventArgs : EventArgs { /// - /// Gets list of touches participating in the event. + /// Gets list of pointers participating in the event. /// - /// List of touches added, changed or removed this frame. - public IList Touches { get; private set; } + /// List of pointers added, changed or removed this frame. + public IList Pointers { get; private set; } - private static TouchEventArgs instance; + private static PointerEventArgs instance; /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// - private TouchEventArgs() {} + private PointerEventArgs() {} /// /// Returns cached instance of EventArgs. /// This cached EventArgs is reused throughout the library not to alocate new ones on every call. /// - /// A list of touches for event. + /// A list of pointers for event. /// Cached EventArgs object. - public static TouchEventArgs GetCachedEventArgs(IList touches) + public static PointerEventArgs GetCachedEventArgs(IList pointers) { - if (instance == null) instance = new TouchEventArgs(); - instance.Touches = touches; + if (instance == null) instance = new PointerEventArgs(); + instance.Pointers = pointers; return instance; } } diff --git a/Source/Assets/TouchScript/Scripts/InputSources/ICoordinatesRemapper.cs b/Source/Assets/TouchScript/Scripts/InputSources/ICoordinatesRemapper.cs index 4412191d7..2317d4bba 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/ICoordinatesRemapper.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/ICoordinatesRemapper.cs @@ -7,15 +7,15 @@ namespace TouchScript.InputSources { /// - /// An object which changes touch coordinates coming from an input source. + /// An object which changes pointer coordinates coming from an input source. /// /// - /// If your input device is not fully aligned with display device you can use a remapper to carefully retarget touch positions to "calibrate" input with image. + /// If your input device is not fully aligned with display device you can use a remapper to carefully retarget pointer positions to "calibrate" input with image. /// public interface ICoordinatesRemapper { /// - /// Remaps touch input. + /// Remaps pointer input. /// /// Original coordinates. /// Changed coordinates. diff --git a/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs b/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs index 9a4514a79..235f133d6 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs @@ -8,15 +8,15 @@ namespace TouchScript.InputSources /// An object which represents an input source. /// /// - /// In TouchScript all touch points () come from input sources. - /// If you want to feed the library with touches the best way to do it is to create a custom input source. + /// In TouchScript all pointer points () come from input sources. + /// If you want to feed pointers to the library the best way to do it is to create a custom input source. /// public interface IInputSource { /// /// Gets or sets current coordinates remapper. /// - /// An object used to change coordinates of touch points coming from this input source. + /// An object used to change coordinates of pointer points coming from this input source. ICoordinatesRemapper CoordinatesRemapper { get; set; } /// @@ -25,10 +25,10 @@ public interface IInputSource void UpdateInput(); /// - /// Cancels the touch. + /// Cancels the pointer. /// - /// The touch. - /// if set to true returns the touch back to the system with different id. - void CancelTouch(TouchPoint touch, bool @return); + /// The pointer. + /// if set to true returns the pointer back to the system with different id. + void CancelPointer(Pointer pointer, bool @return); } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs index 7801f3538..854fb91f0 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs @@ -14,10 +14,10 @@ public class MouseHandler : IDisposable { #region Private variables - private Func beginTouch; - private Action moveTouch; - private Action endTouch; - private Action cancelTouch; + private Func beginPointer; + private Action movePointer; + private Action endPointer; + private Action cancelPointer; private Tags tags; private int mousePointId = -1; @@ -29,18 +29,18 @@ public class MouseHandler : IDisposable /// /// Initializes a new instance of the class. /// - /// Tags to add to touches. - /// A function called when a new touch is detected. As this function must accept a Vector2 position of the new touch and return an instance of . - /// A function called when a touch is moved. As this function must accept an int id and a Vector2 position. - /// A function called when a touch is lifted off. As this function must accept an int id. - /// A function called when a touch is cancelled. As this function must accept an int id. - public MouseHandler(Tags tags, Func beginTouch, Action moveTouch, Action endTouch, Action cancelTouch) + /// Tags to add to pointers. + /// A function called when a new pointer is detected. As this function must accept a Vector2 position of the new pointer and return an instance of . + /// A function called when a pointer is moved. As this function must accept an int id and a Vector2 position. + /// A function called when a pointer is lifted off. As this function must accept an int id. + /// A function called when a pointer is cancelled. As this function must accept an int id. + public MouseHandler(Tags tags, Func beginPointer, Action movePointer, Action endPointer, Action cancelPointer) { this.tags = tags; - this.beginTouch = beginTouch; - this.moveTouch = moveTouch; - this.endTouch = endTouch; - this.cancelTouch = cancelTouch; + this.beginPointer = beginPointer; + this.movePointer = movePointer; + this.endPointer = endPointer; + this.cancelPointer = cancelPointer; mousePointId = -1; fakeMousePointId = -1; @@ -49,18 +49,18 @@ public MouseHandler(Tags tags, Func beginTouch, #region Public methods /// - /// Immediately ends all touches. + /// Immediately ends all pointers. /// - public void EndTouches() + public void EndPointers() { if (mousePointId != -1) { - endTouch(mousePointId); + endPointer(mousePointId); mousePointId = -1; } if (fakeMousePointId != -1) { - endTouch(fakeMousePointId); + endPointer(fakeMousePointId); fakeMousePointId = -1; } } @@ -78,7 +78,7 @@ public void Update() // Release happened first? if (mousePointId != -1) { - endTouch(mousePointId); + endPointer(mousePointId); mousePointId = -1; upHandled = true; } @@ -87,7 +87,7 @@ public void Update() // Need to end fake pointer if (fakeMousePointId > -1 && !(Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt))) { - endTouch(fakeMousePointId); + endPointer(fakeMousePointId); fakeMousePointId = -1; } @@ -95,8 +95,8 @@ public void Update() { var pos = Input.mousePosition; if ((Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt)) && fakeMousePointId == -1) - fakeMousePointId = beginTouch(new Vector2(pos.x, pos.y), tags, true).Id; - else if (mousePointId == -1) mousePointId = beginTouch(new Vector2(pos.x, pos.y), tags, true).Id; + fakeMousePointId = beginPointer(new Vector2(pos.x, pos.y), tags, true).Id; + else if (mousePointId == -1) mousePointId = beginPointer(new Vector2(pos.x, pos.y), tags, true).Id; } else if (Input.GetMouseButton(0)) { @@ -106,35 +106,35 @@ public void Update() mousePointPos = pos; if (fakeMousePointId != -1) { - if (mousePointId == -1) moveTouch(fakeMousePointId, new Vector2(pos.x, pos.y)); - else moveTouch(mousePointId, new Vector2(pos.x, pos.y)); + if (mousePointId == -1) movePointer(fakeMousePointId, new Vector2(pos.x, pos.y)); + else movePointer(mousePointId, new Vector2(pos.x, pos.y)); } - else if (mousePointId != -1) moveTouch(mousePointId, new Vector2(pos.x, pos.y)); + else if (mousePointId != -1) movePointer(mousePointId, new Vector2(pos.x, pos.y)); } } // Release mouse if we haven't done it yet if (Input.GetMouseButtonUp(0) && !upHandled && mousePointId != -1) { - endTouch(mousePointId); + endPointer(mousePointId); mousePointId = -1; } } /// - public bool CancelTouch(TouchPoint touch, bool @return) + public bool CancelPointer(Pointer pointer, bool @return) { - if (touch.Id == mousePointId) + if (pointer.Id == mousePointId) { - cancelTouch(mousePointId); - if (@return) mousePointId = beginTouch(touch.Position, tags, false).Id; + cancelPointer(mousePointId); + if (@return) mousePointId = beginPointer(pointer.Position, tags, false).Id; else mousePointId = -1; return true; } - if (touch.Id == fakeMousePointId) + if (pointer.Id == fakeMousePointId) { - cancelTouch(fakeMousePointId); - if (@return) fakeMousePointId = beginTouch(touch.Position, tags, false).Id; + cancelPointer(fakeMousePointId); + if (@return) fakeMousePointId = beginPointer(pointer.Position, tags, false).Id; else fakeMousePointId = -1; return true; } @@ -144,8 +144,8 @@ public bool CancelTouch(TouchPoint touch, bool @return) /// public void Dispose() { - if (mousePointId != -1) cancelTouch(mousePointId); - if (fakeMousePointId != -1) cancelTouch(fakeMousePointId); + if (mousePointId != -1) cancelPointer(mousePointId); + if (fakeMousePointId != -1) cancelPointer(fakeMousePointId); } #endregion diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs index d5568deea..ab27a45d5 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs @@ -17,44 +17,44 @@ public class TouchHandler : IDisposable #region Public properties /// - /// Gets a value indicating whether there any active touches. + /// Gets a value indicating whether there any active pointers. /// - /// true if this instance has active touches; otherwise, false. - public bool HasTouches + /// true if this instance has active pointers; otherwise, false. + public bool HasPointers { - get { return touchesNum > 0; } + get { return pointersNum > 0; } } #endregion #region Private variables - private Func beginTouch; - private Action moveTouch; - private Action endTouch; - private Action cancelTouch; + private Func beginPointer; + private Action movePointer; + private Action endPointer; + private Action cancelPointer; private Tags tags; private Dictionary systemToInternalId = new Dictionary(); - private int touchesNum; + private int pointersNum; #endregion /// /// Initializes a new instance of the class. /// - /// Tags to add to touches. - /// A function called when a new touch is detected. As this function must accept a Vector2 position of the new touch and return an instance of . - /// A function called when a touch is moved. As this function must accept an int id and a Vector2 position. - /// A function called when a touch is lifted off. As this function must accept an int id. - /// A function called when a touch is cancelled. As this function must accept an int id. - public TouchHandler(Tags tags, Func beginTouch, Action moveTouch, Action endTouch, Action cancelTouch) + /// Tags to add to pointers. + /// A function called when a new pointer is detected. As this function must accept a Vector2 position of the new pointer and return an instance of . + /// A function called when a pointer is moved. As this function must accept an int id and a Vector2 position. + /// A function called when a pointer is lifted off. As this function must accept an int id. + /// A function called when a pointer is cancelled. As this function must accept an int id. + public TouchHandler(Tags tags, Func beginPointer, Action movePointer, Action endPointer, Action cancelPointer) { this.tags = tags; - this.beginTouch = beginTouch; - this.moveTouch = moveTouch; - this.endTouch = endTouch; - this.cancelTouch = cancelTouch; + this.beginPointer = beginPointer; + this.movePointer = movePointer; + this.endPointer = endPointer; + this.cancelPointer = cancelPointer; } #region Public methods @@ -75,47 +75,47 @@ public void Update() if (systemToInternalId.TryGetValue(t.fingerId, out touchState) && touchState.Phase != TouchPhase.Canceled) { // Ending previous touch (missed a frame) - internalEndTouch(touchState.Id); - systemToInternalId[t.fingerId] = new TouchState(internalBeginTouch(t.position).Id); + internalEndPointer(touchState.Id); + systemToInternalId[t.fingerId] = new TouchState(internalBeginPointer(t.position).Id); } else { - systemToInternalId.Add(t.fingerId, new TouchState(internalBeginTouch(t.position).Id)); + systemToInternalId.Add(t.fingerId, new TouchState(internalBeginPointer(t.position).Id)); } break; case TouchPhase.Moved: if (systemToInternalId.TryGetValue(t.fingerId, out touchState)) { - if (touchState.Phase != TouchPhase.Canceled) moveTouch(touchState.Id, t.position); + if (touchState.Phase != TouchPhase.Canceled) movePointer(touchState.Id, t.position); } else { // Missed began phase - systemToInternalId.Add(t.fingerId, new TouchState(internalBeginTouch(t.position).Id)); + systemToInternalId.Add(t.fingerId, new TouchState(internalBeginPointer(t.position).Id)); } break; case TouchPhase.Ended: if (systemToInternalId.TryGetValue(t.fingerId, out touchState)) { systemToInternalId.Remove(t.fingerId); - if (touchState.Phase != TouchPhase.Canceled) internalEndTouch(touchState.Id); + if (touchState.Phase != TouchPhase.Canceled) internalEndPointer(touchState.Id); } else { // Missed one finger begin-end transition - internalEndTouch(internalBeginTouch(t.position).Id); + internalEndPointer(internalBeginPointer(t.position).Id); } break; case TouchPhase.Canceled: if (systemToInternalId.TryGetValue(t.fingerId, out touchState)) { systemToInternalId.Remove(t.fingerId); - if (touchState.Phase != TouchPhase.Canceled) internalCancelTouch(touchState.Id); + if (touchState.Phase != TouchPhase.Canceled) internalCancelPointer(touchState.Id); } else { // Missed one finger begin-end transition - internalCancelTouch(internalBeginTouch(t.position).Id); + internalCancelPointer(internalBeginPointer(t.position).Id); } break; case TouchPhase.Stationary: @@ -123,7 +123,7 @@ public void Update() else { // Missed begin phase - systemToInternalId.Add(t.fingerId, new TouchState(internalBeginTouch(t.position).Id)); + systemToInternalId.Add(t.fingerId, new TouchState(internalBeginPointer(t.position).Id)); } break; } @@ -131,12 +131,12 @@ public void Update() } /// - public bool CancelTouch(TouchPoint touch, bool @return) + public bool CancelPointer(Pointer pointer, bool @return) { int fingerId = -1; foreach (var touchState in systemToInternalId) { - if (touchState.Value.Id == touch.Id && touchState.Value.Phase != TouchPhase.Canceled) + if (touchState.Value.Id == pointer.Id && touchState.Value.Phase != TouchPhase.Canceled) { fingerId = touchState.Key; break; @@ -146,13 +146,13 @@ public bool CancelTouch(TouchPoint touch, bool @return) { if (@return) { - cancelTouch(touch.Id); - systemToInternalId[fingerId] = new TouchState(beginTouch(touch.Position, touch.Tags, false).Id); + cancelPointer(pointer.Id); + systemToInternalId[fingerId] = new TouchState(beginPointer(pointer.Position, pointer.Tags, false).Id); } else { - systemToInternalId[fingerId] = new TouchState(touch.Id, TouchPhase.Canceled); - internalCancelTouch(touch.Id); + systemToInternalId[fingerId] = new TouchState(pointer.Id, TouchPhase.Canceled); + internalCancelPointer(pointer.Id); } return true; } @@ -164,7 +164,7 @@ public void Dispose() { foreach (var touchState in systemToInternalId) { - if (touchState.Value.Phase != TouchPhase.Canceled) internalCancelTouch(touchState.Value.Id); + if (touchState.Value.Phase != TouchPhase.Canceled) internalCancelPointer(touchState.Value.Id); } systemToInternalId.Clear(); } @@ -173,22 +173,22 @@ public void Dispose() #region Private functions - private TouchPoint internalBeginTouch(Vector2 position) + private Pointer internalBeginPointer(Vector2 position) { - touchesNum++; - return beginTouch(position, tags, true); + pointersNum++; + return beginPointer(position, tags, true); } - private void internalEndTouch(int id) + private void internalEndPointer(int id) { - touchesNum--; - endTouch(id); + pointersNum--; + endPointer(id); } - private void internalCancelTouch(int id) + private void internalCancelPointer(int id) { - touchesNum--; - cancelTouch(id); + pointersNum--; + cancelPointer(id); } #endregion diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsTouchHandlers.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs similarity index 85% rename from Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsTouchHandlers.cs rename to Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs index 0988e610a..0de448385 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsTouchHandlers.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs @@ -14,15 +14,15 @@ namespace TouchScript.InputSources.InputHandlers { /// - /// Windows 8 touch handling implementation which can be embedded to other (input) classes. + /// Windows 8 pointer handling implementation which can be embedded to other (input) classes. /// - public class Windows8TouchHandler : WindowsTouchHandler + public class Windows8PointerHandler : WindowsPointerHandler { private Tags mouseTags, touchTags, penTags; /// - public Windows8TouchHandler(Tags touchTags, Tags mouseTags, Tags penTags, Func beginTouch, Action moveTouch, Action endTouch, Action cancelTouch) : base(touchTags, beginTouch, moveTouch, endTouch, cancelTouch) + public Windows8PointerHandler(Tags touchTags, Tags mouseTags, Tags penTags, Func beginPointer, Action movePointer, Action endPointer, Action cancelPointer) : base(touchTags, beginPointer, movePointer, endPointer, cancelPointer) { this.mouseTags = mouseTags; this.touchTags = touchTags; @@ -86,15 +86,15 @@ private void decodeWin8Touches(uint msg, IntPtr wParam, IntPtr lParam) tags = penTags; break; } - winToInternalId.Add(pointerId, beginTouch(new Vector2((p.X - offsetX) * scaleX, Screen.height - (p.Y - offsetY) * scaleY), tags, true).Id); + winToInternalId.Add(pointerId, beginPointer(new Vector2((p.X - offsetX) * scaleX, Screen.height - (p.Y - offsetY) * scaleY), tags, true).Id); break; case WM_POINTERUP: if (winToInternalId.TryGetValue(pointerId, out existingId)) { winToInternalId.Remove(pointerId); if ((pointerInfo.pointerFlags & POINTER_FLAG_CANCELLED) == POINTER_FLAG_CANCELLED) - cancelTouch(existingId); - else endTouch(existingId); + cancelPointer(existingId); + else endPointer(existingId); } break; case WM_POINTERUPDATE: @@ -103,11 +103,11 @@ private void decodeWin8Touches(uint msg, IntPtr wParam, IntPtr lParam) if ((pointerInfo.pointerFlags & POINTER_FLAG_CANCELLED) == POINTER_FLAG_CANCELLED) { winToInternalId.Remove(pointerId); - cancelTouch(existingId); + cancelPointer(existingId); } else { - moveTouch(existingId, + movePointer(existingId, new Vector2((p.X - offsetX)*scaleX, Screen.height - (p.Y - offsetY)*scaleY)); } } @@ -116,12 +116,12 @@ private void decodeWin8Touches(uint msg, IntPtr wParam, IntPtr lParam) } } - public class Windows7TouchHandler : WindowsTouchHandler + public class Windows7PointerHandler : WindowsPointerHandler { private int touchInputSize; /// - public Windows7TouchHandler(Tags tags, Func beginTouch, Action moveTouch, Action endTouch, Action cancelTouch) : base(tags, beginTouch, moveTouch, endTouch, cancelTouch) + public Windows7PointerHandler(Tags tags, Func beginPointer, Action movePointer, Action endPointer, Action cancelPointer) : base(tags, beginPointer, movePointer, endPointer, cancelPointer) { touchInputSize = Marshal.SizeOf(typeof (TOUCHINPUT)); RegisterTouchWindow(hMainWindow, 0); @@ -175,7 +175,7 @@ private void decodeWin7Touches(IntPtr wParam, IntPtr lParam) p.Y = touch.y/100; ScreenToClient(hMainWindow, ref p); - winToInternalId.Add(touch.dwID, beginTouch(new Vector2((p.X - offsetX)*scaleX, Screen.height - (p.Y - offsetY)*scaleY), tags, true).Id); + winToInternalId.Add(touch.dwID, beginPointer(new Vector2((p.X - offsetX)*scaleX, Screen.height - (p.Y - offsetY)*scaleY), tags, true).Id); } else if ((touch.dwFlags & (int) TOUCH_EVENT.TOUCHEVENTF_UP) != 0) { @@ -183,7 +183,7 @@ private void decodeWin7Touches(IntPtr wParam, IntPtr lParam) if (winToInternalId.TryGetValue(touch.dwID, out existingId)) { winToInternalId.Remove(touch.dwID); - endTouch(existingId); + endPointer(existingId); } } else if ((touch.dwFlags & (int) TOUCH_EVENT.TOUCHEVENTF_MOVE) != 0) @@ -196,7 +196,7 @@ private void decodeWin7Touches(IntPtr wParam, IntPtr lParam) p.Y = touch.y/100; ScreenToClient(hMainWindow, ref p); - moveTouch(existingId, + movePointer(existingId, new Vector2((p.X - offsetX)*scaleX, Screen.height - (p.Y - offsetY)*scaleY)); } } @@ -206,14 +206,14 @@ private void decodeWin7Touches(IntPtr wParam, IntPtr lParam) } } - public abstract class WindowsTouchHandler : IDisposable + public abstract class WindowsPointerHandler : IDisposable { /// - /// Source of touch input. + /// Source of pointer input. /// - public enum TouchSource + public enum PointerSource { - Touch, + Pointer, Pen, Mouse } @@ -225,10 +225,10 @@ public enum TouchSource public delegate IntPtr WndProcDelegate(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam); - protected Func beginTouch; - protected Action moveTouch; - protected Action endTouch; - protected Action cancelTouch; + protected Func beginPointer; + protected Action movePointer; + protected Action endPointer; + protected Action cancelPointer; protected Tags tags; protected IntPtr hMainWindow; @@ -241,19 +241,19 @@ public enum TouchSource protected float offsetX, offsetY, scaleX, scaleY; /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// - /// A function called when a new touch is detected. As this function must accept a Vector2 position of the new touch and return an instance of . - /// A function called when a touch is moved. As this function must accept an int id and a Vector2 position. - /// A function called when a touch is lifted off. As this function must accept an int id. - /// A function called when a touch is cancelled. As this function must accept an int id. - public WindowsTouchHandler(Tags tags, Func beginTouch, Action moveTouch, Action endTouch, Action cancelTouch) + /// A function called when a new pointer is detected. As this function must accept a Vector2 position of the new pointer and return an instance of . + /// A function called when a pointer is moved. As this function must accept an int id and a Vector2 position. + /// A function called when a pointer is lifted off. As this function must accept an int id. + /// A function called when a pointer is cancelled. As this function must accept an int id. + public WindowsPointerHandler(Tags tags, Func beginPointer, Action movePointer, Action endPointer, Action cancelPointer) { this.tags = tags; - this.beginTouch = beginTouch; - this.moveTouch = moveTouch; - this.endTouch = endTouch; - this.cancelTouch = cancelTouch; + this.beginPointer = beginPointer; + this.movePointer = movePointer; + this.endPointer = endPointer; + this.cancelPointer = cancelPointer; hMainWindow = GetActiveWindow(); disablePressAndHold(); @@ -261,12 +261,12 @@ public WindowsTouchHandler(Tags tags, Func begi } /// - public bool CancelTouch(TouchPoint touch, bool @return) + public bool CancelPointer(Pointer pointer, bool @return) { int internalId = -1; foreach (var t in winToInternalId) { - if (t.Value == touch.Id) + if (t.Value == pointer.Id) { internalId = t.Key; break; @@ -274,8 +274,8 @@ public bool CancelTouch(TouchPoint touch, bool @return) } if (internalId > -1) { - cancelTouch(touch.Id); - if (@return) winToInternalId[internalId] = beginTouch(touch.Position, touch.Tags, false).Id; + cancelPointer(pointer.Id); + if (@return) winToInternalId[internalId] = beginPointer(pointer.Position, pointer.Tags, false).Id; return true; } return false; @@ -284,7 +284,7 @@ public bool CancelTouch(TouchPoint touch, bool @return) /// public virtual void Dispose() { - foreach (var i in winToInternalId) cancelTouch(i.Value); + foreach (var i in winToInternalId) cancelPointer(i.Value); enablePressAndHold(); unregisterWindowProc(); diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsTouchHandlers.cs.meta b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsTouchHandlers.cs.meta rename to Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs index a28f79455..149168225 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs @@ -8,7 +8,7 @@ namespace TouchScript.InputSources { /// - /// Base class for all touch input sources. + /// Base class for all pointer input sources. /// public abstract class InputSource : MonoBehaviour, IInputSource { @@ -38,7 +38,7 @@ public abstract class InputSource : MonoBehaviour, IInputSource public virtual void UpdateInput() {} /// - public virtual void CancelTouch(TouchPoint touch, bool @return) {} + public virtual void CancelPointer(Pointer pointer, bool @return) {} #endregion @@ -71,57 +71,57 @@ protected virtual void OnDisable() #region Protected methods /// - /// Begin touch in given screen position. + /// Begin pointer in given screen position. /// /// Screen position. /// Initial tags. /// if set to true a can be used on provided coordinates. - /// New touch. - protected virtual TouchPoint beginTouch(Vector2 position, Tags tags, bool canRemap = true) + /// New pointer. + protected virtual Pointer beginPointer(Vector2 position, Tags tags, bool canRemap = true) { if (CoordinatesRemapper != null && canRemap) position = CoordinatesRemapper.Remap(position); - return manager.INTERNAL_BeginTouch(position, this, tags); + return manager.INTERNAL_BeginPointer(position, this, tags); } /// - /// Mark touch as updated. + /// Mark pointer as updated. /// - /// Touch id. - protected virtual void updateTouch(int id) + /// Pointer id. + protected virtual void updatePointer(int id) { - manager.INTERNAL_UpdateTouch(id); + manager.INTERNAL_UpdatePointer(id); } /// - /// Mark touch as moved. + /// Mark pointer as moved. /// - /// Touch id. + /// Pointer id. /// Screen position. - protected virtual void moveTouch(int id, Vector2 position) + protected virtual void movePointer(int id, Vector2 position) { if (CoordinatesRemapper != null) { position = CoordinatesRemapper.Remap(position); } - manager.INTERNAL_MoveTouch(id, position); + manager.INTERNAL_MovePointer(id, position); } /// - /// End touch with id. + /// End pointer with id. /// - /// Touch point id. - protected virtual void endTouch(int id) + /// Pointer id. + protected virtual void endPointer(int id) { - manager.INTERNAL_EndTouch(id); + manager.INTERNAL_EndPointer(id); } /// - /// Cancel touch with id. + /// Cancel pointer with id. /// - /// Touch id. - protected virtual void cancelTouch(int id) + /// Pointer id. + protected virtual void cancelPointer(int id) { - manager.INTERNAL_CancelTouch(id); + manager.INTERNAL_CancelPointer(id); } #endregion diff --git a/Source/Assets/TouchScript/Scripts/InputSources/MobileInput.cs b/Source/Assets/TouchScript/Scripts/InputSources/MobileInput.cs index be3d89c9f..4162cd2ac 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/MobileInput.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/MobileInput.cs @@ -18,13 +18,13 @@ public sealed class MobileInput : InputSource #region Public properties /// - /// Indicates if this input source should be disabled on platforms which don't support touch input with Input.Touches. + /// Indicates if this input source should be disabled on platforms which don't support pointer input with Input.Pointers. /// [ToggleLeft] public bool DisableOnNonTouchPlatforms = true; /// - /// Tags added to touches coming from this input. + /// Tags added to pointers coming from this input. /// public Tags Tags = new Tags(Tags.INPUT_TOUCH); @@ -47,11 +47,11 @@ public override void UpdateInput() } /// - public override void CancelTouch(TouchPoint touch, bool @return) + public override void CancelPointer(Pointer pointer, bool @return) { - base.CancelTouch(touch, @return); + base.CancelPointer(pointer, @return); - if (touchHandler != null) touchHandler.CancelTouch(touch, @return); + if (touchHandler != null) touchHandler.CancelPointer(pointer, @return); } #endregion @@ -76,13 +76,13 @@ protected override void OnEnable() case RuntimePlatform.BlackBerryPlayer: break; default: - // don't need mobile touch here + // don't need mobile pointer here enabled = false; return; } } - touchHandler = new TouchHandler(Tags, beginTouch, moveTouch, endTouch, cancelTouch); + touchHandler = new TouchHandler(Tags, beginPointer, movePointer, endPointer, cancelPointer); base.OnEnable(); } diff --git a/Source/Assets/TouchScript/Scripts/InputSources/MouseInput.cs b/Source/Assets/TouchScript/Scripts/InputSources/MouseInput.cs index f674f6426..8282a8c39 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/MouseInput.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/MouseInput.cs @@ -9,7 +9,7 @@ namespace TouchScript.InputSources { /// - /// Input source which transfers mouse clicks to touches. + /// Input source which transforms mouse to pointer. /// [System.Obsolete("MouseInput is deprecated! Please use StandardInput instead.")] public sealed class MouseInput : InputSource @@ -20,13 +20,13 @@ public sealed class MouseInput : InputSource /// Indicates if this input source should be disabled on mobile platforms. /// /// - /// Operation Systems which support touch input send first touches as mouse clicks which may result in duplicated touch points in exactly the same coordinates. This affects clusters and multitouch gestures. + /// Operation Systems which support touch input send first touches as mouse clicks which may result in duplicated pointer points in exactly the same coordinates. This affects clusters and multitouch gestures. /// [ToggleLeft] public bool DisableOnMobilePlatforms = true; /// - /// Tags added to touches coming from this input. + /// Tags added to pointers coming from this input. /// public Tags Tags = new Tags(Tags.INPUT_MOUSE); @@ -49,11 +49,11 @@ public override void UpdateInput() } /// - public override void CancelTouch(TouchPoint touch, bool @return) + public override void CancelPointer(Pointer pointer, bool @return) { - base.CancelTouch(touch, @return); + base.CancelPointer(pointer, @return); - if (mouseHandler != null) mouseHandler.CancelTouch(touch, @return); + if (mouseHandler != null) mouseHandler.CancelPointer(pointer, @return); } #endregion @@ -85,7 +85,7 @@ protected override void OnEnable() } } - mouseHandler = new MouseHandler(Tags, beginTouch, moveTouch, endTouch, cancelTouch); + mouseHandler = new MouseHandler(Tags, beginPointer, movePointer, endPointer, cancelPointer); } /// diff --git a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs index d1ca2fc19..f3fb87064 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs @@ -11,7 +11,7 @@ namespace TouchScript.InputSources { /// - /// Processes standard input events (mouse, touch, pen) on all platforms. + /// Processes standard input events (mouse, pointer, pen) on all platforms. /// Initializes proper inputs automatically. Replaces old Mobile and Mouse inputs. /// [AddComponentMenu("TouchScript/Input Sources/Standard Input")] @@ -21,9 +21,9 @@ public sealed class StandardInput : InputSource #region Constants /// - /// Touch API to use on Windows 8 and later OS versions. + /// Pointer API to use on Windows 8 and later OS versions. /// - public enum Windows8TouchAPIType + public enum Windows8APIType { /// /// Windows 8 WM_POINTER API. @@ -41,15 +41,15 @@ public enum Windows8TouchAPIType Unity, /// - /// Don't initialize touch input at all. + /// Don't initialize pointer input at all. /// None } /// - /// Touch API to use on Windows 7. + /// Pointer API to use on Windows 7. /// - public enum Windows7TouchAPIType + public enum Windows7APIType { /// /// Windows 7 WM_TOUCH API. @@ -62,7 +62,7 @@ public enum Windows7TouchAPIType Unity, /// - /// Don't initialize touch input at all. + /// Don't initialize pointer input at all. /// None } @@ -82,24 +82,24 @@ public enum Windows7TouchAPIType public Tags TouchTags = new Tags(Tags.INPUT_TOUCH); /// - /// Tags added to mouse touches coming from this input. + /// Tags added to mouse pointers coming from this input. /// public Tags MouseTags = new Tags(Tags.INPUT_MOUSE); /// - /// Tags added to pen touches coming from this input. + /// Tags added to pen pointers coming from this input. /// public Tags PenTags = new Tags(Tags.INPUT_PEN); /// - /// Touch API to use on Windows 8. + /// Pointer API to use on Windows 8. /// - public Windows8TouchAPIType Windows8Touch = Windows8TouchAPIType.Windows8; + public Windows8APIType Windows8API = Windows8APIType.Windows8; /// - /// Touch API to use on Windows 7. + /// Pointer API to use on Windows 7. /// - public Windows7TouchAPIType Windows7Touch = Windows7TouchAPIType.Windows7; + public Windows7APIType Windows7API = Windows7APIType.Windows7; /// /// Initialize touch input in WebPlayer or not. @@ -134,8 +134,8 @@ public enum Windows7TouchAPIType private TouchHandler touchHandler; #if UNITY_STANDALONE_WIN && !UNITY_EDITOR private Windows8MouseHandler windows8MouseHandler; - private Windows8TouchHandler windows8TouchHandler; - private Windows7TouchHandler windows7TouchHandler; + private Windows8PointerHandler windows8PointerHandler; + private Windows7PointerHandler windows7PointerHandler; #endif #endregion @@ -151,10 +151,10 @@ public override void UpdateInput() { touchHandler.Update(); // Unity adds mouse events from touches resulting in duplicated pointers. - // Don't update mouse if touch input is present. + // Don't update mouse if pointer input is present. if (mouseHandler != null) { - if (touchHandler.HasTouches) mouseHandler.EndTouches(); + if (touchHandler.HasPointers) mouseHandler.EndPointers(); else mouseHandler.Update(); } } @@ -162,16 +162,16 @@ public override void UpdateInput() } /// - public override void CancelTouch(TouchPoint touch, bool @return) + public override void CancelPointer(Pointer pointer, bool @return) { - base.CancelTouch(touch, @return); + base.CancelPointer(pointer, @return); var handled = false; - if (touchHandler != null) handled = touchHandler.CancelTouch(touch, @return); - if (mouseHandler != null && !handled) handled = mouseHandler.CancelTouch(touch, @return); + if (touchHandler != null) handled = touchHandler.CancelPointer(pointer, @return); + if (mouseHandler != null && !handled) handled = mouseHandler.CancelPointer(pointer, @return); #if UNITY_STANDALONE_WIN && !UNITY_EDITOR - if (windows7TouchHandler != null && !handled) handled = windows7TouchHandler.CancelTouch(touch, @return); - if (windows8TouchHandler != null && !handled) windows8TouchHandler.CancelTouch(touch, @return); + if (windows7PointerHandler != null && !handled) handled = windows7PointerHandler.CancelPointer(pointer, @return); + if (windows8PointerHandler != null && !handled) windows8PointerHandler.CancelPointer(pointer, @return); #endif } @@ -196,21 +196,21 @@ protected override void OnEnable() if (Environment.OSVersion.Version >= WIN8_VERSION) { // Windows 8+ - switch (Windows8Touch) + switch (Windows8API) { - case Windows8TouchAPIType.Windows8: + case Windows8APIType.Windows8: enableWindows8Touch(); if (Windows8Mouse) enableWindows8Mouse(); break; - case Windows8TouchAPIType.Windows7: + case Windows8APIType.Windows7: enableWindows7Touch(); if (Windows8Mouse) enableMouse(); break; - case Windows8TouchAPIType.Unity: + case Windows8APIType.Unity: enableTouch(); if (Windows8Mouse) enableMouse(); break; - case Windows8TouchAPIType.None: + case Windows8APIType.None: enableMouse(); break; } @@ -218,17 +218,17 @@ protected override void OnEnable() else if (Environment.OSVersion.Version >= WIN7_VERSION) { // Windows 7 - switch (Windows7Touch) + switch (Windows7API) { - case Windows7TouchAPIType.Windows7: + case Windows7APIType.Windows7: enableWindows7Touch(); if (Windows7Mouse) enableMouse(); break; - case Windows7TouchAPIType.Unity: + case Windows7APIType.Unity: enableTouch(); if (Windows7Mouse) enableMouse(); break; - case Windows7TouchAPIType.None: + case Windows7APIType.None: enableMouse(); break; } @@ -281,7 +281,7 @@ protected override void OnDisable() private void enableMouse() { - mouseHandler = new MouseHandler(MouseTags, beginTouch, moveTouch, endTouch, cancelTouch); + mouseHandler = new MouseHandler(MouseTags, beginPointer, movePointer, endPointer, cancelPointer); Debug.Log("[TouchScript] Initialized Unity mouse input."); } @@ -296,7 +296,7 @@ private void disableMouse() private void enableTouch() { - touchHandler = new TouchHandler(TouchTags, beginTouch, moveTouch, endTouch, cancelTouch); + touchHandler = new TouchHandler(TouchTags, beginPointer, movePointer, endPointer, cancelPointer); Debug.Log("[TouchScript] Initialized Unity touch input."); } @@ -327,31 +327,31 @@ private void disableWindows8Mouse() private void enableWindows7Touch() { - windows7TouchHandler = new Windows7TouchHandler(TouchTags, beginTouch, moveTouch, endTouch, cancelTouch); - Debug.Log("[TouchScript] Initialized Windows 7 touch input."); + windows7PointerHandler = new Windows7PointerHandler(TouchTags, beginPointer, movePointer, endPointer, cancelPointer); + Debug.Log("[TouchScript] Initialized Windows 7 pointer input."); } private void disableWindows7Touch() { - if (windows7TouchHandler != null) + if (windows7PointerHandler != null) { - windows7TouchHandler.Dispose(); - windows7TouchHandler = null; + windows7PointerHandler.Dispose(); + windows7PointerHandler = null; } } private void enableWindows8Touch() { - windows8TouchHandler = new Windows8TouchHandler(TouchTags, MouseTags, PenTags, beginTouch, moveTouch, endTouch, cancelTouch); - Debug.Log("[TouchScript] Initialized Windows 8 touch input."); + windows8PointerHandler = new Windows8PointerHandler(TouchTags, MouseTags, PenTags, beginPointer, movePointer, endPointer, cancelPointer); + Debug.Log("[TouchScript] Initialized Windows 8 pointer input."); } private void disableWindows8Touch() { - if (windows8TouchHandler != null) + if (windows8PointerHandler != null) { - windows8TouchHandler.Dispose(); - windows8TouchHandler = null; + windows8PointerHandler.Dispose(); + windows8PointerHandler = null; } } #endif diff --git a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs index 4756ef967..2bf7bc0c2 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs @@ -9,7 +9,7 @@ namespace TouchScript.Layers { /// - /// Touch layer which represents a 3d camera looking into the world. Determines which objects may be hit in the view of a camera attached to parent GameObject. + /// Pointer layer which represents a 3d camera looking into the world. Determines which objects may be hit in the view of a camera attached to parent GameObject. /// [AddComponentMenu("TouchScript/Layers/Camera Layer")] [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Layers_CameraLayer.htm")] diff --git a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs b/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs index 48360e7da..94e3de755 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs @@ -9,7 +9,7 @@ namespace TouchScript.Layers { /// - /// Touch layer which works with Unity 4.3+ 2d physics. Can pick 2d objects hit by touches in right order. + /// Pointer layer which works with Unity 4.3+ 2d physics. Can pick 2d objects hit by pointers in right order. /// [AddComponentMenu("TouchScript/Layers/Camera Layer 2D")] [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Layers_CameraLayer2D.htm")] diff --git a/Source/Assets/TouchScript/Scripts/Layers/FullscreenLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/FullscreenLayer.cs index 115882515..d1d4d11b3 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/FullscreenLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/FullscreenLayer.cs @@ -9,7 +9,7 @@ namespace TouchScript.Layers { /// - /// Layer which gets all input from a camera. Should be used instead of a background object getting all the touches which come through. + /// Layer which gets all input from a camera. Should be used instead of a background object getting all the pointers which come through. /// [AddComponentMenu("TouchScript/Layers/Fullscreen Layer")] [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Layers_FullscreenLayer.htm")] @@ -23,17 +23,17 @@ public class FullscreenLayer : TouchLayer public enum LayerType { /// - /// Get touches from main camera. + /// Get pointers from main camera. /// MainCamera, /// - /// Get touches from specific camera. + /// Get pointers from specific camera. /// Camera, /// - /// Get all touches on Z=0 plane without a camera. + /// Get all pointers on Z=0 plane without a camera. /// Global } diff --git a/Source/Assets/TouchScript/Scripts/Layers/ILayerDelegate.cs b/Source/Assets/TouchScript/Scripts/Layers/ILayerDelegate.cs index fed3fed53..a3588c340 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/ILayerDelegate.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/ILayerDelegate.cs @@ -12,12 +12,12 @@ public interface ILayerDelegate { /// - /// Returns whether a layer should receive the touch. + /// Returns whether a layer should receive the pointer. /// /// The layer. - /// The touch. + /// The pointer. /// true if it should; false otherwise. - bool ShouldReceiveTouch(TouchLayer layer, TouchPoint touch); + bool ShouldReceivePointer(TouchLayer layer, Pointer pointer); } } diff --git a/Source/Assets/TouchScript/Scripts/Layers/ProjectionParams.cs b/Source/Assets/TouchScript/Scripts/Layers/ProjectionParams.cs index 19e95a805..8e5ec0cfb 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/ProjectionParams.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/ProjectionParams.cs @@ -8,7 +8,7 @@ namespace TouchScript.Layers { /// - /// specific projection parameters. Used by layers to project touches in the world and world coordinates onto layers. + /// specific projection parameters. Used by layers to project pointers in the world and world coordinates onto layers. /// public class ProjectionParams { diff --git a/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs index 8f54a4e25..6671e7f7b 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs @@ -11,16 +11,16 @@ namespace TouchScript.Layers { /// - /// Base class for all touch layers. Used to check if some object is hit by a touch point. + /// Base class for all pointer layers. Used to check if some object is hit by a pointer. /// /// - /// + /// /// /// - /// In TouchScript it's a layer's job to determine if a touch 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 touch appears. It's a layer's job to return if this touch 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. + /// 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. /// Layers can be configured in a scene using or from code using API. - /// If you want to route touches and manually control which objects they should "touch" it's better to create a new layer extending . + /// If you want to route pointers and manually control which objects they should "pointer" it's better to create a new layer extending . /// [ExecuteInEditMode] public abstract class TouchLayer : MonoBehaviour @@ -28,7 +28,7 @@ public abstract class TouchLayer : MonoBehaviour #region Constants /// - /// Result of a touch's hit test with a layer. + /// Result of a pointer's hit test with a layer. /// public enum LayerHitResult { @@ -38,12 +38,12 @@ public enum LayerHitResult Error = 0, /// - /// Touch hit an object. + /// Pointer hit an object. /// Hit = 1, /// - /// Touch didn't hit any object. + /// Pointer didn't hit any object. /// Miss = 2 } @@ -53,23 +53,23 @@ public enum LayerHitResult #region Events /// - /// Occurs when layer determines that a touch has hit something. + /// Occurs when layer determines that a pointer has hit something. /// - public event EventHandler TouchBegan + public event EventHandler PointerBegan { - add { touchBeganInvoker += value; } - remove { touchBeganInvoker -= value; } + add { pointerBeganInvoker += value; } + remove { pointerBeganInvoker -= value; } } // Needed to overcome iOS AOT limitations - private EventHandler touchBeganInvoker; + private EventHandler pointerBeganInvoker; #endregion #region Public properties /// - /// Touch layer's name. + /// Pointer layer's name. /// public string Name; @@ -92,11 +92,11 @@ public virtual Vector3 WorldProjectionNormal #region Public methods /// - /// Gets the projection parameters of this layer which might depend on a specific touch data. + /// Gets the projection parameters of this layer which might depend on a specific pointer data. /// - /// Touch to retrieve projection parameters for. + /// Pointer to retrieve projection parameters for. /// - public virtual ProjectionParams GetProjectionParams(TouchPoint touch) + public virtual ProjectionParams GetProjectionParams(Pointer pointer) { return layerProjectionParams; } @@ -165,36 +165,36 @@ protected virtual void OnDestroy() #region Internal methods - internal bool INTERNAL_BeginTouch(TouchPoint touch) + internal bool INTERNAL_BeginPointer(Pointer pointer) { TouchHit hit; - if (Delegate != null && Delegate.ShouldReceiveTouch(this, touch) == false) return false; - var result = beginTouch(touch, out hit); + if (Delegate != null && Delegate.ShouldReceivePointer(this, pointer) == false) return false; + var result = beginPointer(pointer, out hit); if (result == LayerHitResult.Hit) { - touch.Layer = this; - touch.Hit = hit; - if (hit.Transform != null) touch.Target = hit.Transform; - if (touchBeganInvoker != null) - touchBeganInvoker.InvokeHandleExceptions(this, new TouchLayerEventArgs(touch)); + pointer.Layer = this; + pointer.Hit = hit; + if (hit.Transform != null) pointer.Target = hit.Transform; + if (pointerBeganInvoker != null) + pointerBeganInvoker.InvokeHandleExceptions(this, new TouchLayerEventArgs(pointer)); return true; } return false; } - internal void INTERNAL_UpdateTouch(TouchPoint touch) + internal void INTERNAL_UpdatePointer(Pointer pointer) { - updateTouch(touch); + updatePointer(pointer); } - internal void INTERNAL_EndTouch(TouchPoint touch) + internal void INTERNAL_EndPointer(Pointer pointer) { - endTouch(touch); + endPointer(pointer); } - internal void INTERNAL_CancelTouch(TouchPoint touch) + internal void INTERNAL_CancelPointer(Pointer pointer) { - cancelTouch(touch); + cancelPointer(pointer); } #endregion @@ -202,7 +202,7 @@ internal void INTERNAL_CancelTouch(TouchPoint touch) #region Protected functions /// - /// Updates touch layers's name. + /// Updates pointer layers's name. /// protected virtual void setName() { @@ -210,38 +210,38 @@ protected virtual void setName() } /// - /// Called when a layer is touched to query the layer if this touch hits something. + /// Called when a layer is touched to query the layer if this pointer hits something. /// - /// Touch. + /// Pointer. /// Hit result. /// , if an object is hit, or otherwise. /// This method may also be used to update some internal state or resend this event somewhere. - protected virtual LayerHitResult beginTouch(TouchPoint touch, out TouchHit hit) + protected virtual LayerHitResult beginPointer(Pointer pointer, out TouchHit hit) { - var result = Hit(touch.Position, out hit); + var result = Hit(pointer.Position, out hit); return result; } /// - /// Called when a touch is moved. + /// Called when a pointer is moved. /// - /// Touch. + /// Pointer. /// This method may also be used to update some internal state or resend this event somewhere. - protected virtual void updateTouch(TouchPoint touch) {} + protected virtual void updatePointer(Pointer pointer) {} /// - /// Called when a touch ends. + /// Called when a pointer ends. /// - /// Touch. + /// Pointer. /// This method may also be used to update some internal state or resend this event somewhere. - protected virtual void endTouch(TouchPoint touch) {} + protected virtual void endPointer(Pointer pointer) {} /// - /// Called when a touch is cancelled. + /// Called when a pointer is cancelled. /// - /// Touch. + /// Pointer. /// This method may also be used to update some internal state or resend this event somewhere. - protected virtual void cancelTouch(TouchPoint touch) {} + protected virtual void cancelPointer(Pointer pointer) {} /// /// Creates projection parameters. @@ -261,18 +261,18 @@ protected virtual ProjectionParams createProjectionParams() public class TouchLayerEventArgs : EventArgs { /// - /// Gets the touch associated with the event. + /// Gets the pointer associated with the event. /// - public TouchPoint Touch { get; private set; } + public Pointer Pointer { get; private set; } /// /// Initializes a new instance of the class. /// - /// The touch associated with the event. - public TouchLayerEventArgs(TouchPoint touch) + /// The pointer associated with the event. + public TouchLayerEventArgs(Pointer pointer) : base() { - Touch = touch; + Pointer = pointer; } } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs b/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs index 785f3b777..62868bd7d 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs @@ -13,7 +13,7 @@ namespace TouchScript.Layers { /// - /// Touch layer which handles Unity UI and interface objects in a Canvas. + /// Pointer layer which handles Unity UI and interface objects in a Canvas. /// [AddComponentMenu("TouchScript/Layers/UI Layer")] [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Layers_UILayer.htm")] @@ -83,9 +83,9 @@ public override LayerHitResult Hit(Vector2 position, out TouchHit hit) } /// - public override ProjectionParams GetProjectionParams(TouchPoint touch) + public override ProjectionParams GetProjectionParams(Pointer pointer) { - var graphic = touch.Target.GetComponent(); + var graphic = pointer.Target.GetComponent(); if (graphic == null) return layerProjectionParams; var canvas = graphic.canvas; if (canvas == null) return layerProjectionParams; diff --git a/Source/Assets/TouchScript/Scripts/TouchPoint.cs b/Source/Assets/TouchScript/Scripts/Pointer.cs similarity index 79% rename from Source/Assets/TouchScript/Scripts/TouchPoint.cs rename to Source/Assets/TouchScript/Scripts/Pointer.cs index 0bc8641ed..45f464834 100644 --- a/Source/Assets/TouchScript/Scripts/TouchPoint.cs +++ b/Source/Assets/TouchScript/Scripts/Pointer.cs @@ -11,16 +11,16 @@ namespace TouchScript { /// - /// Representation of a finger within TouchScript. - /// An object implementing this interface 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 touch's lifetime (i.e. when target finger is lifted off). These objects may be reused internally. Store unique ids instead. + /// Representation of a pointer (touch, mouse) within TouchScript. + /// 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 TouchPoint + public class Pointer { #region Public properties /// - /// Internal unique touch point id. + /// Internal unique pointer id. /// public int Id { get; private set; } @@ -48,7 +48,7 @@ public Vector2 Position public TouchHit Hit { get; internal set; } /// - /// Original layer which registered this touch. + /// Original layer which registered this pointer. /// /// /// @@ -56,13 +56,13 @@ public Vector2 Position public TouchLayer Layer { get; internal set; } /// - /// Original input source which created this touch. + /// Original input source which created this pointer. /// /// public IInputSource InputSource { get; internal set; } /// - /// Projection parameters for the layer which created this touch. + /// Projection parameters for the layer which created this pointer. /// public ProjectionParams ProjectionParams { @@ -70,12 +70,12 @@ public ProjectionParams ProjectionParams } /// - /// Tags collection for this touch object. + /// Tags collection for this pointer. /// public Tags Tags { get; private set; } /// - /// List of custom properties (key-value pairs) for this touch object. + /// List of custom properties (key-value pairs) for this pointer. /// public Dictionary Properties { @@ -99,11 +99,11 @@ public Dictionary Properties /// public override bool Equals(object other) { - return Equals(other as TouchPoint); + return Equals(other as Pointer); } /// - public bool Equals(TouchPoint other) + public bool Equals(Pointer other) { if (other == null) return false; @@ -120,9 +120,9 @@ public override int GetHashCode() #endregion /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// - public TouchPoint() + public Pointer() { properties = new Dictionary(); } @@ -130,11 +130,11 @@ public TouchPoint() #region Internal methods /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// - /// Unique id of the touch. - /// Screen position of the touch. - /// Input source which created this touch. + /// Unique id of the pointer. + /// Screen position of the pointer. + /// Input source which created this pointer. /// Initial tags. internal void INTERNAL_Init(int id, Vector2 position, IInputSource input, Tags tags) { diff --git a/Source/Assets/TouchScript/Scripts/TouchPoint.cs.meta b/Source/Assets/TouchScript/Scripts/Pointer.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/TouchPoint.cs.meta rename to Source/Assets/TouchScript/Scripts/Pointer.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/Tags.cs b/Source/Assets/TouchScript/Scripts/Tags.cs index 3495685ce..8da69b9c6 100644 --- a/Source/Assets/TouchScript/Scripts/Tags.cs +++ b/Source/Assets/TouchScript/Scripts/Tags.cs @@ -18,7 +18,7 @@ public sealed class Tags : ISerializationCallbackReceiver #region Constants /// - /// Touch. + /// Pointer. /// public const string INPUT_TOUCH = "Touch"; diff --git a/Source/Assets/TouchScript/Scripts/TouchManager.cs b/Source/Assets/TouchScript/Scripts/TouchManager.cs index adbf2f20c..2f90ec00f 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManager.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManager.cs @@ -21,15 +21,15 @@ namespace TouchScript /// Though it's not required it is a convenient way to configure TouchScript for your scene. You can use different configuration options for different scenes. /// /// - /// This sample shows how to get Touch Manager instance and subscribe to events. + /// This sample shows how to get Pointer Manager instance and subscribe to events. /// - /// TouchManager.Instance.TouchesBegan += - /// (sender, args) => { foreach (var touch in args.Touches) Debug.Log("Began: " + touch.Id); }; - /// TouchManager.Instance.TouchesEnded += - /// (sender, args) => { foreach (var touch in args.Touches) Debug.Log("Ended: " + touch.Id); }; + /// TouchManager.Instance.PointersBegan += + /// (sender, args) => { foreach (var pointer in args.Pointers) Debug.Log("Began: " + pointer.Id); }; + /// TouchManager.Instance.PointersEnded += + /// (sender, args) => { foreach (var pointer in args.Pointers) Debug.Log("Ended: " + pointer.Id); }; /// /// - [AddComponentMenu("TouchScript/Touch Manager")] + [AddComponentMenu("TouchScript/Pointer Manager")] [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_TouchManager.htm")] public sealed class TouchManager : MonoBehaviour { @@ -47,34 +47,34 @@ public sealed class TouchManager : MonoBehaviour public enum MessageType { /// - /// Touch frame started. + /// Pointer frame started. /// FrameStarted = 1 << 0, /// - /// Touch frame finished. + /// Pointer frame finished. /// FrameFinished = 1 << 1, /// - /// Some touches have begun during the frame. + /// Some pointers have begun during the frame. /// - TouchesBegan = 1 << 2, + PointersBegan = 1 << 2, /// - /// Some touches have moved during the frame. + /// Some pointers have moved during the frame. /// - TouchesMoved = 1 << 3, + PointersMoved = 1 << 3, /// - /// Some touches have ended during the frame. + /// Some pointers have ended during the frame. /// - TouchesEnded = 1 << 4, + PointersEnded = 1 << 4, /// - /// Some touches were cancelled during the frame. + /// Some pointers were cancelled during the frame. /// - TouchesCancelled = 1 << 5 + PointersCancelled = 1 << 5 } /// @@ -83,34 +83,34 @@ public enum MessageType public enum MessageName { /// - /// Touch frame started. + /// Pointer frame started. /// - OnTouchFrameStarted = MessageType.FrameStarted, + OnPointerFrameStarted = MessageType.FrameStarted, /// - /// Touch frame finished. + /// Pointer frame finished. /// - OnTouchFrameFinished = MessageType.FrameFinished, + OnPointerFrameFinished = MessageType.FrameFinished, /// - /// Some touches have begun during the frame. + /// Some pointers have begun during the frame. /// - OnTouchesBegan = MessageType.TouchesBegan, + OnPointersBegan = MessageType.PointersBegan, /// - /// Some touches have moved during the frame. + /// Some pointers have moved during the frame. /// - OnTouchesMoved = MessageType.TouchesMoved, + OnPointersMoved = MessageType.PointersMoved, /// - /// Some touches have ended during the frame. + /// Some pointers have ended during the frame. /// - OnTouchesEnded = MessageType.TouchesEnded, + OnPointersEnded = MessageType.PointersEnded, /// - /// Some touches were cancelled during the frame. + /// Some pointers were cancelled during the frame. /// - OnTouchesCancelled = MessageType.TouchesCancelled + OnPointersCancelled = MessageType.PointersCancelled } /// @@ -140,7 +140,7 @@ public enum MessageName /// /// Gets the instance of implementation used in the application. /// - /// An instance of which is in charge of global touch input control in the application. + /// An instance of which is in charge of global pointer input control in the application. public static ITouchManager Instance { get { return TouchManagerInstance.Instance; } @@ -173,7 +173,7 @@ public IDisplayDevice DisplayDevice /// Indicates if TouchScript should create a CameraLayer 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 touch input from some device. + /// 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. public bool ShouldCreateCameraLayer { get { return shouldCreateCameraLayer; } @@ -270,8 +270,8 @@ public static bool IsInvalidPosition(Vector2 position) private bool useSendMessage = false; [SerializeField] - private MessageType sendMessageEvents = MessageType.TouchesBegan | MessageType.TouchesCancelled | - MessageType.TouchesEnded | MessageType.TouchesMoved; + private MessageType sendMessageEvents = MessageType.PointersBegan | MessageType.PointersCancelled | + MessageType.PointersEnded | MessageType.PointersMoved; [SerializeField] private GameObject sendMessageTarget; @@ -323,10 +323,10 @@ private void updateSubscription() if ((SendMessageEvents & MessageType.FrameStarted) != 0) Instance.FrameStarted += frameStartedHandler; if ((SendMessageEvents & MessageType.FrameFinished) != 0) Instance.FrameFinished += frameFinishedHandler; - if ((SendMessageEvents & MessageType.TouchesBegan) != 0) Instance.TouchesBegan += touchesBeganHandler; - if ((SendMessageEvents & MessageType.TouchesMoved) != 0) Instance.TouchesMoved += touchesMovedHandler; - if ((SendMessageEvents & MessageType.TouchesEnded) != 0) Instance.TouchesEnded += touchesEndedHandler; - if ((SendMessageEvents & MessageType.TouchesCancelled) != 0) Instance.TouchesCancelled += touchesCancelledHandler; + if ((SendMessageEvents & MessageType.PointersBegan) != 0) Instance.PointersBegan += pointersBeganHandler; + if ((SendMessageEvents & MessageType.PointersMoved) != 0) Instance.PointersMoved += pointersMovedHandler; + if ((SendMessageEvents & MessageType.PointersEnded) != 0) Instance.PointersEnded += pointersEndedHandler; + if ((SendMessageEvents & MessageType.PointersCancelled) != 0) Instance.PointersCancelled += pointersCancelledHandler; } private void removeSubscriptions() @@ -336,45 +336,45 @@ private void removeSubscriptions() Instance.FrameStarted -= frameStartedHandler; Instance.FrameFinished -= frameFinishedHandler; - Instance.TouchesBegan -= touchesBeganHandler; - Instance.TouchesMoved -= touchesMovedHandler; - Instance.TouchesEnded -= touchesEndedHandler; - Instance.TouchesCancelled -= touchesCancelledHandler; + Instance.PointersBegan -= pointersBeganHandler; + Instance.PointersMoved -= pointersMovedHandler; + Instance.PointersEnded -= pointersEndedHandler; + Instance.PointersCancelled -= pointersCancelledHandler; } - private void touchesBeganHandler(object sender, TouchEventArgs e) + private void pointersBeganHandler(object sender, PointerEventArgs e) { - sendMessageTarget.SendMessage(MessageName.OnTouchesBegan.ToString(), e.Touches, + sendMessageTarget.SendMessage(MessageName.OnPointersBegan.ToString(), e.Pointers, SendMessageOptions.DontRequireReceiver); } - private void touchesMovedHandler(object sender, TouchEventArgs e) + private void pointersMovedHandler(object sender, PointerEventArgs e) { - sendMessageTarget.SendMessage(MessageName.OnTouchesMoved.ToString(), e.Touches, + sendMessageTarget.SendMessage(MessageName.OnPointersMoved.ToString(), e.Pointers, SendMessageOptions.DontRequireReceiver); } - private void touchesEndedHandler(object sender, TouchEventArgs e) + private void pointersEndedHandler(object sender, PointerEventArgs e) { - sendMessageTarget.SendMessage(MessageName.OnTouchesEnded.ToString(), e.Touches, + sendMessageTarget.SendMessage(MessageName.OnPointersEnded.ToString(), e.Pointers, SendMessageOptions.DontRequireReceiver); } - private void touchesCancelledHandler(object sender, TouchEventArgs e) + private void pointersCancelledHandler(object sender, PointerEventArgs e) { - sendMessageTarget.SendMessage(MessageName.OnTouchesCancelled.ToString(), e.Touches, + sendMessageTarget.SendMessage(MessageName.OnPointersCancelled.ToString(), e.Pointers, SendMessageOptions.DontRequireReceiver); } private void frameStartedHandler(object sender, EventArgs e) { - sendMessageTarget.SendMessage(MessageName.OnTouchFrameStarted.ToString(), + sendMessageTarget.SendMessage(MessageName.OnPointerFrameStarted.ToString(), SendMessageOptions.DontRequireReceiver); } private void frameFinishedHandler(object sender, EventArgs e) { - sendMessageTarget.SendMessage(MessageName.OnTouchFrameFinished.ToString(), + sendMessageTarget.SendMessage(MessageName.OnPointerFrameFinished.ToString(), SendMessageOptions.DontRequireReceiver); } diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs index 36b1ec3ce..f25433bc2 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs @@ -39,38 +39,38 @@ public event EventHandler FrameFinished } /// - public event EventHandler TouchesBegan + public event EventHandler PointersBegan { - add { touchesBeganInvoker += value; } - remove { touchesBeganInvoker -= value; } + add { pointersBeganInvoker += value; } + remove { pointersBeganInvoker -= value; } } /// - public event EventHandler TouchesMoved + public event EventHandler PointersMoved { - add { touchesMovedInvoker += value; } - remove { touchesMovedInvoker -= value; } + add { pointersMovedInvoker += value; } + remove { pointersMovedInvoker -= value; } } /// - public event EventHandler TouchesEnded + public event EventHandler PointersEnded { - add { touchesEndedInvoker += value; } - remove { touchesEndedInvoker -= value; } + add { pointersEndedInvoker += value; } + remove { pointersEndedInvoker -= value; } } /// - public event EventHandler TouchesCancelled + public event EventHandler PointersCancelled { - add { touchesCancelledInvoker += value; } - remove { touchesCancelledInvoker -= value; } + add { pointersCancelledInvoker += value; } + remove { pointersCancelledInvoker -= value; } } // Needed to overcome iOS AOT limitations - private EventHandler touchesBeganInvoker, - touchesMovedInvoker, - touchesEndedInvoker, - touchesCancelledInvoker; + private EventHandler pointersBeganInvoker, + pointersMovedInvoker, + pointersEndedInvoker, + pointersCancelledInvoker; private EventHandler frameStartedInvoker, frameFinishedInvoker; @@ -166,15 +166,15 @@ public float DotsPerCentimeter } /// - public int NumberOfTouches + public int NumberOfPointers { - get { return touches.Count; } + get { return pointers.Count; } } /// - public IList ActiveTouches + public IList ActivePointers { - get { return new List(touches); } + get { return new List(pointers); } } #endregion @@ -195,26 +195,26 @@ public IList ActiveTouches private List inputs = new List(3); private int inputCount = 0; - private List touches = new List(30); - private Dictionary idToTouch = new Dictionary(30); + private List pointers = new List(30); + private Dictionary idToPointer = new Dictionary(30); // Upcoming changes - private List touchesBegan = new List(10); - private HashSet touchesUpdated = new HashSet(); - private HashSet touchesEnded = new HashSet(); - private HashSet touchesCancelled = new HashSet(); + private List pointersBegan = new List(10); + private HashSet pointersUpdated = new HashSet(); + private HashSet pointersEnded = new HashSet(); + private HashSet pointersCancelled = new HashSet(); - private static ObjectPool touchPointPool = new ObjectPool(10, null, null, + private static ObjectPool pointerPool = new ObjectPool(10, null, null, (t) => t.INTERNAL_Reset()); - private static ObjectPool> touchPointListPool = new ObjectPool>(2, - () => new List(10), null, (l) => l.Clear()); + private static ObjectPool> pointerListPool = new ObjectPool>(2, + () => new List(10), null, (l) => l.Clear()); private static ObjectPool> intListPool = new ObjectPool>(3, () => new List(10), null, (l) => l.Clear()); - private int nextTouchId = 0; - private object touchLock = new object(); + private int nextPointerId = 0; + private object pointerLock = new object(); #endregion @@ -333,140 +333,140 @@ public bool GetHitTarget(Vector2 position, out TouchHit hit, out TouchLayer laye } /// - public void CancelTouch(int id, bool @return) + public void CancelPointer(int id, bool @return) { - TouchPoint touch; - if (idToTouch.TryGetValue(id, out touch)) + Pointer pointer; + if (idToPointer.TryGetValue(id, out pointer)) { - touch.InputSource.CancelTouch(touch, @return); + pointer.InputSource.CancelPointer(pointer, @return); } } /// - public void CancelTouch(int id) + public void CancelPointer(int id) { - CancelTouch(id, false); + CancelPointer(id, false); } #endregion #region Internal methods - internal TouchPoint INTERNAL_BeginTouch(Vector2 position, IInputSource input) + internal Pointer INTERNAL_BeginPointer(Vector2 position, IInputSource input) { - return INTERNAL_BeginTouch(position, input, null); + return INTERNAL_BeginPointer(position, input, null); } - internal TouchPoint INTERNAL_BeginTouch(Vector2 position, IInputSource input, Tags tags) + internal Pointer INTERNAL_BeginPointer(Vector2 position, IInputSource input, Tags tags) { - TouchPoint touch; - lock (touchLock) + Pointer pointer; + lock (pointerLock) { - touch = touchPointPool.Get(); - touch.INTERNAL_Init(nextTouchId++, position, input, tags); - touchesBegan.Add(touch); + pointer = pointerPool.Get(); + pointer.INTERNAL_Init(nextPointerId++, position, input, tags); + pointersBegan.Add(pointer); } - return touch; + return pointer; } /// - /// Update touch without moving it + /// Update pointer without moving it /// - /// Touch id - internal void INTERNAL_UpdateTouch(int id) + /// Pointer id + internal void INTERNAL_UpdatePointer(int id) { - lock (touchLock) + lock (pointerLock) { - if (idToTouch.ContainsKey(id)) + if (idToPointer.ContainsKey(id)) { - if (!touchesUpdated.Contains(id)) touchesUpdated.Add(id); + if (!pointersUpdated.Contains(id)) pointersUpdated.Add(id); } #if TOUCHSCRIPT_DEBUG else - Debug.LogWarning("TouchScript > Touch with id [" + id + - "] is requested to UPDATE but no touch with such id found."); + Debug.LogWarning("TouchScript > Pointer with id [" + id + + "] is requested to UPDATE but no pointer with such id found."); #endif } } - internal void INTERNAL_MoveTouch(int id, Vector2 position) + internal void INTERNAL_MovePointer(int id, Vector2 position) { - lock (touchLock) + lock (pointerLock) { - TouchPoint touch; - if (!idToTouch.TryGetValue(id, out touch)) + Pointer pointer; + if (!idToPointer.TryGetValue(id, out pointer)) { - // This touch was added this frame - touch = touchesBegan.Find((t) => t.Id == id); - // No touch with such id - if (touch == null) + // This pointer was added this frame + pointer = pointersBegan.Find((t) => t.Id == id); + // No pointer with such id + if (pointer == null) { #if TOUCHSCRIPT_DEBUG - Debug.LogWarning("TouchScript > Touch with id [" + id + "] is requested to MOVE to " + position + - " but no touch with such id found."); + Debug.LogWarning("TouchScript > Pointer with id [" + id + "] is requested to MOVE to " + position + + " but no pointer with such id found."); #endif return; } } - touch.INTERNAL_SetPosition(position); - if (!touchesUpdated.Contains(id)) touchesUpdated.Add(id); + pointer.INTERNAL_SetPosition(position); + if (!pointersUpdated.Contains(id)) pointersUpdated.Add(id); } } /// - internal void INTERNAL_EndTouch(int id) + internal void INTERNAL_EndPointer(int id) { - lock (touchLock) + lock (pointerLock) { - TouchPoint touch; - if (!idToTouch.TryGetValue(id, out touch)) + Pointer pointer; + if (!idToPointer.TryGetValue(id, out pointer)) { - // This touch was added this frame - touch = touchesBegan.Find((t) => t.Id == id); - // No touch with such id - if (touch == null) + // This pointer was added this frame + pointer = pointersBegan.Find((t) => t.Id == id); + // No pointer with such id + if (pointer == null) { #if TOUCHSCRIPT_DEBUG - Debug.LogWarning("TouchScript > Touch with id [" + id + - "] is requested to END but no touch with such id found."); + Debug.LogWarning("TouchScript > Pointer with id [" + id + + "] is requested to END but no pointer with such id found."); #endif return; } } - if (!touchesEnded.Contains(id)) touchesEnded.Add(id); + if (!pointersEnded.Contains(id)) pointersEnded.Add(id); #if TOUCHSCRIPT_DEBUG else - Debug.LogWarning("TouchScript > Touch with id [" + id + + Debug.LogWarning("TouchScript > Pointer with id [" + id + "] is requested to END more than once this frame."); #endif } } /// - internal void INTERNAL_CancelTouch(int id) + internal void INTERNAL_CancelPointer(int id) { - lock (touchLock) + lock (pointerLock) { - TouchPoint touch; - if (!idToTouch.TryGetValue(id, out touch)) + Pointer pointer; + if (!idToPointer.TryGetValue(id, out pointer)) { - // This touch was added this frame - touch = touchesBegan.Find((t) => t.Id == id); - // No touch with such id - if (touch == null) + // This pointer was added this frame + pointer = pointersBegan.Find((t) => t.Id == id); + // No pointer with such id + if (pointer == null) { #if TOUCHSCRIPT_DEBUG - Debug.LogWarning("TouchScript > Touch with id [" + id + - "] is requested to CANCEL but no touch with such id found."); + Debug.LogWarning("TouchScript > Pointer with id [" + id + + "] is requested to CANCEL but no pointer with such id found."); #endif return; } } - if (!touchesCancelled.Contains(id)) touchesCancelled.Add(touch.Id); + if (!pointersCancelled.Contains(id)) pointersCancelled.Add(pointer.Id); #if TOUCHSCRIPT_DEBUG else - Debug.LogWarning("TouchScript > Touch with id [" + id + + Debug.LogWarning("TouchScript > Pointer with id [" + id + "] is requested to CANCEL more than once this frame."); #endif } @@ -496,7 +496,7 @@ private void Awake() StopAllCoroutines(); StartCoroutine(lateAwake()); - touchPointListPool.WarmUp(2); + pointerListPool.WarmUp(2); intListPool.WarmUp(3); #if TOUCHSCRIPT_DEBUG @@ -516,13 +516,13 @@ private IEnumerator lateAwake() updateLayers(); createCameraLayer(); - createTouchInput(); + createInput(); } private void Update() { updateInputs(); - updateTouches(); + updatePointers(); } private void OnApplicationQuit() @@ -539,7 +539,7 @@ private void updateDPI() dpi = DisplayDevice == null ? 96 : DisplayDevice.DPI; dotsPerCentimeter = TouchManager.CM_TO_INCH * dpi; #if TOUCHSCRIPT_DEBUG - debugTouchSize = Vector2.one*dotsPerCentimeter; + debugPointerSize = Vector2.one*dotsPerCentimeter; #endif } @@ -565,7 +565,7 @@ private void createCameraLayer() } } - private void createTouchInput() + private void createInput() { if (inputCount == 0 && shouldCreateStandardInput) { @@ -591,175 +591,175 @@ private void updateInputs() for (var i = 0; i < inputCount; i++) inputs[i].UpdateInput(); } - private void updateBegan(List points) + private void updateBegan(List pointers) { - var count = points.Count; - var list = touchPointListPool.Get(); + var count = pointers.Count; + var list = pointerListPool.Get(); for (var i = 0; i < count; i++) { - var touch = points[i]; - list.Add(touch); - touches.Add(touch); - idToTouch.Add(touch.Id, touch); + var pointer = pointers[i]; + list.Add(pointer); + this.pointers.Add(pointer); + idToPointer.Add(pointer.Id, pointer); for (var j = 0; j < layerCount; j++) { var touchLayer = layers[j]; if (touchLayer == null || !touchLayer.enabled) continue; - if (touchLayer.INTERNAL_BeginTouch(touch)) break; + if (touchLayer.INTERNAL_BeginPointer(pointer)) break; } #if TOUCHSCRIPT_DEBUG - addDebugFigureForTouch(touch); + addDebugFigureForPointer(pointer); #endif } - if (touchesBeganInvoker != null) - touchesBeganInvoker.InvokeHandleExceptions(this, TouchEventArgs.GetCachedEventArgs(list)); - touchPointListPool.Release(list); + if (pointersBeganInvoker != null) + pointersBeganInvoker.InvokeHandleExceptions(this, PointerEventArgs.GetCachedEventArgs(list)); + pointerListPool.Release(list); } - private void updateUpdated(List points) + private void updateUpdated(List pointers) { - var updatedCount = points.Count; - var list = touchPointListPool.Get(); - // Need to loop through all touches to reset those which did not move - var count = touches.Count; + var updatedCount = pointers.Count; + var list = pointerListPool.Get(); + // Need to loop through all pointers to reset those which did not move + var count = this.pointers.Count; for (var i = 0; i < count; i++) { - touches[i].INTERNAL_ResetPosition(); + this.pointers[i].INTERNAL_ResetPosition(); } for (var i = 0; i < updatedCount; i++) { - var id = points[i]; - TouchPoint touch; - if (!idToTouch.TryGetValue(id, out touch)) + var id = pointers[i]; + Pointer pointer; + if (!idToPointer.TryGetValue(id, out pointer)) { #if TOUCHSCRIPT_DEBUG Debug.LogWarning("TouchScript > Id [" + id + - "] was in UPDATED list but no touch with such id found."); + "] was in UPDATED list but no pointer with such id found."); #endif continue; } - list.Add(touch); - if (touch.Layer != null) touch.Layer.INTERNAL_UpdateTouch(touch); + list.Add(pointer); + if (pointer.Layer != null) pointer.Layer.INTERNAL_UpdatePointer(pointer); #if TOUCHSCRIPT_DEBUG - addDebugFigureForTouch(touch); + addDebugFigureForPointer(pointer); #endif } - if (touchesMovedInvoker != null) - touchesMovedInvoker.InvokeHandleExceptions(this, TouchEventArgs.GetCachedEventArgs(list)); - touchPointListPool.Release(list); + if (pointersMovedInvoker != null) + pointersMovedInvoker.InvokeHandleExceptions(this, PointerEventArgs.GetCachedEventArgs(list)); + pointerListPool.Release(list); } - private void updateEnded(List points) + private void updateEnded(List pointers) { - var endedCount = points.Count; - var list = touchPointListPool.Get(); + var endedCount = pointers.Count; + var list = pointerListPool.Get(); for (var i = 0; i < endedCount; i++) { - var id = points[i]; - TouchPoint touch; - if (!idToTouch.TryGetValue(id, out touch)) + var id = pointers[i]; + Pointer pointer; + if (!idToPointer.TryGetValue(id, out pointer)) { #if TOUCHSCRIPT_DEBUG - Debug.LogWarning("TouchScript > Id [" + id + "] was in ENDED list but no touch with such id found."); + Debug.LogWarning("TouchScript > Id [" + id + "] was in ENDED list but no pointer with such id found."); #endif continue; } - idToTouch.Remove(id); - touches.Remove(touch); - list.Add(touch); - if (touch.Layer != null) touch.Layer.INTERNAL_EndTouch(touch); + idToPointer.Remove(id); + this.pointers.Remove(pointer); + list.Add(pointer); + if (pointer.Layer != null) pointer.Layer.INTERNAL_EndPointer(pointer); #if TOUCHSCRIPT_DEBUG - removeDebugFigureForTouch(touch); + removeDebugFigureForPointer(pointer); #endif } - if (touchesEndedInvoker != null) - touchesEndedInvoker.InvokeHandleExceptions(this, TouchEventArgs.GetCachedEventArgs(list)); + if (pointersEndedInvoker != null) + pointersEndedInvoker.InvokeHandleExceptions(this, PointerEventArgs.GetCachedEventArgs(list)); - for (var i = 0; i < endedCount; i++) touchPointPool.Release(list[i]); - touchPointListPool.Release(list); + for (var i = 0; i < endedCount; i++) pointerPool.Release(list[i]); + pointerListPool.Release(list); } - private void updateCancelled(List points) + private void updateCancelled(List pointers) { - var cancelledCount = points.Count; - var list = touchPointListPool.Get(); + var cancelledCount = pointers.Count; + var list = pointerListPool.Get(); for (var i = 0; i < cancelledCount; i++) { - var id = points[i]; - TouchPoint touch; - if (!idToTouch.TryGetValue(id, out touch)) + var id = pointers[i]; + Pointer pointer; + if (!idToPointer.TryGetValue(id, out pointer)) { #if TOUCHSCRIPT_DEBUG Debug.LogWarning("TouchScript > Id [" + id + - "] was in CANCELLED list but no touch with such id found."); + "] was in CANCELLED list but no pointer with such id found."); #endif continue; } - idToTouch.Remove(id); - touches.Remove(touch); - list.Add(touch); - if (touch.Layer != null) touch.Layer.INTERNAL_CancelTouch(touch); + idToPointer.Remove(id); + this.pointers.Remove(pointer); + list.Add(pointer); + if (pointer.Layer != null) pointer.Layer.INTERNAL_CancelPointer(pointer); #if TOUCHSCRIPT_DEBUG - removeDebugFigureForTouch(touch); + removeDebugFigureForPointer(pointer); #endif } - if (touchesCancelledInvoker != null) - touchesCancelledInvoker.InvokeHandleExceptions(this, TouchEventArgs.GetCachedEventArgs(list)); + if (pointersCancelledInvoker != null) + pointersCancelledInvoker.InvokeHandleExceptions(this, PointerEventArgs.GetCachedEventArgs(list)); - for (var i = 0; i < cancelledCount; i++) touchPointPool.Release(list[i]); - touchPointListPool.Release(list); + for (var i = 0; i < cancelledCount; i++) pointerPool.Release(list[i]); + pointerListPool.Release(list); } - private void updateTouches() + private void updatePointers() { if (frameStartedInvoker != null) frameStartedInvoker.InvokeHandleExceptions(this, EventArgs.Empty); // need to copy buffers since they might get updated during execution - List beganList = null; + List beganList = null; List updatedList = null; List endedList = null; List cancelledList = null; - lock (touchLock) + lock (pointerLock) { - if (touchesBegan.Count > 0) + if (pointersBegan.Count > 0) { - beganList = touchPointListPool.Get(); - beganList.AddRange(touchesBegan); - touchesBegan.Clear(); + beganList = pointerListPool.Get(); + beganList.AddRange(pointersBegan); + pointersBegan.Clear(); } - if (touchesUpdated.Count > 0) + if (pointersUpdated.Count > 0) { updatedList = intListPool.Get(); - updatedList.AddRange(touchesUpdated); - touchesUpdated.Clear(); + updatedList.AddRange(pointersUpdated); + pointersUpdated.Clear(); } - if (touchesEnded.Count > 0) + if (pointersEnded.Count > 0) { endedList = intListPool.Get(); - endedList.AddRange(touchesEnded); - touchesEnded.Clear(); + endedList.AddRange(pointersEnded); + pointersEnded.Clear(); } - if (touchesCancelled.Count > 0) + if (pointersCancelled.Count > 0) { cancelledList = intListPool.Get(); - cancelledList.AddRange(touchesCancelled); - touchesCancelled.Clear(); + cancelledList.AddRange(pointersCancelled); + pointersCancelled.Clear(); } } if (beganList != null) { updateBegan(beganList); - touchPointListPool.Release(beganList); + pointerListPool.Release(beganList); } if (updatedList != null) { @@ -781,16 +781,16 @@ private void updateTouches() } #if TOUCHSCRIPT_DEBUG - private Vector2 debugTouchSize; + private Vector2 debugPointerSize; - private void removeDebugFigureForTouch(TouchPoint touch) + private void removeDebugFigureForPointer(Pointer pointer) { - GLDebug.RemoveFigure(TouchManager.DEBUG_GL_TOUCH + touch.Id); + GLDebug.RemoveFigure(TouchManager.DEBUG_GL_TOUCH + pointer.Id); } - private void addDebugFigureForTouch(TouchPoint touch) + private void addDebugFigureForPointer(Pointer pointer) { - GLDebug.DrawSquareScreenSpace(TouchManager.DEBUG_GL_TOUCH + touch.Id, touch.Position, 0, debugTouchSize, + GLDebug.DrawSquareScreenSpace(TouchManager.DEBUG_GL_TOUCH + pointer.Id, pointer.Position, 0, debugPointerSize, GLDebug.MULTIPLY, float.PositiveInfinity); } #endif diff --git a/Source/Assets/TouchScript/Scripts/Utils/ClusterUtils.cs b/Source/Assets/TouchScript/Scripts/Utils/ClusterUtils.cs index 47d0e63e4..2c75b6c50 100644 --- a/Source/Assets/TouchScript/Scripts/Utils/ClusterUtils.cs +++ b/Source/Assets/TouchScript/Scripts/Utils/ClusterUtils.cs @@ -16,49 +16,49 @@ public static class ClusterUtils private static StringBuilder hashString = new StringBuilder(); /// - /// Calculates the centroid of touch positions. + /// Calculates the centroid of pointers' positions. /// - /// List of touch points. - /// Centroid of touch points' positions or if cluster contains no points. - public static Vector2 Get2DCenterPosition(IList touches) + /// List of pointers. + /// Centroid of pointers' positions or if cluster contains no points. + public static Vector2 Get2DCenterPosition(IList pointers) { - var count = touches.Count; + var count = pointers.Count; if (count == 0) return TouchManager.INVALID_POSITION; - if (count == 1) return touches[0].Position; + if (count == 1) return pointers[0].Position; var position = new Vector2(); - for (var i = 0; i < count; i++) position += touches[i].Position; + for (var i = 0; i < count; i++) position += pointers[i].Position; return position / count; } /// - /// Calculates the centroid of previous touch positions. + /// Calculates the centroid of pointers' previous positions. /// - /// List of touch points. - /// Centroid of previous touch point's positions or if cluster contains no points. - public static Vector2 GetPrevious2DCenterPosition(IList touches) + /// List of pointers. + /// Centroid of pointers' previous positions or if cluster contains no points. + public static Vector2 GetPrevious2DCenterPosition(IList pointers) { - var count = touches.Count; + var count = pointers.Count; if (count == 0) return TouchManager.INVALID_POSITION; - if (count == 1) return touches[0].PreviousPosition; + if (count == 1) return pointers[0].PreviousPosition; var position = new Vector2(); - for (var i = 0; i < count; i++) position += touches[i].PreviousPosition; + for (var i = 0; i < count; i++) position += pointers[i].PreviousPosition; return position / count; } /// - /// Computes a unique hash for a list of touches. + /// Computes a unique hash for a list of pointers. /// - /// List of touch points. - /// A unique string for a list of touches. - public static string GetPointsHash(IList touches) + /// List of pointers. + /// A unique string for a list of pointers. + public static string GetPointsHash(IList pointers) { hashString.Remove(0, hashString.Length); - for (var i = 0; i < touches.Count; i++) + for (var i = 0; i < pointers.Count; i++) { hashString.Append("#"); - hashString.Append(touches[i].Id); + hashString.Append(pointers[i].Id); } return hashString.ToString(); } diff --git a/Source/Assets/TouchScript/Scripts/Utils/Geom/TwoD.cs b/Source/Assets/TouchScript/Scripts/Utils/Geom/TwoD.cs index da426d43b..1c74320ea 100644 --- a/Source/Assets/TouchScript/Scripts/Utils/Geom/TwoD.cs +++ b/Source/Assets/TouchScript/Scripts/Utils/Geom/TwoD.cs @@ -7,7 +7,7 @@ namespace TouchScript.Utils.Geom { /// - /// A class with 2D herlper functions. + /// A class with 2D helper functions. /// public static class TwoD { diff --git a/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs b/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs new file mode 100644 index 000000000..7488f37c1 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs @@ -0,0 +1,43 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using TouchScript.Hit; +using TouchScript.Layers; +using UnityEngine; + +namespace TouchScript.Utils +{ + /// + /// Pointer utils. + /// + public static class PointerUtils + { + /// + /// Determines whether the pointer is over a specific GameObject. + /// + /// The pointer. + /// The target. + /// true if the pointer is over the GameObject; false otherwise. + public static bool IsPointerOnTarget(Pointer pointer, Transform target) + { + if (pointer == null || pointer.Layer == null || target == null) return false; + TouchHit hit; + if ((pointer.Layer.Hit(pointer.Position, out hit) == TouchLayer.LayerHitResult.Hit) && + (target == hit.Transform || hit.Transform.IsChildOf(target))) + return true; + return false; + } + + /// + /// Determines whether the pointer is over its target GameObject. + /// + /// The pointer. + /// true if the pointer is over the GameObject; false otherwise. + public static bool IsPointerOnTarget(Pointer pointer) + { + if (pointer == null) return false; + return IsPointerOnTarget(pointer, pointer.Target); + } + } +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Utils/TouchUtils.cs.meta b/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/Utils/TouchUtils.cs.meta rename to Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/Utils/ProjectionUtils.cs b/Source/Assets/TouchScript/Scripts/Utils/ProjectionUtils.cs index dafa8d329..94e8d745a 100644 --- a/Source/Assets/TouchScript/Scripts/Utils/ProjectionUtils.cs +++ b/Source/Assets/TouchScript/Scripts/Utils/ProjectionUtils.cs @@ -2,7 +2,6 @@ * @author Valentin Simonov / http://va.lent.in/ */ -using TouchScript.Layers; using UnityEngine; namespace TouchScript.Utils diff --git a/Source/Assets/TouchScript/Scripts/Utils/TouchUtils.cs b/Source/Assets/TouchScript/Scripts/Utils/TouchUtils.cs deleted file mode 100644 index 9d0f25289..000000000 --- a/Source/Assets/TouchScript/Scripts/Utils/TouchUtils.cs +++ /dev/null @@ -1,43 +0,0 @@ -/* - * @author Valentin Simonov / http://va.lent.in/ - */ - -using TouchScript.Hit; -using TouchScript.Layers; -using UnityEngine; - -namespace TouchScript.Utils -{ - /// - /// Touch utils. - /// - public static class TouchUtils - { - /// - /// Determines whether the touch is over a specific GameObject. - /// - /// The touch. - /// The target. - /// true if the touch is over the GameObject; false otherwise. - public static bool IsTouchOnTarget(TouchPoint touch, Transform target) - { - if (touch == null || touch.Layer == null || target == null) return false; - TouchHit hit; - if ((touch.Layer.Hit(touch.Position, out hit) == TouchLayer.LayerHitResult.Hit) && - (target == hit.Transform || hit.Transform.IsChildOf(target))) - return true; - return false; - } - - /// - /// Determines whether the touch is over its target GameObject. - /// - /// The touch. - /// true if the touch is over the GameObject; false otherwise. - public static bool IsTouchOnTarget(TouchPoint touch) - { - if (touch == null) return false; - return IsTouchOnTarget(touch, touch.Target); - } - } -} \ No newline at end of file From 7a411630a49ca12999f3bfeb3d0a8b9b6d004f31 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sat, 2 Jul 2016 15:53:10 +0300 Subject: [PATCH 008/211] Moved Pointer class to Pointers namespace. --- .../TouchScript/Examples/Checkers/Scripts/Exclusive.cs | 1 + .../Examples/Cube/Scripts/CustomPointerProxy.cs | 4 +--- Source/Assets/TouchScript/Examples/Cube/Scripts/Init.cs | 1 - .../TouchScript/Examples/Cube/Scripts/LayerDelegate.cs | 1 + .../TouchScript/Examples/Cube/Scripts/RedirectInput.cs | 1 + .../Modules/TUIO/Scripts/InputSources/TuioInput.cs | 1 + .../Scripts/Behaviors/TouchScriptInputModule.cs | 1 + .../Scripts/Behaviors/Visualizer/PointerProxy.cs | 1 + Source/Assets/TouchScript/Scripts/Clusters/Clusters.cs | 1 + .../Assets/TouchScript/Scripts/GestureManagerInstance.cs | 1 + .../Scripts/Gestures/Base/PinnedTransformGestureBase.cs | 1 + .../Scripts/Gestures/Base/TransformGestureBase.cs | 1 + .../Clustered/ClusteredPinnedTransformGesture.cs | 1 + .../Clustered/ClusteredScreenTransformGesture.cs | 1 + .../Gestures/Clustered/ClusteredTransformGesture.cs | 1 + .../Assets/TouchScript/Scripts/Gestures/FlickGesture.cs | 1 + Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs | 1 + .../TouchScript/Scripts/Gestures/IGestureDelegate.cs | 1 + .../TouchScript/Scripts/Gestures/LongPressGesture.cs | 1 + .../Assets/TouchScript/Scripts/Gestures/MetaGesture.cs | 1 + .../Scripts/Gestures/PinnedTransformGesture.cs | 1 + .../Assets/TouchScript/Scripts/Gestures/PressGesture.cs | 1 + .../TouchScript/Scripts/Gestures/ReleaseGesture.cs | 1 + Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs | 1 + .../TouchScript/Scripts/Gestures/TransformGesture.cs | 1 + .../Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs | 1 + Source/Assets/TouchScript/Scripts/ITouchManager.cs | 1 + .../TouchScript/Scripts/InputSources/IInputSource.cs | 2 ++ .../Scripts/InputSources/InputHandlers/MouseHandler.cs | 1 + .../Scripts/InputSources/InputHandlers/TouchHandler.cs | 1 + .../InputSources/InputHandlers/WindowsPointerHandlers.cs | 5 +++-- .../TouchScript/Scripts/InputSources/InputSource.cs | 1 + .../TouchScript/Scripts/InputSources/MobileInput.cs | 3 ++- .../TouchScript/Scripts/InputSources/MouseInput.cs | 3 ++- .../TouchScript/Scripts/InputSources/StandardInput.cs | 1 + .../Assets/TouchScript/Scripts/Layers/ILayerDelegate.cs | 2 ++ Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs | 1 + Source/Assets/TouchScript/Scripts/Layers/UILayer.cs | 1 + Source/Assets/TouchScript/Scripts/Pointers.meta | 9 +++++++++ .../Assets/TouchScript/Scripts/{ => Pointers}/Pointer.cs | 2 +- .../TouchScript/Scripts/{ => Pointers}/Pointer.cs.meta | 0 .../Assets/TouchScript/Scripts/TouchManagerInstance.cs | 1 + Source/Assets/TouchScript/Scripts/Utils/ClusterUtils.cs | 1 + Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs | 1 + 44 files changed, 56 insertions(+), 9 deletions(-) create mode 100644 Source/Assets/TouchScript/Scripts/Pointers.meta rename Source/Assets/TouchScript/Scripts/{ => Pointers}/Pointer.cs (99%) rename Source/Assets/TouchScript/Scripts/{ => Pointers}/Pointer.cs.meta (100%) diff --git a/Source/Assets/TouchScript/Examples/Checkers/Scripts/Exclusive.cs b/Source/Assets/TouchScript/Examples/Checkers/Scripts/Exclusive.cs index 33eb305a8..b57ec2075 100644 --- a/Source/Assets/TouchScript/Examples/Checkers/Scripts/Exclusive.cs +++ b/Source/Assets/TouchScript/Examples/Checkers/Scripts/Exclusive.cs @@ -3,6 +3,7 @@ */ using TouchScript.Gestures; +using TouchScript.Pointers; using UnityEngine; namespace TouchScript.Examples.Checkers diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs index f3f6a7a25..41ba4fef6 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs @@ -1,6 +1,4 @@ -using UnityEngine; -using System.Collections; -using TouchScript.Behaviors.Visualizer; +using TouchScript.Pointers; namespace TouchScript.Examples.Cube { diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/Init.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/Init.cs index 7be965f8f..cc5b4d5b3 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/Init.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/Init.cs @@ -1,5 +1,4 @@ using UnityEngine; -using System.Collections; using TouchScript.Layers; namespace TouchScript.Examples.Cube diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/LayerDelegate.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/LayerDelegate.cs index 7be3df4cb..552448fa8 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/LayerDelegate.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/LayerDelegate.cs @@ -1,5 +1,6 @@ using UnityEngine; using TouchScript.Layers; +using TouchScript.Pointers; namespace TouchScript.Examples.Cube { diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs index 87722c8c3..97a5d1eed 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs @@ -3,6 +3,7 @@ using TouchScript.Gestures; using TouchScript.Hit; using TouchScript.InputSources; +using TouchScript.Pointers; namespace TouchScript.Examples.Cube { diff --git a/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs b/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs index 8495bffd0..7ab48b514 100644 --- a/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs +++ b/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs @@ -5,6 +5,7 @@ #if UNITY_EDITOR || UNITY_STANDALONE || UNITY_IOS || UNITY_ANDROID using System; using System.Collections.Generic; +using TouchScript.Pointers; using TUIOsharp; using TUIOsharp.DataProcessors; using TUIOsharp.Entities; diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/TouchScriptInputModule.cs b/Source/Assets/TouchScript/Scripts/Behaviors/TouchScriptInputModule.cs index dcf5a4d94..b1f7e6ef4 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/TouchScriptInputModule.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/TouchScriptInputModule.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Text; +using TouchScript.Pointers; using UnityEngine; using UnityEngine.EventSystems; diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs index e7512e25b..e1b22d5a6 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs @@ -3,6 +3,7 @@ */ using System.Text; +using TouchScript.Pointers; using UnityEngine; using UnityEngine.UI; diff --git a/Source/Assets/TouchScript/Scripts/Clusters/Clusters.cs b/Source/Assets/TouchScript/Scripts/Clusters/Clusters.cs index f0b6d9a55..d4752a99c 100644 --- a/Source/Assets/TouchScript/Scripts/Clusters/Clusters.cs +++ b/Source/Assets/TouchScript/Scripts/Clusters/Clusters.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using TouchScript.Utils; +using TouchScript.Pointers; using UnityEngine; namespace TouchScript.Clusters diff --git a/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs b/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs index 54faa5e7f..c1e820175 100644 --- a/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using TouchScript.Gestures; using TouchScript.Utils; +using TouchScript.Pointers; using UnityEngine; namespace TouchScript diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Base/PinnedTransformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/Base/PinnedTransformGestureBase.cs index 82efd05e2..426391b67 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Base/PinnedTransformGestureBase.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Base/PinnedTransformGestureBase.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using TouchScript.Utils; +using TouchScript.Pointers; using UnityEngine; #if TOUCHSCRIPT_DEBUG diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs index e8c8497f2..0fe272ee8 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs @@ -7,6 +7,7 @@ using TouchScript.Layers; using TouchScript.Utils; using TouchScript.Utils.Geom; +using TouchScript.Pointers; using UnityEngine; #if TOUCHSCRIPT_DEBUG diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredPinnedTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredPinnedTransformGesture.cs index af4c04f78..2479ed0f2 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredPinnedTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredPinnedTransformGesture.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using TouchScript.Utils; +using TouchScript.Pointers; using UnityEngine; namespace TouchScript.Gestures.Clustered diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredScreenTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredScreenTransformGesture.cs index c91660f57..94f9f6015 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredScreenTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredScreenTransformGesture.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using TouchScript.Utils; +using TouchScript.Pointers; using UnityEngine; namespace TouchScript.Gestures.Clustered diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredTransformGesture.cs index ab28e336f..f5832ce6d 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredTransformGesture.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using TouchScript.Utils; +using TouchScript.Pointers; using UnityEngine; namespace TouchScript.Gestures.Clustered diff --git a/Source/Assets/TouchScript/Scripts/Gestures/FlickGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/FlickGesture.cs index 79785c7b5..63d31b05b 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/FlickGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/FlickGesture.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using TouchScript.Utils; +using TouchScript.Pointers; using UnityEngine; namespace TouchScript.Gestures diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs index 9ca24a9d9..4ceb450af 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs @@ -9,6 +9,7 @@ using TouchScript.Layers; using TouchScript.Utils; using TouchScript.Utils.Attributes; +using TouchScript.Pointers; using UnityEngine; namespace TouchScript.Gestures diff --git a/Source/Assets/TouchScript/Scripts/Gestures/IGestureDelegate.cs b/Source/Assets/TouchScript/Scripts/Gestures/IGestureDelegate.cs index b7c269a10..319b67ff0 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/IGestureDelegate.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/IGestureDelegate.cs @@ -3,6 +3,7 @@ */ using TouchScript.Gestures; +using TouchScript.Pointers; namespace TouchScript { diff --git a/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs index ecd208ce3..22fc570fd 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using TouchScript.Utils; using TouchScript.Utils.Attributes; +using TouchScript.Pointers; using UnityEngine; namespace TouchScript.Gestures diff --git a/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs index 81f02b716..b173af864 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using TouchScript.Utils; +using TouchScript.Pointers; using UnityEngine; namespace TouchScript.Gestures diff --git a/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs index 49fe99107..341fa7b95 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs @@ -6,6 +6,7 @@ using TouchScript.Gestures.Base; using TouchScript.Layers; using TouchScript.Utils.Geom; +using TouchScript.Pointers; #if TOUCHSCRIPT_DEBUG using TouchScript.Utils.Debug; #endif diff --git a/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs index 8746354ae..fc82905b2 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using TouchScript.Utils; using TouchScript.Utils.Attributes; +using TouchScript.Pointers; using UnityEngine; namespace TouchScript.Gestures diff --git a/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs index 604a4b0cb..3e659181f 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using TouchScript.Utils; using TouchScript.Utils.Attributes; +using TouchScript.Pointers; using UnityEngine; namespace TouchScript.Gestures diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs index ff1c5ad64..02e9ad618 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using TouchScript.Utils; using TouchScript.Utils.Attributes; +using TouchScript.Pointers; using UnityEngine; namespace TouchScript.Gestures diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs index b6a436ed8..73c7c1488 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs @@ -6,6 +6,7 @@ using TouchScript.Gestures.Base; using TouchScript.Layers; using TouchScript.Utils; +using TouchScript.Pointers; #if TOUCHSCRIPT_DEBUG using TouchScript.Utils.Debug; #endif diff --git a/Source/Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs index e71216833..88263f1a4 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using TouchScript.Utils; +using TouchScript.Pointers; using UnityEngine; using UnityEngine.EventSystems; diff --git a/Source/Assets/TouchScript/Scripts/ITouchManager.cs b/Source/Assets/TouchScript/Scripts/ITouchManager.cs index 2312262b0..8307e3928 100644 --- a/Source/Assets/TouchScript/Scripts/ITouchManager.cs +++ b/Source/Assets/TouchScript/Scripts/ITouchManager.cs @@ -8,6 +8,7 @@ using TouchScript.Hit; using TouchScript.InputSources; using TouchScript.Layers; +using TouchScript.Pointers; using UnityEngine; namespace TouchScript diff --git a/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs b/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs index 235f133d6..234c5cd95 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs @@ -2,6 +2,8 @@ * @author Valentin Simonov / http://va.lent.in/ */ +using TouchScript.Pointers; + namespace TouchScript.InputSources { /// diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs index 854fb91f0..451be30bc 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs @@ -3,6 +3,7 @@ */ using System; +using TouchScript.Pointers; using UnityEngine; namespace TouchScript.InputSources.InputHandlers diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs index ab27a45d5..2109b88df 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; +using TouchScript.Pointers; using UnityEngine; namespace TouchScript.InputSources.InputHandlers diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs index 0de448385..687c0c06d 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs @@ -9,6 +9,7 @@ using System; using System.Collections.Generic; using System.Runtime.InteropServices; +using TouchScript.Pointers; using UnityEngine; namespace TouchScript.InputSources.InputHandlers @@ -363,7 +364,7 @@ private void getNativeMonitorResolution(out int width, out int height) } } - #region p/invoke +#region p/invoke public const int WM_CLOSE = 0x0010; public const int WM_TOUCH = 0x0240; @@ -581,7 +582,7 @@ public static extern bool GetTouchInputInfo(IntPtr hTouchInput, int cInputs, [Ou [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam); - #endregion +#endregion } /// diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs index 149168225..7bf00e27c 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.Pointers; using UnityEngine; namespace TouchScript.InputSources diff --git a/Source/Assets/TouchScript/Scripts/InputSources/MobileInput.cs b/Source/Assets/TouchScript/Scripts/InputSources/MobileInput.cs index 4162cd2ac..6e8c299af 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/MobileInput.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/MobileInput.cs @@ -4,8 +4,9 @@ */ using TouchScript.Utils.Attributes; -using UnityEngine; +using TouchScript.Pointers; using TouchScript.InputSources.InputHandlers; +using UnityEngine; namespace TouchScript.InputSources { diff --git a/Source/Assets/TouchScript/Scripts/InputSources/MouseInput.cs b/Source/Assets/TouchScript/Scripts/InputSources/MouseInput.cs index 8282a8c39..5172dc197 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/MouseInput.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/MouseInput.cs @@ -3,8 +3,9 @@ */ using TouchScript.Utils.Attributes; -using UnityEngine; +using TouchScript.Pointers; using TouchScript.InputSources.InputHandlers; +using UnityEngine; namespace TouchScript.InputSources { diff --git a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs index f3fb87064..876471a05 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs @@ -6,6 +6,7 @@ using System; #endif using TouchScript.InputSources.InputHandlers; +using TouchScript.Pointers; using UnityEngine; namespace TouchScript.InputSources diff --git a/Source/Assets/TouchScript/Scripts/Layers/ILayerDelegate.cs b/Source/Assets/TouchScript/Scripts/Layers/ILayerDelegate.cs index a3588c340..71855fb87 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/ILayerDelegate.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/ILayerDelegate.cs @@ -2,6 +2,8 @@ * @author Valentin Simonov / http://va.lent.in/ */ +using TouchScript.Pointers; + namespace TouchScript.Layers { /// diff --git a/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs index 6671e7f7b..00911e70c 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs @@ -7,6 +7,7 @@ using TouchScript.Utils; using UnityEngine; using System.Collections; +using TouchScript.Pointers; namespace TouchScript.Layers { diff --git a/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs b/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs index 62868bd7d..f3c902dfc 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs @@ -6,6 +6,7 @@ using System.Collections; using System.Collections.Generic; using TouchScript.Hit; +using TouchScript.Pointers; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; diff --git a/Source/Assets/TouchScript/Scripts/Pointers.meta b/Source/Assets/TouchScript/Scripts/Pointers.meta new file mode 100644 index 000000000..2c3e39723 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Pointers.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b511f0050fd1e4bdc9acaf7d90868785 +folderAsset: yes +timeCreated: 1467463752 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Pointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs similarity index 99% rename from Source/Assets/TouchScript/Scripts/Pointer.cs rename to Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs index 45f464834..ff3d814f3 100644 --- a/Source/Assets/TouchScript/Scripts/Pointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs @@ -8,7 +8,7 @@ using TouchScript.Layers; using UnityEngine; -namespace TouchScript +namespace TouchScript.Pointers { /// /// Representation of a pointer (touch, mouse) within TouchScript. diff --git a/Source/Assets/TouchScript/Scripts/Pointer.cs.meta b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/Pointer.cs.meta rename to Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs index f25433bc2..9364b776a 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs @@ -10,6 +10,7 @@ using TouchScript.InputSources; using TouchScript.Layers; using TouchScript.Utils; +using TouchScript.Pointers; #if TOUCHSCRIPT_DEBUG using TouchScript.Utils.Debug; #endif diff --git a/Source/Assets/TouchScript/Scripts/Utils/ClusterUtils.cs b/Source/Assets/TouchScript/Scripts/Utils/ClusterUtils.cs index 2c75b6c50..0daf363a7 100644 --- a/Source/Assets/TouchScript/Scripts/Utils/ClusterUtils.cs +++ b/Source/Assets/TouchScript/Scripts/Utils/ClusterUtils.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Text; +using TouchScript.Pointers; using UnityEngine; namespace TouchScript.Utils diff --git a/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs b/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs index 7488f37c1..a08a28d1a 100644 --- a/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs +++ b/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs @@ -4,6 +4,7 @@ using TouchScript.Hit; using TouchScript.Layers; +using TouchScript.Pointers; using UnityEngine; namespace TouchScript.Utils From 09d2217d5cf8e7d84894fa9033be1cbf015b3595 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sat, 2 Jul 2016 16:55:01 +0300 Subject: [PATCH 009/211] ObjectPool now requires a function which creates elements. --- Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs b/Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs index 354db7198..d8dcae58c 100644 --- a/Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs +++ b/Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs @@ -4,12 +4,13 @@ * https://bitbucket.org/Unity-Technologies/ui/src/ccb946ecc23815d1a7099aee0ed77b0cde7ff278/UnityEngine.UI/UI/Core/Utility/ObjectPool.cs?at=5.1 */ +using System; using System.Collections.Generic; using UnityEngine.Events; namespace TouchScript.Utils { - internal class ObjectPool where T : new() + internal class ObjectPool where T : class { public delegate T0 UnityFunc(); @@ -33,6 +34,7 @@ public int CountInactive public ObjectPool(int capacity, UnityFunc actionNew, UnityAction actionOnGet, UnityAction actionOnRelease) { + if (actionNew == null) throw new ArgumentException("New action can't be null!"); stack = new Stack(capacity); onNew = actionNew; onGet = actionOnGet; @@ -43,9 +45,7 @@ public void WarmUp(int count) { for (var i = 0; i < count; i++) { - T element; - if (onNew != null) element = onNew(); - else element = new T(); + var element = onNew(); CountAll++; stack.Push(element); } @@ -56,8 +56,7 @@ public T Get() T element; if (stack.Count == 0) { - if (onNew != null) element = onNew(); - else element = new T(); + element = onNew(); CountAll++; } else From f4bedbbaeb889dffd09ec92da64d2d90bb6013c7 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sat, 2 Jul 2016 19:45:08 +0300 Subject: [PATCH 010/211] - Added 4 types of pointers: touch, mouse, pen, object. - Moved pointer cache logic to inputs. - Moved CoordinatesRemapper from IInputSource to IRemapableInputSource. - Touch/Mouse/Windows handlers are now IInputSource and manage their pointers themselves. - Pointers are now created with a reference to the input source they belong to. --- .../Examples/Cube/Scripts/RedirectInput.cs | 60 ++--- .../TUIO/Scripts/InputSources/TuioInput.cs | 123 ++++++---- .../Scripts/InputSources/IInputSource.cs | 25 ++- .../InputHandlers/MouseHandler.cs | 95 ++++---- .../InputHandlers/TouchHandler.cs | 34 ++- .../InputHandlers/WindowsPointerHandlers.cs | 211 ++++++++++++++---- .../Scripts/InputSources/InputSource.cs | 33 ++- .../Scripts/InputSources/MobileInput.cs | 9 +- .../Scripts/InputSources/MouseInput.cs | 9 +- .../Scripts/InputSources/StandardInput.cs | 14 +- .../Scripts/Pointers/MousePointer.cs | 18 ++ .../Scripts/Pointers/MousePointer.cs.meta | 12 + .../Scripts/Pointers/ObjectPointer.cs | 18 ++ .../Scripts/Pointers/ObjectPointer.cs.meta | 12 + .../Scripts/Pointers/PenPointer.cs | 18 ++ .../Scripts/Pointers/PenPointer.cs.meta | 12 + .../TouchScript/Scripts/Pointers/Pointer.cs | 33 ++- .../Scripts/Pointers/TouchPointer.cs | 18 ++ .../Scripts/Pointers/TouchPointer.cs.meta | 12 + .../Scripts/TouchManagerInstance.cs | 27 +-- .../TouchScript/Scripts/Utils/ObjectPool.cs | 2 +- 21 files changed, 578 insertions(+), 217 deletions(-) create mode 100644 Source/Assets/TouchScript/Scripts/Pointers/MousePointer.cs create mode 100644 Source/Assets/TouchScript/Scripts/Pointers/MousePointer.cs.meta create mode 100644 Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs create mode 100644 Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs.meta create mode 100644 Source/Assets/TouchScript/Scripts/Pointers/PenPointer.cs create mode 100644 Source/Assets/TouchScript/Scripts/Pointers/PenPointer.cs.meta create mode 100644 Source/Assets/TouchScript/Scripts/Pointers/TouchPointer.cs create mode 100644 Source/Assets/TouchScript/Scripts/Pointers/TouchPointer.cs.meta diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs index 97a5d1eed..443c5c0a3 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs @@ -16,17 +16,19 @@ public class RedirectInput : InputSource private MetaGesture gesture; private Dictionary map = new Dictionary(); - public override void CancelPointer(Pointer pointer, bool @return) + public override bool CancelPointer(Pointer pointer, bool @return) { base.CancelPointer(pointer, @return); - - map.Remove(pointer.Id); - if (@return) - { - TouchHit hit; - if (!gesture.GetTargetHitResult(pointer.Position, out hit)) return; - map.Add(pointer.Id, beginPointer(processCoords(hit.RaycastHit.textureCoord), pointer.Tags).Id); - } +// +// map.Remove(pointer.Id); +// if (@return) +// { +// TouchHit hit; +// if (!gesture.GetTargetHitResult(pointer.Position, out hit)) return true; +// beginPointer(pointer, processCoords(hit.RaycastHit.textureCoord), false) +// map.Add(pointer.Id, .Id); +// } + return true; } protected override void OnEnable() @@ -62,38 +64,38 @@ private Vector2 processCoords(Vector2 value) private void pointerBeganHandler(object sender, MetaGestureEventArgs metaGestureEventArgs) { - var pointer = metaGestureEventArgs.Pointer; - if (pointer.InputSource == this) return; - map.Add(pointer.Id, beginPointer(processCoords(pointer.Hit.RaycastHit.textureCoord), pointer.Tags).Id); +// var pointer = metaGestureEventArgs.Pointer; +// if (pointer.InputSource == this) return; +// map.Add(pointer.Id, beginPointer(processCoords(pointer.Hit.RaycastHit.textureCoord), pointer.Tags).Id); } private void pointerMovedhandler(object sender, MetaGestureEventArgs metaGestureEventArgs) { - int id; - TouchHit hit; - var pointer = metaGestureEventArgs.Pointer; - if (pointer.InputSource == this) return; - if (!map.TryGetValue(pointer.Id, out id)) return; - if (!gesture.GetTargetHitResult(pointer.Position, out hit)) return; - movePointer(id, processCoords(hit.RaycastHit.textureCoord)); +// int id; +// TouchHit hit; +// var pointer = metaGestureEventArgs.Pointer; +// if (pointer.InputSource == this) return; +// if (!map.TryGetValue(pointer.Id, out id)) return; +// if (!gesture.GetTargetHitResult(pointer.Position, out hit)) return; +// movePointer(id, processCoords(hit.RaycastHit.textureCoord)); } private void pointerEndedHandler(object sender, MetaGestureEventArgs metaGestureEventArgs) { - int id; - var pointer = metaGestureEventArgs.Pointer; - if (pointer.InputSource == this) return; - if (!map.TryGetValue(pointer.Id, out id)) return; - endPointer(id); +// int id; +// var pointer = metaGestureEventArgs.Pointer; +// if (pointer.InputSource == this) return; +// if (!map.TryGetValue(pointer.Id, out id)) return; +// endPointer(id); } private void pointerCancelledhandler(object sender, MetaGestureEventArgs metaGestureEventArgs) { - int id; - var pointer = metaGestureEventArgs.Pointer; - if (pointer.InputSource == this) return; - if (!map.TryGetValue(pointer.Id, out id)) return; - cancelPointer(id); +// int id; +// var pointer = metaGestureEventArgs.Pointer; +// if (pointer.InputSource == this) return; +// if (!map.TryGetValue(pointer.Id, out id)) return; +// cancelPointer(id); } } diff --git a/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs b/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs index 7ab48b514..7b89ec168 100644 --- a/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs +++ b/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs @@ -6,12 +6,13 @@ using System; using System.Collections.Generic; using TouchScript.Pointers; +using TouchScript.Utils; using TUIOsharp; using TUIOsharp.DataProcessors; using TUIOsharp.Entities; using UnityEngine; -namespace TouchScript.InputSources +namespace TouchScript.InputSources { /// /// Processes TUIO 1.1 input. @@ -146,6 +147,19 @@ public Tags ObjectTags private int screenWidth; private int screenHeight; + private ObjectPool touchPool; + private ObjectPool objectPool; + + #endregion + + #region Constructor + + 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()); + } + #endregion #region Public methods @@ -159,82 +173,100 @@ public override void UpdateInput() } /// - public override void CancelPointer(Pointer pointer, bool @return) + public override bool CancelPointer(Pointer pointer, bool @return) { base.CancelPointer(pointer, @return); lock (this) { - TuioCursor cursor = null; - foreach (var touchPoint in cursorToInternalId) - { - if (touchPoint.Value.Id == pointer.Id) - { - cursor = touchPoint.Key; - break; - } - } - if (cursor != null) + if (pointer.Type == Pointer.PointerType.Touch) { - cancelPointer(pointer.Id); - if (@return) + TuioCursor cursor = null; + foreach (var touchPoint in cursorToInternalId) { - cursorToInternalId[cursor] = beginPointer(pointer.Position, pointer.Tags, false); + if (touchPoint.Value.Id == pointer.Id) + { + cursor = touchPoint.Key; + break; + } } - else + if (cursor != null) { - cursorToInternalId.Remove(cursor); + cancelPointer(pointer.Id); + if (@return) + { + cursorToInternalId[cursor] = internalBeginTouch(pointer.Position, false); + } + else + { + cursorToInternalId.Remove(cursor); + } + return true; } - return; + return false; } - TuioBlob blob = null; - foreach (var touchPoint in blobToInternalId) + TuioObject obj = null; + foreach (var touchPoint in objectToInternalId) { if (touchPoint.Value.Id == pointer.Id) { - blob = touchPoint.Key; + obj = touchPoint.Key; break; } } - if (blob != null) + if (obj != null) { cancelPointer(pointer.Id); if (@return) { - var t = beginPointer(pointer.Position, pointer.Tags, false); - t.Properties = pointer.Properties; - blobToInternalId[blob] = t; + objectToInternalId[obj] = internalBeginObject(pointer.Position, false); } else { - blobToInternalId.Remove(blob); + objectToInternalId.Remove(obj); } - return; + return true; } - TuioObject obj = null; - foreach (var touchPoint in objectToInternalId) + TuioBlob blob = null; + foreach (var touchPoint in blobToInternalId) { if (touchPoint.Value.Id == pointer.Id) { - obj = touchPoint.Key; + blob = touchPoint.Key; break; } } - if (obj != null) + if (blob != null) { cancelPointer(pointer.Id); if (@return) { - var t = beginPointer(pointer.Position, pointer.Tags, false); - t.Properties = pointer.Properties; - objectToInternalId[obj] = t; + blobToInternalId[blob] = internalBeginObject(pointer.Position, false); } else { - objectToInternalId.Remove(obj); + blobToInternalId.Remove(blob); } + return true; } + + return false; + } + } + + #endregion + + #region Internal methods + + public override void INTERNAL_ReleasePointer(Pointer pointer) + { + if (pointer.Type == Pointer.PointerType.Touch) + { + touchPool.Release(pointer as TouchPointer); + } else if (pointer.Type == Pointer.PointerType.Object) + { + objectPool.Release(pointer as ObjectPointer); } } @@ -279,6 +311,20 @@ protected override void OnDisable() #region Private functions + private Pointer internalBeginTouch(Vector2 position, bool remap = true) + { + var pointer = touchPool.Get(); + beginPointer(pointer, position, remap); + return pointer; + } + + private Pointer internalBeginObject(Vector2 position, bool remap = true) + { + var pointer = objectPool.Get(); + beginPointer(pointer, position, remap); + return pointer; + } + private void connect() { if (!Application.isPlaying) return; @@ -359,7 +405,7 @@ private void OnCursorAdded(object sender, TuioCursorEventArgs e) { var x = entity.X * screenWidth; var y = (1 - entity.Y) * screenHeight; - cursorToInternalId.Add(entity, beginPointer(new Vector2(x, y), CursorTags)); + cursorToInternalId.Add(entity, internalBeginTouch(new Vector2(x, y))); } } @@ -398,7 +444,7 @@ private void OnBlobAdded(object sender, TuioBlobEventArgs e) { var x = entity.X * screenWidth; var y = (1 - entity.Y) * screenHeight; - var touch = beginPointer(new Vector2(x, y), BlobTags); + var touch = internalBeginObject(new Vector2(x, y)); updateBlobProperties(touch, entity); blobToInternalId.Add(entity, touch); } @@ -440,7 +486,8 @@ private void OnObjectAdded(object sender, TuioObjectEventArgs e) { var x = entity.X * screenWidth; var y = (1 - entity.Y) * screenHeight; - var touch = beginPointer(new Vector2(x, y), new Tags(ObjectTags, getTagById(entity.ClassId))); + var touch = internalBeginObject(new Vector2(x, y)); + // , new Tags(ObjectTags, getTagById(entity.ClassId)) updateObjectProperties(touch, entity); objectToInternalId.Add(entity, touch); } diff --git a/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs b/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs index 234c5cd95..b6ee650fb 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs @@ -13,14 +13,8 @@ namespace TouchScript.InputSources /// In TouchScript all pointer points () come from input sources. /// If you want to feed pointers to the library the best way to do it is to create a custom input source. /// - public interface IInputSource + public interface IInputSource : INTERNAL_IInputSource { - /// - /// Gets or sets current coordinates remapper. - /// - /// An object used to change coordinates of pointer points coming from this input source. - ICoordinatesRemapper CoordinatesRemapper { get; set; } - /// /// This method is called by to synchronously update the input. /// @@ -31,6 +25,21 @@ public interface IInputSource /// /// The pointer. /// if set to true returns the pointer back to the system with different id. - void CancelPointer(Pointer pointer, bool @return); + /// True if the pointer belongs to this Input and was successfully cancelled; false otherwise. + bool CancelPointer(Pointer pointer, bool @return); + } + + public interface IRemapableInputSource + { + /// + /// Gets or sets current coordinates remapper. + /// + /// An object used to change coordinates of pointer points coming from this input source. + ICoordinatesRemapper CoordinatesRemapper { get; set; } + } + + public interface INTERNAL_IInputSource + { + void INTERNAL_ReleasePointer(Pointer pointer); } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs index 451be30bc..c0a61f7f0 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs @@ -11,18 +11,21 @@ namespace TouchScript.InputSources.InputHandlers /// /// Unity mouse handling implementation which can be embedded and controlled from other (input) classes. /// - public class MouseHandler : IDisposable + public class MouseHandler : IInputSource, IDisposable { + #region Public properties + + #endregion + #region Private variables - private Func beginPointer; + private Action beginPointer; private Action movePointer; private Action endPointer; private Action cancelPointer; + private MousePointer mousePointer, fakeMousePointer; private Tags tags; - private int mousePointId = -1; - private int fakeMousePointId = -1; private Vector3 mousePointPos = Vector3.zero; #endregion @@ -35,7 +38,7 @@ public class MouseHandler : IDisposable /// A function called when a pointer is moved. As this function must accept an int id and a Vector2 position. /// A function called when a pointer is lifted off. As this function must accept an int id. /// A function called when a pointer is cancelled. As this function must accept an int id. - public MouseHandler(Tags tags, Func beginPointer, Action movePointer, Action endPointer, Action cancelPointer) + public MouseHandler(Tags tags, Action beginPointer, Action movePointer, Action endPointer, Action cancelPointer) { this.tags = tags; this.beginPointer = beginPointer; @@ -43,8 +46,8 @@ public MouseHandler(Tags tags, Func beginPointer, this.endPointer = endPointer; this.cancelPointer = cancelPointer; - mousePointId = -1; - fakeMousePointId = -1; + mousePointer = new MousePointer(this); + fakeMousePointer = new MousePointer(this); } #region Public methods @@ -54,22 +57,20 @@ public MouseHandler(Tags tags, Func beginPointer, /// public void EndPointers() { - if (mousePointId != -1) + if (mousePointer.Id != Pointer.INVALID_POINTER) { - endPointer(mousePointId); - mousePointId = -1; + endPointer(mousePointer.Id); } - if (fakeMousePointId != -1) + if (fakeMousePointer.Id != Pointer.INVALID_POINTER) { - endPointer(fakeMousePointId); - fakeMousePointId = -1; + endPointer(fakeMousePointer.Id); } } /// /// Updates this instance. /// - public void Update() + public void UpdateInput() { // If mouse button was pressed and released during the same frame, // we need to figure out what happened first. @@ -77,27 +78,25 @@ public void Update() if (Input.GetMouseButtonUp(0)) { // Release happened first? - if (mousePointId != -1) + if (mousePointer.Id != Pointer.INVALID_POINTER) { - endPointer(mousePointId); - mousePointId = -1; + endPointer(mousePointer.Id); upHandled = true; } } // Need to end fake pointer - if (fakeMousePointId > -1 && !(Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt))) + if (fakeMousePointer.Id != Pointer.INVALID_POINTER && !(Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt))) { - endPointer(fakeMousePointId); - fakeMousePointId = -1; + endPointer(fakeMousePointer.Id); } if (Input.GetMouseButtonDown(0)) { var pos = Input.mousePosition; - if ((Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt)) && fakeMousePointId == -1) - fakeMousePointId = beginPointer(new Vector2(pos.x, pos.y), tags, true).Id; - else if (mousePointId == -1) mousePointId = beginPointer(new Vector2(pos.x, pos.y), tags, true).Id; + if ((Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt)) && fakeMousePointer.Id == Pointer.INVALID_POINTER) + beginPointer(fakeMousePointer, new Vector2(pos.x, pos.y), true); + else if (mousePointer.Id == Pointer.INVALID_POINTER) beginPointer(mousePointer, new Vector2(pos.x, pos.y), true); } else if (Input.GetMouseButton(0)) { @@ -105,38 +104,35 @@ public void Update() if (mousePointPos != pos) { mousePointPos = pos; - if (fakeMousePointId != -1) + if (fakeMousePointer.Id != Pointer.INVALID_POINTER) { - if (mousePointId == -1) movePointer(fakeMousePointId, new Vector2(pos.x, pos.y)); - else movePointer(mousePointId, new Vector2(pos.x, pos.y)); + if (mousePointer.Id == Pointer.INVALID_POINTER) movePointer(fakeMousePointer.Id, new Vector2(pos.x, pos.y)); + else movePointer(mousePointer.Id, new Vector2(pos.x, pos.y)); } - else if (mousePointId != -1) movePointer(mousePointId, new Vector2(pos.x, pos.y)); + else if (mousePointer.Id != Pointer.INVALID_POINTER) movePointer(mousePointer.Id, new Vector2(pos.x, pos.y)); } } // Release mouse if we haven't done it yet - if (Input.GetMouseButtonUp(0) && !upHandled && mousePointId != -1) + if (Input.GetMouseButtonUp(0) && !upHandled && mousePointer.Id != Pointer.INVALID_POINTER) { - endPointer(mousePointId); - mousePointId = -1; + endPointer(mousePointer.Id); } } /// public bool CancelPointer(Pointer pointer, bool @return) { - if (pointer.Id == mousePointId) + if (pointer.Equals(mousePointer)) { - cancelPointer(mousePointId); - if (@return) mousePointId = beginPointer(pointer.Position, tags, false).Id; - else mousePointId = -1; + cancelPointer(mousePointer.Id); + if (@return) beginPointer(mousePointer, pointer.Position, false); return true; } - if (pointer.Id == fakeMousePointId) + else if (pointer.Equals(fakeMousePointer)) { - cancelPointer(fakeMousePointId); - if (@return) fakeMousePointId = beginPointer(pointer.Position, tags, false).Id; - else fakeMousePointId = -1; + cancelPointer(fakeMousePointer.Id); + if (@return) beginPointer(fakeMousePointer, pointer.Position, false); return true; } return false; @@ -145,10 +141,29 @@ public bool CancelPointer(Pointer pointer, bool @return) /// public void Dispose() { - if (mousePointId != -1) cancelPointer(mousePointId); - if (fakeMousePointId != -1) cancelPointer(fakeMousePointId); + if (mousePointer.Id != Pointer.INVALID_POINTER) cancelPointer(mousePointer.Id); + if (fakeMousePointer.Id != Pointer.INVALID_POINTER) cancelPointer(fakeMousePointer.Id); } #endregion + + #region Internal methods + + public void INTERNAL_ReleasePointer(Pointer pointer) + { + if (pointer.Equals(mousePointer)) + { + mousePointer.INTERNAL_Reset(); + } else if (pointer.Equals(fakeMousePointer)) + { + fakeMousePointer.INTERNAL_Reset(); + } + } + + #endregion + + #region Private functions + + #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 2109b88df..890a13db9 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs @@ -6,6 +6,7 @@ using System; using System.Collections.Generic; using TouchScript.Pointers; +using TouchScript.Utils; using UnityEngine; namespace TouchScript.InputSources.InputHandlers @@ -13,7 +14,7 @@ namespace TouchScript.InputSources.InputHandlers /// /// Unity touch handling implementation which can be embedded and controlled from other (input) classes. /// - public class TouchHandler : IDisposable + public class TouchHandler : IInputSource, IDisposable { #region Public properties @@ -30,11 +31,12 @@ public bool HasPointers #region Private variables - private Func beginPointer; + private Action beginPointer; private Action movePointer; private Action endPointer; private Action cancelPointer; + private ObjectPool pointerPool; private Tags tags; private Dictionary systemToInternalId = new Dictionary(); private int pointersNum; @@ -49,13 +51,15 @@ public bool HasPointers /// A function called when a pointer is moved. As this function must accept an int id and a Vector2 position. /// A function called when a pointer is lifted off. As this function must accept an int id. /// A function called when a pointer is cancelled. As this function must accept an int id. - public TouchHandler(Tags tags, Func beginPointer, Action movePointer, Action endPointer, Action cancelPointer) + public TouchHandler(Tags tags, Action beginPointer, Action movePointer, Action endPointer, Action cancelPointer) { this.tags = tags; this.beginPointer = beginPointer; this.movePointer = movePointer; this.endPointer = endPointer; this.cancelPointer = cancelPointer; + + pointerPool = new ObjectPool(10, () => new TouchPointer(this), null, (t) => t.INTERNAL_Reset()); } #region Public methods @@ -63,7 +67,7 @@ public TouchHandler(Tags tags, Func beginPointer, /// /// Updates this instance. /// - public void Update() + public void UpdateInput() { for (var i = 0; i < Input.touchCount; ++i) { @@ -147,8 +151,8 @@ public bool CancelPointer(Pointer pointer, bool @return) { if (@return) { - cancelPointer(pointer.Id); - systemToInternalId[fingerId] = new TouchState(beginPointer(pointer.Position, pointer.Tags, false).Id); + internalCancelPointer(pointer.Id); + systemToInternalId[fingerId] = new TouchState(internalBeginPointer(pointer.Position, false).Id); } else { @@ -172,12 +176,26 @@ public void Dispose() #endregion + #region Internal methods + + public void INTERNAL_ReleasePointer(Pointer pointer) + { + var touchPointer = pointer as TouchPointer; + if (touchPointer == null) return; + + pointerPool.Release(touchPointer); + } + + #endregion + #region Private functions - private Pointer internalBeginPointer(Vector2 position) + private Pointer internalBeginPointer(Vector2 position, bool remap = true) { pointersNum++; - return beginPointer(position, tags, true); + var pointer = pointerPool.Get(); + beginPointer(pointer, position, remap); + return pointer; } private void internalEndPointer(int id) diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs index 687c0c06d..88ce00f64 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs @@ -10,6 +10,7 @@ using System.Collections.Generic; using System.Runtime.InteropServices; using TouchScript.Pointers; +using TouchScript.Utils; using UnityEngine; namespace TouchScript.InputSources.InputHandlers @@ -19,18 +20,57 @@ namespace TouchScript.InputSources.InputHandlers /// public class Windows8PointerHandler : WindowsPointerHandler { - private Tags mouseTags, touchTags, penTags; + private MousePointer mousePointer; + private PenPointer penPointer; /// - public Windows8PointerHandler(Tags touchTags, Tags mouseTags, Tags penTags, Func beginPointer, Action movePointer, Action endPointer, Action cancelPointer) : base(touchTags, beginPointer, movePointer, endPointer, cancelPointer) + public Windows8PointerHandler(Tags touchTags, Tags mouseTags, Tags penTags, Action beginPointer, Action movePointer, Action endPointer, Action cancelPointer) : base(touchTags, beginPointer, movePointer, endPointer, cancelPointer) { this.mouseTags = mouseTags; this.touchTags = touchTags; this.penTags = penTags; + + mousePointer = new MousePointer(this); + penPointer = new PenPointer(this); + registerWindowProc(wndProcWin8); } + /// + public override bool CancelPointer(Pointer pointer, bool @return) + { + if (pointer.Equals(mousePointer)) + { + cancelPointer(mousePointer.Id); + if (@return) beginPointer(mousePointer, pointer.Position, false); + return true; + } + if (pointer.Equals(penPointer)) + { + cancelPointer(penPointer.Id); + if (@return) beginPointer(penPointer, pointer.Position, false); + return true; + } + return base.CancelPointer(pointer, @return); + } + + #region Internal methods + + public override void INTERNAL_ReleasePointer(Pointer pointer) + { + if (pointer.Equals(mousePointer)) + { + mousePointer.INTERNAL_Reset(); + } else if (pointer.Equals(penPointer)) + { + penPointer.INTERNAL_Reset(); + } + base.INTERNAL_ReleasePointer(pointer); + } + + #endregion + private IntPtr wndProcWin8(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam) { switch (msg) @@ -73,45 +113,82 @@ private void decodeWin8Touches(uint msg, IntPtr wParam, IntPtr lParam) switch (msg) { case WM_POINTERDOWN: + { if ((pointerInfo.pointerFlags & POINTER_FLAG_CANCELLED) == POINTER_FLAG_CANCELLED) break; Tags tags = null; + var position = new Vector2((p.X - offsetX) * scaleX, Screen.height - (p.Y - offsetY) * scaleY); switch (pointerInfo.pointerType) { case POINTER_INPUT_TYPE.PT_MOUSE: tags = mouseTags; + beginPointer(mousePointer, position, true); break; case POINTER_INPUT_TYPE.PT_TOUCH: tags = touchTags; + winTouchToInternalId.Add(pointerId, internalBeginTouchPointer(position).Id); break; case POINTER_INPUT_TYPE.PT_PEN: tags = penTags; + beginPointer(penPointer, position, true); break; } - winToInternalId.Add(pointerId, beginPointer(new Vector2((p.X - offsetX) * scaleX, Screen.height - (p.Y - offsetY) * scaleY), tags, true).Id); + } break; + case WM_POINTERUP: - if (winToInternalId.TryGetValue(pointerId, out existingId)) + { + var id = Pointer.INVALID_POINTER; + switch (pointerInfo.pointerType) { - winToInternalId.Remove(pointerId); - if ((pointerInfo.pointerFlags & POINTER_FLAG_CANCELLED) == POINTER_FLAG_CANCELLED) - cancelPointer(existingId); - else endPointer(existingId); + case POINTER_INPUT_TYPE.PT_MOUSE: + id = mousePointer.Id; + break; + case POINTER_INPUT_TYPE.PT_TOUCH: + if (winTouchToInternalId.TryGetValue(pointerId, out existingId)) + { + winTouchToInternalId.Remove(pointerId); + id = existingId; + } + break; + case POINTER_INPUT_TYPE.PT_PEN: + id = penPointer.Id; + break; + } + if (id != Pointer.INVALID_POINTER) + { + if ((pointerInfo.pointerFlags & POINTER_FLAG_CANCELLED) == POINTER_FLAG_CANCELLED) cancelPointer(id); + else endPointer(id); } + } break; case WM_POINTERUPDATE: - if (winToInternalId.TryGetValue(pointerId, out existingId)) + { + var id = Pointer.INVALID_POINTER; + switch (pointerInfo.pointerType) + { + case POINTER_INPUT_TYPE.PT_MOUSE: + id = mousePointer.Id; + break; + case POINTER_INPUT_TYPE.PT_TOUCH: + if (winTouchToInternalId.TryGetValue(pointerId, out existingId)) id = existingId; + break; + case POINTER_INPUT_TYPE.PT_PEN: + id = penPointer.Id; + break; + } + if (id != Pointer.INVALID_POINTER) { if ((pointerInfo.pointerFlags & POINTER_FLAG_CANCELLED) == POINTER_FLAG_CANCELLED) { - winToInternalId.Remove(pointerId); - cancelPointer(existingId); + if (pointerInfo.pointerType == POINTER_INPUT_TYPE.PT_TOUCH) winTouchToInternalId.Remove(pointerId); + cancelPointer(id); } else { - movePointer(existingId, - new Vector2((p.X - offsetX)*scaleX, Screen.height - (p.Y - offsetY)*scaleY)); + movePointer(id, new Vector2((p.X - offsetX) * scaleX, Screen.height - (p.Y - offsetY) * scaleY)); } } + } break; } } @@ -122,7 +199,7 @@ public class Windows7PointerHandler : WindowsPointerHandler private int touchInputSize; /// - public Windows7PointerHandler(Tags tags, Func beginPointer, Action movePointer, Action endPointer, Action cancelPointer) : base(tags, beginPointer, movePointer, endPointer, cancelPointer) + public Windows7PointerHandler(Tags tags, Action beginPointer, Action movePointer, Action endPointer, Action cancelPointer) : base(tags, beginPointer, movePointer, endPointer, cancelPointer) { touchInputSize = Marshal.SizeOf(typeof (TOUCHINPUT)); RegisterTouchWindow(hMainWindow, 0); @@ -172,33 +249,33 @@ private void decodeWin7Touches(IntPtr wParam, IntPtr lParam) if ((touch.dwFlags & (int) TOUCH_EVENT.TOUCHEVENTF_DOWN) != 0) { POINT p = new POINT(); - p.X = touch.x/100; - p.Y = touch.y/100; + p.X = touch.x / 100; + p.Y = touch.y / 100; ScreenToClient(hMainWindow, ref p); - winToInternalId.Add(touch.dwID, beginPointer(new Vector2((p.X - offsetX)*scaleX, Screen.height - (p.Y - offsetY)*scaleY), tags, true).Id); + winTouchToInternalId.Add(touch.dwID, internalBeginTouchPointer(new Vector2((p.X - offsetX) * scaleX, Screen.height - (p.Y - offsetY) * scaleY)).Id); } else if ((touch.dwFlags & (int) TOUCH_EVENT.TOUCHEVENTF_UP) != 0) { int existingId; - if (winToInternalId.TryGetValue(touch.dwID, out existingId)) + if (winTouchToInternalId.TryGetValue(touch.dwID, out existingId)) { - winToInternalId.Remove(touch.dwID); + winTouchToInternalId.Remove(touch.dwID); endPointer(existingId); } } else if ((touch.dwFlags & (int) TOUCH_EVENT.TOUCHEVENTF_MOVE) != 0) { int existingId; - if (winToInternalId.TryGetValue(touch.dwID, out existingId)) + if (winTouchToInternalId.TryGetValue(touch.dwID, out existingId)) { POINT p = new POINT(); - p.X = touch.x/100; - p.Y = touch.y/100; + p.X = touch.x / 100; + p.Y = touch.y / 100; ScreenToClient(hMainWindow, ref p); movePointer(existingId, - new Vector2((p.X - offsetX)*scaleX, Screen.height - (p.Y - offsetY)*scaleY)); + new Vector2((p.X - offsetX) * scaleX, Screen.height - (p.Y - offsetY) * scaleY)); } } } @@ -207,8 +284,10 @@ private void decodeWin7Touches(IntPtr wParam, IntPtr lParam) } } - public abstract class WindowsPointerHandler : IDisposable + public abstract class WindowsPointerHandler : IInputSource, IDisposable { + #region Consts + /// /// Source of pointer input. /// @@ -226,21 +305,31 @@ public enum PointerSource public delegate IntPtr WndProcDelegate(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam); - protected Func beginPointer; + #endregion + + #region Protected variables + + protected Action beginPointer; protected Action movePointer; protected Action endPointer; protected Action cancelPointer; - protected Tags tags; + protected Tags tags; protected IntPtr hMainWindow; protected IntPtr oldWndProcPtr; protected IntPtr newWndProcPtr; protected WndProcDelegate newWndProc; protected ushort pressAndHoldAtomID; - protected Dictionary winToInternalId = new Dictionary(); + protected Dictionary winTouchToInternalId = new Dictionary(); protected float offsetX, offsetY, scaleX, scaleY; + protected ObjectPool touchPool; + + #endregion + + #region Constructor + /// /// Initializes a new instance of the class. /// @@ -248,7 +337,7 @@ public enum PointerSource /// A function called when a pointer is moved. As this function must accept an int id and a Vector2 position. /// A function called when a pointer is lifted off. As this function must accept an int id. /// A function called when a pointer is cancelled. As this function must accept an int id. - public WindowsPointerHandler(Tags tags, Func beginPointer, Action movePointer, Action endPointer, Action cancelPointer) + public WindowsPointerHandler(Tags tags, Action beginPointer, Action movePointer, Action endPointer, Action cancelPointer) { this.tags = tags; this.beginPointer = beginPointer; @@ -256,27 +345,36 @@ public WindowsPointerHandler(Tags tags, Func begin this.endPointer = endPointer; this.cancelPointer = cancelPointer; + touchPool = new ObjectPool(10, () => new TouchPointer(this), null, (t) => t.INTERNAL_Reset()); + hMainWindow = GetActiveWindow(); disablePressAndHold(); initScaling(); } + #endregion + + #region Public methods + /// - public bool CancelPointer(Pointer pointer, bool @return) + public void UpdateInput() {} + + /// + public virtual bool CancelPointer(Pointer pointer, bool @return) { - int internalId = -1; - foreach (var t in winToInternalId) + int internalTouchId = -1; + foreach (var t in winTouchToInternalId) { if (t.Value == pointer.Id) { - internalId = t.Key; + internalTouchId = t.Key; break; } } - if (internalId > -1) + if (internalTouchId > -1) { cancelPointer(pointer.Id); - if (@return) winToInternalId[internalId] = beginPointer(pointer.Position, pointer.Tags, false).Id; + if (@return) winTouchToInternalId[internalTouchId] = internalBeginTouchPointer(pointer.Position, false).Id; return true; } return false; @@ -285,12 +383,35 @@ public bool CancelPointer(Pointer pointer, bool @return) /// public virtual void Dispose() { - foreach (var i in winToInternalId) cancelPointer(i.Value); + foreach (var i in winTouchToInternalId) cancelPointer(i.Value); enablePressAndHold(); unregisterWindowProc(); } + #endregion + + #region Internal methods + + public virtual void INTERNAL_ReleasePointer(Pointer pointer) + { + var touchPointer = pointer as TouchPointer; + if (touchPointer == null) return; + + touchPool.Release(touchPointer); + } + + #endregion + + #region Protected methods + + protected Pointer internalBeginTouchPointer(Vector2 position, bool remap = true) + { + var pointer = touchPool.Get(); + beginPointer(pointer, position, remap); + return pointer; + } + protected void registerWindowProc(WndProcDelegate windowProc) { newWndProc = windowProc; @@ -340,13 +461,17 @@ protected void initScaling() int width, height; getNativeMonitorResolution(out width, out height); - float scale = Mathf.Max(Screen.width/((float) width), Screen.height/((float) height)); - offsetX = (width - Screen.width/scale)*.5f; - offsetY = (height - Screen.height/scale)*.5f; + float scale = Mathf.Max(Screen.width / ((float) width), Screen.height / ((float) height)); + offsetX = (width - Screen.width / scale) * .5f; + offsetY = (height - Screen.height / scale) * .5f; scaleX = scale; scaleY = scale; } + #endregion + + #region Private functions + private void getNativeMonitorResolution(out int width, out int height) { var monitor = MonitorFromWindow(GetActiveWindow(), MONITOR_DEFAULTTONEAREST); @@ -364,7 +489,9 @@ private void getNativeMonitorResolution(out int width, out int height) } } -#region p/invoke + #endregion + + #region p/invoke public const int WM_CLOSE = 0x0010; public const int WM_TOUCH = 0x0240; @@ -541,7 +668,7 @@ public static IntPtr SetWindowLongPtr(IntPtr hWnd, int nIndex, IntPtr dwNewLong) [DllImport("user32.dll")] public static extern IntPtr CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, uint msg, IntPtr wParam, - IntPtr lParam); + IntPtr lParam); [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] @@ -554,7 +681,7 @@ public static extern IntPtr CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, ui [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool GetTouchInputInfo(IntPtr hTouchInput, int cInputs, [Out] TOUCHINPUT[] pInputs, - int cbSize); + int cbSize); [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] @@ -582,7 +709,7 @@ public static extern bool GetTouchInputInfo(IntPtr hTouchInput, int cInputs, [Ou [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam); -#endregion + #endregion } /// diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs index 7bf00e27c..0f2091828 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs @@ -11,7 +11,7 @@ namespace TouchScript.InputSources /// /// Base class for all pointer input sources. /// - public abstract class InputSource : MonoBehaviour, IInputSource + public abstract class InputSource : MonoBehaviour, IInputSource, IRemapableInputSource { #region Public properties @@ -19,7 +19,11 @@ public abstract class InputSource : MonoBehaviour, IInputSource /// Gets or sets current remapper. /// /// Optional remapper to use to change screen coordinates which go into the TouchManager. - public ICoordinatesRemapper CoordinatesRemapper { get; set; } + public ICoordinatesRemapper CoordinatesRemapper + { + get { return coordinatesRemapper; } + set { coordinatesRemapper = value; } + } #endregion @@ -29,6 +33,7 @@ public abstract class InputSource : MonoBehaviour, IInputSource [HideInInspector] private bool advancedProps; // is used to save whether advanced properties are opened or closed + private ICoordinatesRemapper coordinatesRemapper; private TouchManagerInstance manager; #endregion @@ -39,7 +44,16 @@ public abstract class InputSource : MonoBehaviour, IInputSource public virtual void UpdateInput() {} /// - public virtual void CancelPointer(Pointer pointer, bool @return) {} + public virtual bool CancelPointer(Pointer pointer, bool @return) + { + return false; + } + + #endregion + + #region Internal methods + + public virtual void INTERNAL_ReleasePointer(Pointer pointer) {} #endregion @@ -75,13 +89,11 @@ protected virtual void OnDisable() /// Begin pointer in given screen position. /// /// Screen position. - /// Initial tags. - /// if set to true a can be used on provided coordinates. /// New pointer. - protected virtual Pointer beginPointer(Vector2 position, Tags tags, bool canRemap = true) + protected virtual void beginPointer(Pointer pointer, Vector2 position, bool remap = true) { - if (CoordinatesRemapper != null && canRemap) position = CoordinatesRemapper.Remap(position); - return manager.INTERNAL_BeginPointer(position, this, tags); + if (coordinatesRemapper != null && remap) position = coordinatesRemapper.Remap(position); + manager.INTERNAL_BeginPointer(pointer, position); } /// @@ -100,10 +112,7 @@ protected virtual void updatePointer(int id) /// Screen position. protected virtual void movePointer(int id, Vector2 position) { - if (CoordinatesRemapper != null) - { - position = CoordinatesRemapper.Remap(position); - } + if (coordinatesRemapper != null) position = coordinatesRemapper.Remap(position); manager.INTERNAL_MovePointer(id, position); } diff --git a/Source/Assets/TouchScript/Scripts/InputSources/MobileInput.cs b/Source/Assets/TouchScript/Scripts/InputSources/MobileInput.cs index 6e8c299af..2029979bf 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/MobileInput.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/MobileInput.cs @@ -44,15 +44,14 @@ public override void UpdateInput() { base.UpdateInput(); - if (touchHandler != null) touchHandler.Update(); + if (touchHandler != null) touchHandler.UpdateInput(); } /// - public override void CancelPointer(Pointer pointer, bool @return) + public override bool CancelPointer(Pointer pointer, bool @return) { - base.CancelPointer(pointer, @return); - - if (touchHandler != null) touchHandler.CancelPointer(pointer, @return); + if (touchHandler != null) return touchHandler.CancelPointer(pointer, @return); + return base.CancelPointer(pointer, @return); } #endregion diff --git a/Source/Assets/TouchScript/Scripts/InputSources/MouseInput.cs b/Source/Assets/TouchScript/Scripts/InputSources/MouseInput.cs index 5172dc197..ae151b532 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/MouseInput.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/MouseInput.cs @@ -46,15 +46,14 @@ public override void UpdateInput() { base.UpdateInput(); - mouseHandler.Update(); + mouseHandler.UpdateInput(); } /// - public override void CancelPointer(Pointer pointer, bool @return) + public override bool CancelPointer(Pointer pointer, bool @return) { - base.CancelPointer(pointer, @return); - - if (mouseHandler != null) mouseHandler.CancelPointer(pointer, @return); + if (mouseHandler != null) return mouseHandler.CancelPointer(pointer, @return); + return base.CancelPointer(pointer, @return); } #endregion diff --git a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs index 876471a05..63e00bd3d 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs @@ -150,20 +150,20 @@ public override void UpdateInput() if (touchHandler != null) { - touchHandler.Update(); + touchHandler.UpdateInput(); // Unity adds mouse events from touches resulting in duplicated pointers. // Don't update mouse if pointer input is present. if (mouseHandler != null) { if (touchHandler.HasPointers) mouseHandler.EndPointers(); - else mouseHandler.Update(); + else mouseHandler.UpdateInput(); } } - else if (mouseHandler != null) mouseHandler.Update(); + else if (mouseHandler != null) mouseHandler.UpdateInput(); } /// - public override void CancelPointer(Pointer pointer, bool @return) + public override bool CancelPointer(Pointer pointer, bool @return) { base.CancelPointer(pointer, @return); @@ -172,8 +172,10 @@ public override void CancelPointer(Pointer pointer, bool @return) if (mouseHandler != null && !handled) handled = mouseHandler.CancelPointer(pointer, @return); #if UNITY_STANDALONE_WIN && !UNITY_EDITOR if (windows7PointerHandler != null && !handled) handled = windows7PointerHandler.CancelPointer(pointer, @return); - if (windows8PointerHandler != null && !handled) windows8PointerHandler.CancelPointer(pointer, @return); + if (windows8PointerHandler != null && !handled) handled = windows8PointerHandler.CancelPointer(pointer, @return); #endif + + return handled; } #endregion @@ -357,6 +359,6 @@ private void disableWindows8Touch() } #endif - #endregion +#endregion } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Pointers/MousePointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/MousePointer.cs new file mode 100644 index 000000000..7e156ad7e --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Pointers/MousePointer.cs @@ -0,0 +1,18 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using TouchScript.InputSources; + +namespace TouchScript.Pointers +{ + public class MousePointer : Pointer + { + + public MousePointer(IInputSource input) : base(input) + { + Type = PointerType.Mouse; + } + + } +} diff --git a/Source/Assets/TouchScript/Scripts/Pointers/MousePointer.cs.meta b/Source/Assets/TouchScript/Scripts/Pointers/MousePointer.cs.meta new file mode 100644 index 000000000..6e85ae556 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Pointers/MousePointer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e64c6133ea9544d7a840a578e56d596a +timeCreated: 1467465330 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs new file mode 100644 index 000000000..a53dfe38c --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs @@ -0,0 +1,18 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using TouchScript.InputSources; + +namespace TouchScript.Pointers +{ + public class ObjectPointer : Pointer + { + + public ObjectPointer(IInputSource input) : base(input) + { + Type = PointerType.Mouse; + } + + } +} diff --git a/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs.meta b/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs.meta new file mode 100644 index 000000000..433c71e93 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 64e28c1cdb5fd4afeb8f257057dc4412 +timeCreated: 1467476141 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Pointers/PenPointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/PenPointer.cs new file mode 100644 index 000000000..9e3922c0d --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Pointers/PenPointer.cs @@ -0,0 +1,18 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using TouchScript.InputSources; + +namespace TouchScript.Pointers +{ + public class PenPointer : Pointer + { + + public PenPointer(IInputSource input) : base(input) + { + Type = PointerType.Pen; + } + + } +} diff --git a/Source/Assets/TouchScript/Scripts/Pointers/PenPointer.cs.meta b/Source/Assets/TouchScript/Scripts/Pointers/PenPointer.cs.meta new file mode 100644 index 000000000..3b873ff03 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Pointers/PenPointer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4056d0c49ca0c4b58b8bc68d14a224cd +timeCreated: 1467465330 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs index ff3d814f3..a23e22089 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs @@ -17,6 +17,21 @@ namespace TouchScript.Pointers /// public class Pointer { + + #region Constants + + public const int INVALID_POINTER = -1; + + public enum PointerType + { + Touch, + Mouse, + Pen, + Object + } + + #endregion + #region Public properties /// @@ -24,6 +39,8 @@ public class Pointer /// public int Id { get; private set; } + public PointerType Type { get; protected set; } + /// /// Original hit target. /// @@ -59,7 +76,7 @@ public Vector2 Position /// Original input source which created this pointer. /// /// - public IInputSource InputSource { get; internal set; } + public IInputSource InputSource { get; private set; } /// /// Projection parameters for the layer which created this pointer. @@ -122,9 +139,12 @@ public override int GetHashCode() /// /// Initializes a new instance of the class. /// - public Pointer() + public Pointer(IInputSource input) { + Type = PointerType.Touch; + InputSource = input; properties = new Dictionary(); + INTERNAL_Reset(); } #region Internal methods @@ -134,23 +154,20 @@ public Pointer() /// /// Unique id of the pointer. /// Screen position of the pointer. - /// Input source which created this pointer. - /// Initial tags. - internal void INTERNAL_Init(int id, Vector2 position, IInputSource input, Tags tags) + internal void INTERNAL_Init(int id, Vector2 position) { Id = id; - InputSource = input; this.position = PreviousPosition = newPosition = position; - Tags = tags ?? Tags.EMPTY; } internal void INTERNAL_Reset() { + Id = INVALID_POINTER; refCount = 0; Hit = default(TouchHit); Target = null; Layer = null; - Tags = null; + Tags = Tags.EMPTY; properties.Clear(); } diff --git a/Source/Assets/TouchScript/Scripts/Pointers/TouchPointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/TouchPointer.cs new file mode 100644 index 000000000..ee2b3417e --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Pointers/TouchPointer.cs @@ -0,0 +1,18 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using TouchScript.InputSources; + +namespace TouchScript.Pointers +{ + public class TouchPointer : Pointer + { + + public TouchPointer(IInputSource input) : base(input) + { + Type = PointerType.Touch; + } + + } +} diff --git a/Source/Assets/TouchScript/Scripts/Pointers/TouchPointer.cs.meta b/Source/Assets/TouchScript/Scripts/Pointers/TouchPointer.cs.meta new file mode 100644 index 000000000..0117edc3b --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Pointers/TouchPointer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e33e0ca5e0fd54fc29f2fe19666744e4 +timeCreated: 1467465330 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs index 9364b776a..4524cdf30 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs @@ -205,9 +205,6 @@ public IList ActivePointers private HashSet pointersEnded = new HashSet(); private HashSet pointersCancelled = new HashSet(); - private static ObjectPool pointerPool = new ObjectPool(10, null, null, - (t) => t.INTERNAL_Reset()); - private static ObjectPool> pointerListPool = new ObjectPool>(2, () => new List(10), null, (l) => l.Clear()); @@ -353,21 +350,13 @@ public void CancelPointer(int id) #region Internal methods - internal Pointer INTERNAL_BeginPointer(Vector2 position, IInputSource input) - { - return INTERNAL_BeginPointer(position, input, null); - } - - internal Pointer INTERNAL_BeginPointer(Vector2 position, IInputSource input, Tags tags) + internal void INTERNAL_BeginPointer(Pointer pointer, Vector2 position) { - Pointer pointer; lock (pointerLock) { - pointer = pointerPool.Get(); - pointer.INTERNAL_Init(nextPointerId++, position, input, tags); + pointer.INTERNAL_Init(nextPointerId++, position); pointersBegan.Add(pointer); } - return pointer; } /// @@ -683,7 +672,11 @@ private void updateEnded(List pointers) if (pointersEndedInvoker != null) pointersEndedInvoker.InvokeHandleExceptions(this, PointerEventArgs.GetCachedEventArgs(list)); - for (var i = 0; i < endedCount; i++) pointerPool.Release(list[i]); + for (var i = 0; i < endedCount; i++) + { + var pointer = list[i]; + pointer.InputSource.INTERNAL_ReleasePointer(pointer); + } pointerListPool.Release(list); } @@ -716,7 +709,11 @@ private void updateCancelled(List pointers) if (pointersCancelledInvoker != null) pointersCancelledInvoker.InvokeHandleExceptions(this, PointerEventArgs.GetCachedEventArgs(list)); - for (var i = 0; i < cancelledCount; i++) pointerPool.Release(list[i]); + for (var i = 0; i < cancelledCount; i++) + { + var pointer = list[i]; + pointer.InputSource.INTERNAL_ReleasePointer(pointer); + } pointerListPool.Release(list); } diff --git a/Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs b/Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs index d8dcae58c..35e168b9d 100644 --- a/Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs +++ b/Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs @@ -10,7 +10,7 @@ namespace TouchScript.Utils { - internal class ObjectPool where T : class + public class ObjectPool where T : class { public delegate T0 UnityFunc(); From 5bfb17078a7ec126e66d9eb47eaf0df6974c8dc4 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 3 Jul 2016 02:16:45 +0300 Subject: [PATCH 011/211] Fixed an example. --- .../Examples/Cube/Scripts/RedirectInput.cs | 67 +++++++++++-------- .../Scripts/Pointers/MousePointer.cs | 4 ++ .../Scripts/Pointers/ObjectPointer.cs | 6 +- .../Scripts/Pointers/PenPointer.cs | 4 ++ .../TouchScript/Scripts/Pointers/Pointer.cs | 5 ++ .../Scripts/Pointers/PointerFactory.cs | 29 ++++++++ .../Scripts/Pointers/PointerFactory.cs.meta | 12 ++++ .../Scripts/Pointers/TouchPointer.cs | 4 ++ 8 files changed, 101 insertions(+), 30 deletions(-) create mode 100644 Source/Assets/TouchScript/Scripts/Pointers/PointerFactory.cs create mode 100644 Source/Assets/TouchScript/Scripts/Pointers/PointerFactory.cs.meta diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs index 443c5c0a3..736313bea 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs @@ -19,15 +19,18 @@ public class RedirectInput : InputSource public override bool CancelPointer(Pointer pointer, bool @return) { base.CancelPointer(pointer, @return); -// -// map.Remove(pointer.Id); -// if (@return) -// { -// TouchHit hit; -// if (!gesture.GetTargetHitResult(pointer.Position, out hit)) return true; -// beginPointer(pointer, processCoords(hit.RaycastHit.textureCoord), false) -// map.Add(pointer.Id, .Id); -// } + + map.Remove(pointer.Id); + if (@return) + { + TouchHit hit; + if (gesture.GetTargetHitResult(pointer.Position, out hit)) + { + var newPointer = PointerFactory.Create(pointer.Type, this); + beginPointer(newPointer, processCoords(hit.RaycastHit.textureCoord)); + map.Add(pointer.Id, newPointer.Id); + } + } return true; } @@ -64,38 +67,44 @@ private Vector2 processCoords(Vector2 value) private void pointerBeganHandler(object sender, MetaGestureEventArgs metaGestureEventArgs) { -// var pointer = metaGestureEventArgs.Pointer; -// if (pointer.InputSource == this) return; -// map.Add(pointer.Id, beginPointer(processCoords(pointer.Hit.RaycastHit.textureCoord), pointer.Tags).Id); + var pointer = metaGestureEventArgs.Pointer; + if (pointer.InputSource == this) return; + + var newPointer = PointerFactory.Create(pointer.Type, this); + beginPointer(newPointer, processCoords(pointer.Hit.RaycastHit.textureCoord)); + map.Add(pointer.Id, newPointer.Id); } private void pointerMovedhandler(object sender, MetaGestureEventArgs metaGestureEventArgs) { -// int id; -// TouchHit hit; -// var pointer = metaGestureEventArgs.Pointer; -// if (pointer.InputSource == this) return; -// if (!map.TryGetValue(pointer.Id, out id)) return; -// if (!gesture.GetTargetHitResult(pointer.Position, out hit)) return; -// movePointer(id, processCoords(hit.RaycastHit.textureCoord)); + int id; + TouchHit hit; + var pointer = metaGestureEventArgs.Pointer; + if (pointer.InputSource == this) return; + + if (!map.TryGetValue(pointer.Id, out id)) return; + if (!gesture.GetTargetHitResult(pointer.Position, out hit)) return; + movePointer(id, processCoords(hit.RaycastHit.textureCoord)); } private void pointerEndedHandler(object sender, MetaGestureEventArgs metaGestureEventArgs) { -// int id; -// var pointer = metaGestureEventArgs.Pointer; -// if (pointer.InputSource == this) return; -// if (!map.TryGetValue(pointer.Id, out id)) return; -// endPointer(id); + int id; + var pointer = metaGestureEventArgs.Pointer; + if (pointer.InputSource == this) return; + + if (!map.TryGetValue(pointer.Id, out id)) return; + endPointer(id); } private void pointerCancelledhandler(object sender, MetaGestureEventArgs metaGestureEventArgs) { -// int id; -// var pointer = metaGestureEventArgs.Pointer; -// if (pointer.InputSource == this) return; -// if (!map.TryGetValue(pointer.Id, out id)) return; -// cancelPointer(id); + int id; + var pointer = metaGestureEventArgs.Pointer; + if (pointer.InputSource == this) return; + + if (!map.TryGetValue(pointer.Id, out id)) return; + cancelPointer(id); } } diff --git a/Source/Assets/TouchScript/Scripts/Pointers/MousePointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/MousePointer.cs index 7e156ad7e..95cc91de5 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/MousePointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/MousePointer.cs @@ -9,10 +9,14 @@ namespace TouchScript.Pointers public class MousePointer : Pointer { + #region Constructor + public MousePointer(IInputSource input) : base(input) { Type = PointerType.Mouse; } + #endregion + } } diff --git a/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs index a53dfe38c..a366f4f73 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs @@ -9,10 +9,14 @@ namespace TouchScript.Pointers public class ObjectPointer : Pointer { + #region Constructor + public ObjectPointer(IInputSource input) : base(input) { - Type = PointerType.Mouse; + Type = PointerType.Object; } + #endregion + } } diff --git a/Source/Assets/TouchScript/Scripts/Pointers/PenPointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/PenPointer.cs index 9e3922c0d..87c978fac 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/PenPointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/PenPointer.cs @@ -9,10 +9,14 @@ namespace TouchScript.Pointers public class PenPointer : Pointer { + #region Constructor + public PenPointer(IInputSource input) : base(input) { Type = PointerType.Pen; } + #endregion + } } diff --git a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs index a23e22089..6169996f7 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs @@ -136,6 +136,8 @@ public override int GetHashCode() #endregion + #region Constructor + /// /// Initializes a new instance of the class. /// @@ -147,6 +149,8 @@ public Pointer(IInputSource input) INTERNAL_Reset(); } + #endregion + #region Internal methods /// @@ -194,5 +198,6 @@ internal int INTERNAL_Release() } #endregion + } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Pointers/PointerFactory.cs b/Source/Assets/TouchScript/Scripts/Pointers/PointerFactory.cs new file mode 100644 index 000000000..817311843 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Pointers/PointerFactory.cs @@ -0,0 +1,29 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using TouchScript.InputSources; + +namespace TouchScript.Pointers +{ + public static class PointerFactory + { + + public static Pointer Create(Pointer.PointerType type, IInputSource input) + { + switch (type) + { + case Pointer.PointerType.Touch: + return new TouchPointer(input); + case Pointer.PointerType.Mouse: + return new MousePointer(input); + case Pointer.PointerType.Pen: + return new PenPointer(input); + case Pointer.PointerType.Object: + return new ObjectPointer(input); + } + return null; + } + + } +} diff --git a/Source/Assets/TouchScript/Scripts/Pointers/PointerFactory.cs.meta b/Source/Assets/TouchScript/Scripts/Pointers/PointerFactory.cs.meta new file mode 100644 index 000000000..63674cb8f --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Pointers/PointerFactory.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: bcdc6ef93ccbe452bbf3f836f03beea3 +timeCreated: 1467501141 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Pointers/TouchPointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/TouchPointer.cs index ee2b3417e..eb26c90ec 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/TouchPointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/TouchPointer.cs @@ -9,10 +9,14 @@ namespace TouchScript.Pointers public class TouchPointer : Pointer { + #region Constructor + public TouchPointer(IInputSource input) : base(input) { Type = PointerType.Touch; } + #endregion + } } From 19b97ff726d20ed4b0911d1e03c5d7b81cc2d575 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 3 Jul 2016 03:15:55 +0300 Subject: [PATCH 012/211] Removed Tags. --- .../Visualizer/TouchVisualizerEditor.cs | 4 +- .../Editor/InputSources/InputSourceEditor.cs | 30 +-- .../Editor/InputSources/MobileInputEditor.cs | 9 - .../Editor/InputSources/MouseInputEditor.cs | 8 - .../InputSources/StandardInputEditor.cs | 14 -- .../Utils/PropertyDrawers/TagsDrawer.cs | 39 --- .../Utils/PropertyDrawers/TagsDrawer.cs.meta | 12 - .../TouchScript/Examples/Photos/Photos.unity | 184 +++++++------- .../Editor/InputSources/TuioInputEditor.cs | 52 +--- .../TUIO/Scripts/InputSources/TuioInput.cs | 122 ++------- .../Behaviors/Visualizer/PointerProxy.cs | 14 +- .../Behaviors/Visualizer/PointerVisualizer.cs | 14 -- .../InputHandlers/MouseHandler.cs | 5 +- .../InputHandlers/TouchHandler.cs | 5 +- .../InputHandlers/WindowsPointerHandlers.cs | 17 +- .../Scripts/InputSources/MobileInput.cs | 7 +- .../Scripts/InputSources/MouseInput.cs | 7 +- .../Scripts/InputSources/StandardInput.cs | 23 +- .../Scripts/Pointers/ObjectPointer.cs | 14 +- .../TouchScript/Scripts/Pointers/Pointer.cs | 24 -- Source/Assets/TouchScript/Scripts/Tags.cs | 232 ------------------ .../Assets/TouchScript/Scripts/Tags.cs.meta | 12 - 22 files changed, 151 insertions(+), 697 deletions(-) delete mode 100644 Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/TagsDrawer.cs delete mode 100644 Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/TagsDrawer.cs.meta delete mode 100644 Source/Assets/TouchScript/Scripts/Tags.cs delete mode 100644 Source/Assets/TouchScript/Scripts/Tags.cs.meta diff --git a/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs b/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs index 44fb4c1c8..b4fd352f6 100644 --- a/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs +++ b/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs @@ -10,12 +10,11 @@ namespace TouchScript.Editor.Behaviors.Visualizer internal sealed class TouchVisualizerEditor : UnityEditor.Editor { - private SerializedProperty touchProxy, useDPI, touchSize, showTouchId, showTags; + private SerializedProperty touchProxy, useDPI, touchSize, showTouchId; private void OnEnable() { showTouchId = serializedObject.FindProperty("showPointerId"); - showTags = serializedObject.FindProperty("showTags"); touchProxy = serializedObject.FindProperty("pointerProxy"); useDPI = serializedObject.FindProperty("useDPI"); touchSize = serializedObject.FindProperty("pointerSize"); @@ -28,7 +27,6 @@ public override void OnInspectorGUI() EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(touchProxy, new GUIContent("Pointer Proxy")); EditorGUILayout.PropertyField(showTouchId, new GUIContent("Show Pointer Id")); - EditorGUILayout.PropertyField(showTags, new GUIContent("Show Tags")); EditorGUILayout.PropertyField(useDPI, new GUIContent("Use DPI")); if (useDPI.boolValue) diff --git a/Source/Assets/TouchScript/Editor/InputSources/InputSourceEditor.cs b/Source/Assets/TouchScript/Editor/InputSources/InputSourceEditor.cs index d358b2173..412d5ce0a 100644 --- a/Source/Assets/TouchScript/Editor/InputSources/InputSourceEditor.cs +++ b/Source/Assets/TouchScript/Editor/InputSources/InputSourceEditor.cs @@ -17,23 +17,23 @@ protected virtual void OnEnable() public override void OnInspectorGUI() { - serializedObject.UpdateIfDirtyOrScript(); + //serializedObject.UpdateIfDirtyOrScript(); - EditorGUI.BeginChangeCheck(); - var expanded = GUIElements.BeginFoldout(advanced.isExpanded, new GUIContent("Advanced", TEXT_ADVANCED_HEADER)); - if (EditorGUI.EndChangeCheck()) - { - advanced.isExpanded = expanded; - } - if (expanded) - { - GUILayout.BeginVertical(GUIElements.FoldoutStyle); - drawAdvanced(); - GUILayout.EndVertical(); - } - GUIElements.EndFoldout(); + //EditorGUI.BeginChangeCheck(); + //var expanded = GUIElements.BeginFoldout(advanced.isExpanded, new GUIContent("Advanced", TEXT_ADVANCED_HEADER)); + //if (EditorGUI.EndChangeCheck()) + //{ + // advanced.isExpanded = expanded; + //} + //if (expanded) + //{ + // GUILayout.BeginVertical(GUIElements.FoldoutStyle); + // drawAdvanced(); + // GUILayout.EndVertical(); + //} + //GUIElements.EndFoldout(); - serializedObject.ApplyModifiedProperties(); + //serializedObject.ApplyModifiedProperties(); } protected virtual void drawAdvanced() {} diff --git a/Source/Assets/TouchScript/Editor/InputSources/MobileInputEditor.cs b/Source/Assets/TouchScript/Editor/InputSources/MobileInputEditor.cs index dca00d9a8..493983e23 100644 --- a/Source/Assets/TouchScript/Editor/InputSources/MobileInputEditor.cs +++ b/Source/Assets/TouchScript/Editor/InputSources/MobileInputEditor.cs @@ -8,14 +8,12 @@ namespace TouchScript.Editor.InputSources #pragma warning restore 0618 internal sealed class MobileInputEditor : InputSourceEditor { - private SerializedProperty tags; private SerializedProperty disableOnNonTouchPlatforms; protected override void OnEnable() { base.OnEnable(); - tags = serializedObject.FindProperty("Tags"); disableOnNonTouchPlatforms = serializedObject.FindProperty("DisableOnNonTouchPlatforms"); } @@ -28,12 +26,5 @@ public override void OnInspectorGUI() serializedObject.ApplyModifiedProperties(); base.OnInspectorGUI(); } - - protected override void drawAdvanced() - { - EditorGUI.indentLevel++; - EditorGUILayout.PropertyField(tags); - EditorGUI.indentLevel--; - } } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Editor/InputSources/MouseInputEditor.cs b/Source/Assets/TouchScript/Editor/InputSources/MouseInputEditor.cs index 062e9a202..f43294bdf 100644 --- a/Source/Assets/TouchScript/Editor/InputSources/MouseInputEditor.cs +++ b/Source/Assets/TouchScript/Editor/InputSources/MouseInputEditor.cs @@ -8,14 +8,12 @@ namespace TouchScript.Editor.InputSources #pragma warning restore 0618 internal sealed class MouseInputEditor : InputSourceEditor { - private SerializedProperty tags; private SerializedProperty disableOnMobilePlatforms; protected override void OnEnable() { base.OnEnable(); - tags = serializedObject.FindProperty("Tags"); disableOnMobilePlatforms = serializedObject.FindProperty("DisableOnMobilePlatforms"); } @@ -29,11 +27,5 @@ public override void OnInspectorGUI() base.OnInspectorGUI(); } - protected override void drawAdvanced() - { - EditorGUI.indentLevel++; - EditorGUILayout.PropertyField(tags); - EditorGUI.indentLevel--; - } } } diff --git a/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs b/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs index 7facbcb33..44a324d6f 100644 --- a/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs +++ b/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs @@ -6,8 +6,6 @@ namespace TouchScript.Editor.InputSources [CustomEditor(typeof (StandardInput), true)] internal sealed class StandardInputEditor : InputSourceEditor { - private SerializedProperty touchTags, mouseTags, penTags; - private SerializedProperty windows8Touch, windows7Touch, webPlayerTouch, @@ -20,9 +18,6 @@ protected override void OnEnable() { base.OnEnable(); - touchTags = serializedObject.FindProperty("TouchTags"); - mouseTags = serializedObject.FindProperty("MouseTags"); - penTags = serializedObject.FindProperty("PenTags"); windows8Touch = serializedObject.FindProperty("Windows8API"); windows7Touch = serializedObject.FindProperty("Windows7API"); webPlayerTouch = serializedObject.FindProperty("WebPlayerTouch"); @@ -45,14 +40,5 @@ public override void OnInspectorGUI() serializedObject.ApplyModifiedProperties(); base.OnInspectorGUI(); } - - protected override void drawAdvanced() - { - EditorGUI.indentLevel++; - EditorGUILayout.PropertyField(touchTags); - EditorGUILayout.PropertyField(mouseTags); - EditorGUILayout.PropertyField(penTags); - EditorGUI.indentLevel--; - } } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/TagsDrawer.cs b/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/TagsDrawer.cs deleted file mode 100644 index 592b077e7..000000000 --- a/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/TagsDrawer.cs +++ /dev/null @@ -1,39 +0,0 @@ -using UnityEditor; -using UnityEditorInternal; -using UnityEngine; - -namespace TouchScript.Editor.Utils.PropertyDrawers -{ - [CustomPropertyDrawer(typeof(Tags))] - internal sealed class TagsDrawer : PropertyDrawer - { - private ReorderableList list; - - public override float GetPropertyHeight(SerializedProperty property, GUIContent label) - { - if (list == null) initList(property, label); - - return list.GetHeight(); - } - - public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) - { - if (list == null) initList(property, label); - - list.serializedProperty = property.FindPropertyRelative("tagList"); - list.DoList(position); - } - - private void initList(SerializedProperty property, GUIContent label) - { - list = new ReorderableList(property.serializedObject, property.FindPropertyRelative("tagList"), false, true, true, true); - list.drawHeaderCallback += rect => GUI.Label(rect, label); - list.drawElementCallback += (rect, index, active, focused) => - { - rect.height = 16; - rect.y += 2; - EditorGUI.PropertyField(rect, list.serializedProperty.GetArrayElementAtIndex(index), GUIContent.none); - }; - } - } -} diff --git a/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/TagsDrawer.cs.meta b/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/TagsDrawer.cs.meta deleted file mode 100644 index 513e13c05..000000000 --- a/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/TagsDrawer.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: e373603907e744048b209e3b7bc5e268 -timeCreated: 1447582131 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/Photos/Photos.unity b/Source/Assets/TouchScript/Examples/Photos/Photos.unity index fb17ffe9a..44b668854 100644 --- a/Source/Assets/TouchScript/Examples/Photos/Photos.unity +++ b/Source/Assets/TouchScript/Examples/Photos/Photos.unity @@ -389,10 +389,10 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -937,10 +937,10 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -963,10 +963,10 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -1329,10 +1329,10 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -1580,10 +1580,10 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -1613,10 +1613,10 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -1790,10 +1790,10 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -1823,10 +1823,10 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -2574,10 +2574,10 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -2720,10 +2720,10 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -2753,10 +2753,10 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -3131,10 +3131,10 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -3486,10 +3486,10 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -3967,10 +3967,10 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -4111,10 +4111,10 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -4341,10 +4341,10 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -4642,10 +4642,10 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -4675,10 +4675,10 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -4997,10 +4997,10 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -5411,10 +5411,10 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -5444,10 +5444,10 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -5617,10 +5617,10 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -5831,10 +5831,10 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} diff --git a/Source/Assets/TouchScript/Modules/TUIO/Editor/InputSources/TuioInputEditor.cs b/Source/Assets/TouchScript/Modules/TUIO/Editor/InputSources/TuioInputEditor.cs index ac65128ea..107a117ee 100644 --- a/Source/Assets/TouchScript/Modules/TUIO/Editor/InputSources/TuioInputEditor.cs +++ b/Source/Assets/TouchScript/Modules/TUIO/Editor/InputSources/TuioInputEditor.cs @@ -9,13 +9,10 @@ namespace TouchScript.Editor.InputSources internal sealed class TuioInputEditor : InputSourceEditor { private static readonly GUIContent INPUT_TYPES = new GUIContent("Input Types", "Supported input types."); - private static readonly GUIContent OBJECT_MAPPINGS = new GUIContent("TUIO Object Mappings", "TUIO Object to Tag list."); private TuioInput instance; - private SerializedProperty supportedInputs, tuioObjectMappings; - private SerializedProperty cursorTags, blobTags, objectTags; + private SerializedProperty supportedInputs; private SerializedProperty tuioPort; - private ReorderableList list; protected override void OnEnable() { @@ -23,40 +20,7 @@ protected override void OnEnable() instance = target as TuioInput; supportedInputs = serializedObject.FindProperty("supportedInputs"); - tuioObjectMappings = serializedObject.FindProperty("tuioObjectMappings"); - cursorTags = serializedObject.FindProperty("cursorTags"); - blobTags = serializedObject.FindProperty("blobTags"); - objectTags = serializedObject.FindProperty("objectTags"); tuioPort = serializedObject.FindProperty("tuioPort"); - - list = new ReorderableList(serializedObject, tuioObjectMappings, false, true, true, true); - list.drawHeaderCallback += rect => GUI.Label(rect, OBJECT_MAPPINGS); - list.drawElementCallback += (rect, index, active, focused) => - { - EditorGUI.BeginChangeCheck(); - var element = instance.TuioObjectMappings[index]; - rect.height = 16; - rect.y += 2; - var r = rect; - r.width = 20; - GUI.Label(r, "id:"); - r.x += r.width; - r.width = 50; - var newId = EditorGUI.IntField(r, element.Id); - r.x += r.width; - r.width = 40; - GUI.Label(r, " tag:"); - r.x += r.width; - r.width = rect.width - r.x + rect.x; - var newTag = GUI.TextField(r, element.Tag); - - if (EditorGUI.EndChangeCheck()) - { - element.Id = newId; - element.Tag = newTag; - EditorUtility.SetDirty(target); - } - }; } public override void OnInspectorGUI() @@ -77,22 +41,8 @@ public override void OnInspectorGUI() } EditorGUI.EndProperty(); - if ((sMask & TuioInput.InputType.Objects) != 0) - { - list.DoLayoutList(); - } - serializedObject.ApplyModifiedProperties(); base.OnInspectorGUI(); } - - protected override void drawAdvanced() - { - EditorGUI.indentLevel++; - EditorGUILayout.PropertyField(cursorTags); - EditorGUILayout.PropertyField(blobTags); - EditorGUILayout.PropertyField(objectTags); - EditorGUI.indentLevel--; - } } } diff --git a/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs b/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs index 7b89ec168..dc2d7cd8b 100644 --- a/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs +++ b/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs @@ -23,11 +23,6 @@ public sealed class TuioInput : InputSource { #region Constants - /// - /// TUIO tag used for pointers. - /// - public const string SOURCE_TUIO = "TUIO"; - /// /// Type of TUIO input object. /// @@ -82,38 +77,6 @@ public InputType SupportedInputs } } - /// - /// List of TUIO object ids to tag mappings. - /// - public IList TuioObjectMappings - { - get { return tuioObjectMappings; } - } - - /// - /// Tags for new cursors. - /// - public Tags CursorTags - { - get { return cursorTags; } - } - - /// - /// Tags for new blobs. - /// - public Tags BlobTags - { - get { return blobTags; } - } - - /// - /// Tags for new objects. - /// - public Tags ObjectTags - { - get { return objectTags; } - } - #endregion #region Private variables @@ -124,26 +87,14 @@ public Tags ObjectTags [SerializeField] private InputType supportedInputs = InputType.Cursors | InputType.Blobs | InputType.Objects; - [SerializeField] - private List tuioObjectMappings = new List(); - - [SerializeField] - private Tags cursorTags = new Tags(SOURCE_TUIO, Tags.INPUT_TOUCH); - - [SerializeField] - private Tags blobTags = new Tags(SOURCE_TUIO, Tags.INPUT_TOUCH); - - [SerializeField] - private Tags objectTags = new Tags(SOURCE_TUIO, Tags.INPUT_OBJECT); - private TuioServer server; private CursorProcessor cursorProcessor; private ObjectProcessor objectProcessor; private BlobProcessor blobProcessor; - private Dictionary cursorToInternalId = new Dictionary(); - private Dictionary blobToInternalId = new Dictionary(); - private Dictionary objectToInternalId = new Dictionary(); + private Dictionary cursorToInternalId = new Dictionary(); + private Dictionary blobToInternalId = new Dictionary(); + private Dictionary objectToInternalId = new Dictionary(); private int screenWidth; private int screenHeight; @@ -311,14 +262,14 @@ protected override void OnDisable() #region Private functions - private Pointer internalBeginTouch(Vector2 position, bool remap = true) + private TouchPointer internalBeginTouch(Vector2 position, bool remap = true) { var pointer = touchPool.Get(); beginPointer(pointer, position, remap); return pointer; } - private Pointer internalBeginObject(Vector2 position, bool remap = true) + private ObjectPointer internalBeginObject(Vector2 position, bool remap = true) { var pointer = objectPool.Get(); beginPointer(pointer, position, remap); @@ -361,37 +312,17 @@ private void updateInputs() else server.RemoveDataProcessor(objectProcessor); } - private void updateBlobProperties(Pointer touch, TuioBlob blob) + private void updateBlobProperties(ObjectPointer obj, TuioBlob target) { - var props = touch.Properties; - - props["Angle"] = blob.Angle; - props["Width"] = blob.Width; - props["Height"] = blob.Height; - props["Area"] = blob.Area; - props["RotationVelocity"] = blob.RotationVelocity; - props["RotationAcceleration"] = blob.RotationAcceleration; + obj.Width = target.Width; + obj.Height = target.Height; + obj.Angle = target.Angle; } - private void updateObjectProperties(Pointer touch, TuioObject obj) + private void updateObjectProperties(ObjectPointer obj, TuioObject target) { - var props = touch.Properties; - - props["Angle"] = obj.Angle; - props["ObjectId"] = obj.ClassId; - props["RotationVelocity"] = obj.RotationVelocity; - props["RotationAcceleration"] = obj.RotationAcceleration; - } - - private string getTagById(int id) - { - var count = TuioObjectMappings.Count; - for (var i = 0; i < count; i++) - { - var tuioObjectMapping = tuioObjectMappings[i]; - if (tuioObjectMapping.Id == id) return tuioObjectMapping.Tag; - } - return null; + obj.ObjectId = target.ClassId; + obj.Angle = target.Angle; } #endregion @@ -414,7 +345,7 @@ private void OnCursorUpdated(object sender, TuioCursorEventArgs e) var entity = e.Cursor; lock (this) { - Pointer touch; + TouchPointer touch; if (!cursorToInternalId.TryGetValue(entity, out touch)) return; var x = entity.X * screenWidth; @@ -429,7 +360,7 @@ private void OnCursorRemoved(object sender, TuioCursorEventArgs e) var entity = e.Cursor; lock (this) { - Pointer touch; + TouchPointer touch; if (!cursorToInternalId.TryGetValue(entity, out touch)) return; cursorToInternalId.Remove(entity); @@ -455,7 +386,7 @@ private void OnBlobUpdated(object sender, TuioBlobEventArgs e) var entity = e.Blob; lock (this) { - Pointer touch; + ObjectPointer touch; if (!blobToInternalId.TryGetValue(entity, out touch)) return; var x = entity.X * screenWidth; @@ -471,7 +402,7 @@ private void OnBlobRemoved(object sender, TuioBlobEventArgs e) var entity = e.Blob; lock (this) { - Pointer touch; + ObjectPointer touch; if (!blobToInternalId.TryGetValue(entity, out touch)) return; blobToInternalId.Remove(entity); @@ -487,7 +418,6 @@ private void OnObjectAdded(object sender, TuioObjectEventArgs e) var x = entity.X * screenWidth; var y = (1 - entity.Y) * screenHeight; var touch = internalBeginObject(new Vector2(x, y)); - // , new Tags(ObjectTags, getTagById(entity.ClassId)) updateObjectProperties(touch, entity); objectToInternalId.Add(entity, touch); } @@ -498,7 +428,7 @@ private void OnObjectUpdated(object sender, TuioObjectEventArgs e) var entity = e.Object; lock (this) { - Pointer touch; + ObjectPointer touch; if (!objectToInternalId.TryGetValue(entity, out touch)) return; var x = entity.X * screenWidth; @@ -514,7 +444,7 @@ private void OnObjectRemoved(object sender, TuioObjectEventArgs e) var entity = e.Object; lock (this) { - Pointer touch; + ObjectPointer touch; if (!objectToInternalId.TryGetValue(entity, out touch)) return; objectToInternalId.Remove(entity); @@ -525,22 +455,6 @@ private void OnObjectRemoved(object sender, TuioObjectEventArgs e) #endregion } - /// - /// TUIO object id to tag mapping value object. - /// - [Serializable] - public class TuioObjectMapping - { - /// - /// TUIO object id. - /// - public int Id; - - /// - /// Tag to attach to this object. - /// - public string Tag; - } } #endif \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs index e1b22d5a6..7ec855964 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs @@ -35,7 +35,7 @@ protected override void updateOnce(Pointer pointer) gameObject.name = stringBuilder.ToString(); if (Text == null) return; - if (!ShowPointerId && !ShowTags) return; + if (!ShowPointerId) return; stringBuilder.Length = 0; if (ShowPointerId) @@ -43,12 +43,6 @@ protected override void updateOnce(Pointer pointer) stringBuilder.Append("Id: "); stringBuilder.Append(pointer.Id); } - if (ShowTags) - { - if (stringBuilder.Length > 0) stringBuilder.Append("\n"); - stringBuilder.Append("Tags: "); - stringBuilder.Append(pointer.Tags.ToString()); - } Text.text = stringBuilder.ToString(); } @@ -82,12 +76,6 @@ public int Size /// 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 tags text should be displayed on screen. - /// - /// true if pointer tags text should be displayed on screen; otherwise, false. - public bool ShowTags { get; set; } - #endregion #region Private variables diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs index b3ac8b772..a08ce3229 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs @@ -41,16 +41,6 @@ public bool ShowPointerId set { showPointerId = value; } } - /// - /// Gets or sets a value indicating whether pointer tags text should be displayed on screen. - /// - /// true if pointer tags text should be displayed on screen; otherwise, false. - public bool ShowTags - { - get { return showTags; } - set { showTags = value; } - } - /// /// Gets or sets whether is using DPI to scale pointer cursors. /// @@ -81,9 +71,6 @@ public float PointerSize [SerializeField] private bool showPointerId = true; - [SerializeField] - private bool showTags = false; - [SerializeField] private bool useDPI = true; @@ -177,7 +164,6 @@ private void pointersBeganHandler(object sender, PointerEventArgs e) var proxy = pool.Get(); proxy.Size = getPointerSize(); proxy.ShowPointerId = showPointerId; - proxy.ShowTags = showTags; proxy.Init(rect, pointer); proxies.Add(pointer.Id, proxy); } diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs index c0a61f7f0..44e858c37 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs @@ -25,7 +25,6 @@ public class MouseHandler : IInputSource, IDisposable private Action cancelPointer; private MousePointer mousePointer, fakeMousePointer; - private Tags tags; private Vector3 mousePointPos = Vector3.zero; #endregion @@ -33,14 +32,12 @@ public class MouseHandler : IInputSource, IDisposable /// /// Initializes a new instance of the class. /// - /// Tags to add to pointers. /// A function called when a new pointer is detected. As this function must accept a Vector2 position of the new pointer and return an instance of . /// A function called when a pointer is moved. As this function must accept an int id and a Vector2 position. /// A function called when a pointer is lifted off. As this function must accept an int id. /// A function called when a pointer is cancelled. As this function must accept an int id. - public MouseHandler(Tags tags, Action beginPointer, Action movePointer, Action endPointer, Action cancelPointer) + public MouseHandler(Action beginPointer, Action movePointer, Action endPointer, Action cancelPointer) { - this.tags = tags; this.beginPointer = beginPointer; this.movePointer = movePointer; this.endPointer = endPointer; diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs index 890a13db9..fcf322af6 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs @@ -37,7 +37,6 @@ public bool HasPointers private Action cancelPointer; private ObjectPool pointerPool; - private Tags tags; private Dictionary systemToInternalId = new Dictionary(); private int pointersNum; @@ -46,14 +45,12 @@ public bool HasPointers /// /// Initializes a new instance of the class. /// - /// Tags to add to pointers. /// A function called when a new pointer is detected. As this function must accept a Vector2 position of the new pointer and return an instance of . /// A function called when a pointer is moved. As this function must accept an int id and a Vector2 position. /// A function called when a pointer is lifted off. As this function must accept an int id. /// A function called when a pointer is cancelled. As this function must accept an int id. - public TouchHandler(Tags tags, Action beginPointer, Action movePointer, Action endPointer, Action cancelPointer) + public TouchHandler(Action beginPointer, Action movePointer, Action endPointer, Action cancelPointer) { - this.tags = tags; this.beginPointer = beginPointer; this.movePointer = movePointer; this.endPointer = endPointer; diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs index 88ce00f64..4357f4eb0 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs @@ -20,17 +20,12 @@ namespace TouchScript.InputSources.InputHandlers /// public class Windows8PointerHandler : WindowsPointerHandler { - private Tags mouseTags, touchTags, penTags; private MousePointer mousePointer; private PenPointer penPointer; /// - public Windows8PointerHandler(Tags touchTags, Tags mouseTags, Tags penTags, Action beginPointer, Action movePointer, Action endPointer, Action cancelPointer) : base(touchTags, beginPointer, movePointer, endPointer, cancelPointer) + public Windows8PointerHandler(Action beginPointer, Action movePointer, Action endPointer, Action cancelPointer) : base(beginPointer, movePointer, endPointer, cancelPointer) { - this.mouseTags = mouseTags; - this.touchTags = touchTags; - this.penTags = penTags; - mousePointer = new MousePointer(this); penPointer = new PenPointer(this); @@ -115,20 +110,16 @@ private void decodeWin8Touches(uint msg, IntPtr wParam, IntPtr lParam) case WM_POINTERDOWN: { if ((pointerInfo.pointerFlags & POINTER_FLAG_CANCELLED) == POINTER_FLAG_CANCELLED) break; - Tags tags = null; var position = new Vector2((p.X - offsetX) * scaleX, Screen.height - (p.Y - offsetY) * scaleY); switch (pointerInfo.pointerType) { case POINTER_INPUT_TYPE.PT_MOUSE: - tags = mouseTags; beginPointer(mousePointer, position, true); break; case POINTER_INPUT_TYPE.PT_TOUCH: - tags = touchTags; winTouchToInternalId.Add(pointerId, internalBeginTouchPointer(position).Id); break; case POINTER_INPUT_TYPE.PT_PEN: - tags = penTags; beginPointer(penPointer, position, true); break; } @@ -199,7 +190,7 @@ public class Windows7PointerHandler : WindowsPointerHandler private int touchInputSize; /// - public Windows7PointerHandler(Tags tags, Action beginPointer, Action movePointer, Action endPointer, Action cancelPointer) : base(tags, beginPointer, movePointer, endPointer, cancelPointer) + public Windows7PointerHandler(Action beginPointer, Action movePointer, Action endPointer, Action cancelPointer) : base(beginPointer, movePointer, endPointer, cancelPointer) { touchInputSize = Marshal.SizeOf(typeof (TOUCHINPUT)); RegisterTouchWindow(hMainWindow, 0); @@ -314,7 +305,6 @@ public enum PointerSource protected Action endPointer; protected Action cancelPointer; - protected Tags tags; protected IntPtr hMainWindow; protected IntPtr oldWndProcPtr; protected IntPtr newWndProcPtr; @@ -337,9 +327,8 @@ public enum PointerSource /// A function called when a pointer is moved. As this function must accept an int id and a Vector2 position. /// A function called when a pointer is lifted off. As this function must accept an int id. /// A function called when a pointer is cancelled. As this function must accept an int id. - public WindowsPointerHandler(Tags tags, Action beginPointer, Action movePointer, Action endPointer, Action cancelPointer) + public WindowsPointerHandler(Action beginPointer, Action movePointer, Action endPointer, Action cancelPointer) { - this.tags = tags; this.beginPointer = beginPointer; this.movePointer = movePointer; this.endPointer = endPointer; diff --git a/Source/Assets/TouchScript/Scripts/InputSources/MobileInput.cs b/Source/Assets/TouchScript/Scripts/InputSources/MobileInput.cs index 2029979bf..cc441dea9 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/MobileInput.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/MobileInput.cs @@ -24,11 +24,6 @@ public sealed class MobileInput : InputSource [ToggleLeft] public bool DisableOnNonTouchPlatforms = true; - /// - /// Tags added to pointers coming from this input. - /// - public Tags Tags = new Tags(Tags.INPUT_TOUCH); - #endregion #region Private variables @@ -82,7 +77,7 @@ protected override void OnEnable() } } - touchHandler = new TouchHandler(Tags, beginPointer, movePointer, endPointer, cancelPointer); + touchHandler = new TouchHandler(beginPointer, movePointer, endPointer, cancelPointer); base.OnEnable(); } diff --git a/Source/Assets/TouchScript/Scripts/InputSources/MouseInput.cs b/Source/Assets/TouchScript/Scripts/InputSources/MouseInput.cs index ae151b532..34a6d9ce6 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/MouseInput.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/MouseInput.cs @@ -26,11 +26,6 @@ public sealed class MouseInput : InputSource [ToggleLeft] public bool DisableOnMobilePlatforms = true; - /// - /// Tags added to pointers coming from this input. - /// - public Tags Tags = new Tags(Tags.INPUT_MOUSE); - #endregion #region Private variables @@ -85,7 +80,7 @@ protected override void OnEnable() } } - mouseHandler = new MouseHandler(Tags, beginPointer, movePointer, endPointer, cancelPointer); + mouseHandler = new MouseHandler(beginPointer, movePointer, endPointer, cancelPointer); } /// diff --git a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs index 63e00bd3d..924c61da4 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs @@ -77,21 +77,6 @@ public enum Windows7APIType #region Public properties - /// - /// Tags added to touches coming from this input. - /// - public Tags TouchTags = new Tags(Tags.INPUT_TOUCH); - - /// - /// Tags added to mouse pointers coming from this input. - /// - public Tags MouseTags = new Tags(Tags.INPUT_MOUSE); - - /// - /// Tags added to pen pointers coming from this input. - /// - public Tags PenTags = new Tags(Tags.INPUT_PEN); - /// /// Pointer API to use on Windows 8. /// @@ -284,7 +269,7 @@ protected override void OnDisable() private void enableMouse() { - mouseHandler = new MouseHandler(MouseTags, beginPointer, movePointer, endPointer, cancelPointer); + mouseHandler = new MouseHandler(beginPointer, movePointer, endPointer, cancelPointer); Debug.Log("[TouchScript] Initialized Unity mouse input."); } @@ -299,7 +284,7 @@ private void disableMouse() private void enableTouch() { - touchHandler = new TouchHandler(TouchTags, beginPointer, movePointer, endPointer, cancelPointer); + touchHandler = new TouchHandler(beginPointer, movePointer, endPointer, cancelPointer); Debug.Log("[TouchScript] Initialized Unity touch input."); } @@ -330,7 +315,7 @@ private void disableWindows8Mouse() private void enableWindows7Touch() { - windows7PointerHandler = new Windows7PointerHandler(TouchTags, beginPointer, movePointer, endPointer, cancelPointer); + windows7PointerHandler = new Windows7PointerHandler(beginPointer, movePointer, endPointer, cancelPointer); Debug.Log("[TouchScript] Initialized Windows 7 pointer input."); } @@ -345,7 +330,7 @@ private void disableWindows7Touch() private void enableWindows8Touch() { - windows8PointerHandler = new Windows8PointerHandler(TouchTags, MouseTags, PenTags, beginPointer, movePointer, endPointer, cancelPointer); + windows8PointerHandler = new Windows8PointerHandler(beginPointer, movePointer, endPointer, cancelPointer); Debug.Log("[TouchScript] Initialized Windows 8 pointer input."); } diff --git a/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs index a366f4f73..8189e7b66 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs @@ -8,6 +8,17 @@ namespace TouchScript.Pointers { public class ObjectPointer : Pointer { + #region Public properties + + public int ObjectId { get; internal set; } + + public float Width { get; internal set; } + + public float Height { get; internal set; } + + public float Angle { get; internal set; } + + #endregion #region Constructor @@ -17,6 +28,5 @@ public ObjectPointer(IInputSource input) : base(input) } #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 6169996f7..55bd2d7d4 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs @@ -2,7 +2,6 @@ * @author Valentin Simonov / http://va.lent.in/ */ -using System.Collections.Generic; using TouchScript.Hit; using TouchScript.InputSources; using TouchScript.Layers; @@ -86,20 +85,6 @@ public ProjectionParams ProjectionParams get { return Layer.GetProjectionParams(this); } } - /// - /// Tags collection for this pointer. - /// - public Tags Tags { get; private set; } - - /// - /// List of custom properties (key-value pairs) for this pointer. - /// - public Dictionary Properties - { - get { return properties; } - set { properties = value; } - } - #endregion #region Private variables @@ -107,7 +92,6 @@ public Dictionary Properties private int refCount = 0; private Vector2 position = Vector2.zero; private Vector2 newPosition = Vector2.zero; - private Dictionary properties; #endregion @@ -145,7 +129,6 @@ public Pointer(IInputSource input) { Type = PointerType.Touch; InputSource = input; - properties = new Dictionary(); INTERNAL_Reset(); } @@ -153,11 +136,6 @@ public Pointer(IInputSource input) #region Internal methods - /// - /// Initializes a new instance of the class. - /// - /// Unique id of the pointer. - /// Screen position of the pointer. internal void INTERNAL_Init(int id, Vector2 position) { Id = id; @@ -171,8 +149,6 @@ internal void INTERNAL_Reset() Hit = default(TouchHit); Target = null; Layer = null; - Tags = Tags.EMPTY; - properties.Clear(); } internal void INTERNAL_ResetPosition() diff --git a/Source/Assets/TouchScript/Scripts/Tags.cs b/Source/Assets/TouchScript/Scripts/Tags.cs deleted file mode 100644 index 8da69b9c6..000000000 --- a/Source/Assets/TouchScript/Scripts/Tags.cs +++ /dev/null @@ -1,232 +0,0 @@ -/* - * @author Valentin Simonov / http://va.lent.in/ - */ - -using System; -using System.Collections.Generic; -using System.Text; -using UnityEngine; - -namespace TouchScript -{ - /// - /// Immutable tag collection for touches. - /// - [Serializable] - public sealed class Tags : ISerializationCallbackReceiver - { - #region Constants - - /// - /// Pointer. - /// - public const string INPUT_TOUCH = "Touch"; - - /// - /// Mouse. - /// - public const string INPUT_MOUSE = "Mouse"; - - /// - /// Pen. - /// - public const string INPUT_PEN = "Pen"; - - /// - /// Object. - /// - public const string INPUT_OBJECT = "Object"; - - /// - /// Empty tag list. - /// - public static readonly Tags EMPTY = new Tags(); - - #endregion - - #region Public properties - - #endregion - - #region Private variables - - [SerializeField] - private List tagList = new List(); - - private HashSet tags = new HashSet(); - private string stringValue; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - /// Tags to copy. - /// Tags to add. - public Tags(Tags tags, IEnumerable add) : this(tags) - { - if (add == null) return; - foreach (var tag in add) - { - if (string.IsNullOrEmpty(tag)) continue; - this.tags.Add(tag); - } -#if UNITY_EDITOR - syncTagList(); -#endif - } - - /// - /// Initializes a new instance of the class. - /// - /// Tags to copy. - /// Tag to add. - public Tags(Tags tags, string add) : this(tags) - { - if (string.IsNullOrEmpty(add)) return; - this.tags.Add(add); - } - - /// - /// Initializes a new instance of the class. - /// - /// Tags to copy. - public Tags(Tags tags) : this() - { - if (tags == null) return; - foreach (var tag in tags.tags) this.tags.Add(tag); -#if UNITY_EDITOR - syncTagList(); -#endif - } - - /// - /// Initializes a new instance of the class. - /// - /// Tags to copy. - public Tags(IEnumerable tags) : this() - { - if (tags == null) return; - foreach (var tag in tags) - { - if (string.IsNullOrEmpty(tag)) continue; - this.tags.Add(tag); - } -#if UNITY_EDITOR - syncTagList(); -#endif - } - - /// - /// Initializes a new instance of the class. - /// - /// Tags to add. - public Tags(params string[] tags) : this() - { - if (tags == null) return; - var count = tags.Length; - for (var i = 0; i < count; i++) - { - var tag = tags[i]; - if (string.IsNullOrEmpty(tag)) continue; - this.tags.Add(tag); - } -#if UNITY_EDITOR - syncTagList(); -#endif - } - - /// - /// Initializes a new instance of the class. - /// - /// Tag to add. - public Tags(string tag) : this() - { - if (string.IsNullOrEmpty(tag)) return; - tags.Add(tag); -#if UNITY_EDITOR - syncTagList(); -#endif - } - - /// - /// Initializes a new instance of the class. - /// - public Tags() {} - - #endregion - - #region Public methods - - /// - /// Checks if this collection contains a tag. - /// - /// Tag. - /// True if tag is in this collection; false otherwise. - public bool HasTag(string tag) - { - return tags.Contains(tag); - } - - - /// - public void OnBeforeSerialize() - { -#if !UNITY_EDITOR - tagList.Clear(); - tagList.AddRange(tags); -#endif - } - - /// - public void OnAfterDeserialize() - { - tags.Clear(); - foreach (var tag in tagList) tags.Add(tag); - } - - /// - public override string ToString() - { - if (stringValue == null) - { - if (tags.Count == 0) - { - stringValue = ""; - } - else if (tags.Count == 1) - { - foreach (var tag in tags) stringValue = tag; // doh!? - } - else - { - var sb = new StringBuilder(100); - foreach (var tag in tags) - { - sb.Append(tag); - sb.Append(", "); - } - stringValue = sb.ToString(0, sb.Length - 2); - } - } - return stringValue; - } - - #endregion - - #region Private functions - -#if UNITY_EDITOR - // When Tags is created in editor as a component's property need to copy all tags to tagList so Unity could serialize them. - private void syncTagList() - { - tagList.Clear(); - tagList.AddRange(tags); - } -#endif - - #endregion - } -} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Tags.cs.meta b/Source/Assets/TouchScript/Scripts/Tags.cs.meta deleted file mode 100644 index 321ff2893..000000000 --- a/Source/Assets/TouchScript/Scripts/Tags.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: c7c3e58101ca34da39242009583cad02 -timeCreated: 1447582131 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: From 5f302ee5eeb47c852fe21e23adc9b211da91923a Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 3 Jul 2016 05:30:19 +0300 Subject: [PATCH 013/211] ObjectPool debug defines. --- .../TouchScript/Scripts/Utils/ObjectPool.cs | 41 ++++++++++++++++--- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs b/Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs index 35e168b9d..85c02a6a8 100644 --- a/Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs +++ b/Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs @@ -7,6 +7,9 @@ using System; using System.Collections.Generic; using UnityEngine.Events; +#if OBJECTPOOL_DEBUG +using UnityEngine; +#endif namespace TouchScript.Utils { @@ -19,6 +22,8 @@ public class ObjectPool where T : class private readonly UnityAction onRelease; private readonly UnityFunc onNew; + public string Name { get; set; } + public int CountAll { get; private set; } public int CountActive @@ -53,9 +58,15 @@ public void WarmUp(int count) public T Get() { +#if OBJECTPOOL_DEBUG + var created = false; +#endif T element; if (stack.Count == 0) { +#if OBJECTPOOL_DEBUG + created = true; +#endif element = onNew(); CountAll++; } @@ -63,18 +74,38 @@ public T Get() { element = stack.Pop(); } - if (onGet != null) - onGet(element); + if (onGet != null) onGet(element); +#if OBJECTPOOL_DEBUG + log(string.Format("Getting object from pool. New: {0}, count: {1}, left: {2}", created, CountAll, stack.Count)); +#endif return element; } public void Release(T element) { +#if OBJECTPOOL_DEBUG if (stack.Count > 0 && ReferenceEquals(stack.Peek(), element)) - UnityEngine.Debug.LogError("Internal error. Trying to destroy object that is already released to pool."); - if (onRelease != null) - onRelease(element); + logError("Internal error. Trying to destroy object that is already released to pool."); +#endif + if (onRelease != null) onRelease(element); stack.Push(element); +#if OBJECTPOOL_DEBUG + log(string.Format("Returned object to pool. Left: {0}", stack.Count)); +#endif + } + +#if OBJECTPOOL_DEBUG + private void log(string message) + { + if (string.IsNullOrEmpty(Name)) return; + UnityEngine.Debug.LogFormat("[{0}] ObjectPool ({1}): {2}", Time.unscaledTime, Name, message); + } + + private void logError(string message) + { + if (string.IsNullOrEmpty(Name)) return; + UnityEngine.Debug.LogErrorFormat("[{0}] ObjectPool ({1}): {2}", Time.unscaledTime, Name, message); } +#endif } } \ No newline at end of file From ec46d9cb722b03d39f531ceab7a815025fd55e26 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 3 Jul 2016 05:33:06 +0300 Subject: [PATCH 014/211] - Pointer.CopyFrom. - Added pools to mouse and pen handlers since when cancelled and returned touches must be different. I.e mouse is mostly a pool of 1 object. - Added flags. --- .../Editor/InputSources/InputSourceEditor.cs | 8 +- .../InputHandlers/MouseHandler.cs | 80 ++++++++----- .../InputHandlers/TouchHandler.cs | 44 ++++---- .../InputHandlers/WindowsPointerHandlers.cs | 106 ++++++++++++++---- .../Scripts/Pointers/ObjectPointer.cs | 16 +++ .../TouchScript/Scripts/Pointers/Pointer.cs | 59 +++++++++- 6 files changed, 240 insertions(+), 73 deletions(-) diff --git a/Source/Assets/TouchScript/Editor/InputSources/InputSourceEditor.cs b/Source/Assets/TouchScript/Editor/InputSources/InputSourceEditor.cs index 412d5ce0a..f369b51b9 100644 --- a/Source/Assets/TouchScript/Editor/InputSources/InputSourceEditor.cs +++ b/Source/Assets/TouchScript/Editor/InputSources/InputSourceEditor.cs @@ -6,13 +6,13 @@ namespace TouchScript.Editor.InputSources { public class InputSourceEditor : UnityEditor.Editor { - private const string TEXT_ADVANCED_HEADER = "Advanced properties."; - - private SerializedProperty advanced; +// private const string TEXT_ADVANCED_HEADER = "Advanced properties."; +// +// private SerializedProperty advanced; protected virtual void OnEnable() { - advanced = serializedObject.FindProperty("advancedProps"); +// advanced = serializedObject.FindProperty("advancedProps"); } public override void OnInspectorGUI() diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs index 44e858c37..4e6daf0fc 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs @@ -4,6 +4,7 @@ using System; using TouchScript.Pointers; +using TouchScript.Utils; using UnityEngine; namespace TouchScript.InputSources.InputHandlers @@ -24,6 +25,7 @@ public class MouseHandler : IInputSource, IDisposable private Action endPointer; private Action cancelPointer; + private ObjectPool mousePool; private MousePointer mousePointer, fakeMousePointer; private Vector3 mousePointPos = Vector3.zero; @@ -43,8 +45,7 @@ public MouseHandler(Action beginPointer, Action(4, () => new MousePointer(this), null, (t) => t.INTERNAL_Reset()); } #region Public methods @@ -54,13 +55,15 @@ public MouseHandler(Action beginPointer, Action public void EndPointers() { - if (mousePointer.Id != Pointer.INVALID_POINTER) + if (mousePointer != null) { endPointer(mousePointer.Id); + mousePointer = null; } - if (fakeMousePointer.Id != Pointer.INVALID_POINTER) + if (fakeMousePointer != null) { endPointer(fakeMousePointer.Id); + fakeMousePointer = null; } } @@ -75,25 +78,28 @@ public void UpdateInput() if (Input.GetMouseButtonUp(0)) { // Release happened first? - if (mousePointer.Id != Pointer.INVALID_POINTER) + if (mousePointer != null) { endPointer(mousePointer.Id); + mousePointer = null; upHandled = true; } } // Need to end fake pointer - if (fakeMousePointer.Id != Pointer.INVALID_POINTER && !(Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt))) + if (fakeMousePointer != null && !(Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt))) { endPointer(fakeMousePointer.Id); + fakeMousePointer = null; } if (Input.GetMouseButtonDown(0)) { var pos = Input.mousePosition; - if ((Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt)) && fakeMousePointer.Id == Pointer.INVALID_POINTER) - beginPointer(fakeMousePointer, new Vector2(pos.x, pos.y), true); - else if (mousePointer.Id == Pointer.INVALID_POINTER) beginPointer(mousePointer, new Vector2(pos.x, pos.y), true); + if ((Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt)) && fakeMousePointer == null) + fakeMousePointer = internalBeginPointer(new Vector2(pos.x, pos.y)); + else if (mousePointer == null) + mousePointer = internalBeginPointer(new Vector2(pos.x, pos.y)); } else if (Input.GetMouseButton(0)) { @@ -101,19 +107,20 @@ public void UpdateInput() if (mousePointPos != pos) { mousePointPos = pos; - if (fakeMousePointer.Id != Pointer.INVALID_POINTER) + if (fakeMousePointer != null) { - if (mousePointer.Id == Pointer.INVALID_POINTER) movePointer(fakeMousePointer.Id, new Vector2(pos.x, pos.y)); + if (mousePointer == null) movePointer(fakeMousePointer.Id, new Vector2(pos.x, pos.y)); else movePointer(mousePointer.Id, new Vector2(pos.x, pos.y)); } - else if (mousePointer.Id != Pointer.INVALID_POINTER) movePointer(mousePointer.Id, new Vector2(pos.x, pos.y)); + else if (mousePointer != null) movePointer(mousePointer.Id, new Vector2(pos.x, pos.y)); } } // Release mouse if we haven't done it yet - if (Input.GetMouseButtonUp(0) && !upHandled && mousePointer.Id != Pointer.INVALID_POINTER) + if (Input.GetMouseButtonUp(0) && !upHandled && mousePointer != null) { endPointer(mousePointer.Id); + mousePointer = null; } } @@ -123,13 +130,15 @@ public bool CancelPointer(Pointer pointer, bool @return) if (pointer.Equals(mousePointer)) { cancelPointer(mousePointer.Id); - if (@return) beginPointer(mousePointer, pointer.Position, false); + if (@return) mousePointer = internalReturnPointer(mousePointer, pointer.Position); + else mousePointer = null; return true; } - else if (pointer.Equals(fakeMousePointer)) + if (pointer.Equals(fakeMousePointer)) { cancelPointer(fakeMousePointer.Id); - if (@return) beginPointer(fakeMousePointer, pointer.Position, false); + if (@return) fakeMousePointer = internalReturnPointer(fakeMousePointer, pointer.Position); + else fakeMousePointer = null; return true; } return false; @@ -138,8 +147,16 @@ public bool CancelPointer(Pointer pointer, bool @return) /// public void Dispose() { - if (mousePointer.Id != Pointer.INVALID_POINTER) cancelPointer(mousePointer.Id); - if (fakeMousePointer.Id != Pointer.INVALID_POINTER) cancelPointer(fakeMousePointer.Id); + if (mousePointer != null) + { + cancelPointer(mousePointer.Id); + mousePointer = null; + } + if (fakeMousePointer != null) + { + cancelPointer(fakeMousePointer.Id); + fakeMousePointer = null; + } } #endregion @@ -148,19 +165,32 @@ public void Dispose() public void INTERNAL_ReleasePointer(Pointer pointer) { - if (pointer.Equals(mousePointer)) - { - mousePointer.INTERNAL_Reset(); - } else if (pointer.Equals(fakeMousePointer)) - { - fakeMousePointer.INTERNAL_Reset(); - } + var p = pointer as MousePointer; + if (p == null) return; + + mousePool.Release(p); } #endregion #region Private functions + private MousePointer internalBeginPointer(Vector2 position) + { + var pointer = mousePool.Get(); + beginPointer(pointer, position, true); + pointer.Flags |= Pointer.FLAG_FIRST_BUTTON; + return pointer; + } + + private MousePointer internalReturnPointer(MousePointer pointer, Vector2 position) + { + var newPointer = mousePool.Get(); + newPointer.CopyFrom(pointer); + beginPointer(newPointer, position, false); + return newPointer; + } + #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 fcf322af6..6d25bb39c 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs @@ -36,7 +36,7 @@ public bool HasPointers private Action endPointer; private Action cancelPointer; - private ObjectPool pointerPool; + private ObjectPool touchPool; private Dictionary systemToInternalId = new Dictionary(); private int pointersNum; @@ -56,7 +56,7 @@ public TouchHandler(Action beginPointer, Action(10, () => new TouchPointer(this), null, (t) => t.INTERNAL_Reset()); + touchPool = new ObjectPool(10, () => new TouchPointer(this), null, (t) => t.INTERNAL_Reset()); } #region Public methods @@ -135,10 +135,13 @@ public void UpdateInput() /// public bool CancelPointer(Pointer pointer, bool @return) { + var touch = pointer as TouchPointer; + if (touch == null) return false; + int fingerId = -1; foreach (var touchState in systemToInternalId) { - if (touchState.Value.Id == pointer.Id && touchState.Value.Phase != TouchPhase.Canceled) + if (touchState.Value.Id == touch.Id && touchState.Value.Phase != TouchPhase.Canceled) { fingerId = touchState.Key; break; @@ -146,16 +149,9 @@ public bool CancelPointer(Pointer pointer, bool @return) } if (fingerId > -1) { - if (@return) - { - internalCancelPointer(pointer.Id); - systemToInternalId[fingerId] = new TouchState(internalBeginPointer(pointer.Position, false).Id); - } - else - { - systemToInternalId[fingerId] = new TouchState(pointer.Id, TouchPhase.Canceled); - internalCancelPointer(pointer.Id); - } + internalCancelPointer(touch.Id); + if (@return) systemToInternalId[fingerId] = new TouchState(internalReturnPointer(touch, touch.Position).Id); + else systemToInternalId[fingerId] = new TouchState(touch.Id, TouchPhase.Canceled); return true; } return false; @@ -177,24 +173,34 @@ public void Dispose() public void INTERNAL_ReleasePointer(Pointer pointer) { - var touchPointer = pointer as TouchPointer; - if (touchPointer == null) return; + var p = pointer as TouchPointer; + if (p == null) return; - pointerPool.Release(touchPointer); + touchPool.Release(p); } #endregion #region Private functions - private Pointer internalBeginPointer(Vector2 position, bool remap = true) + private Pointer internalBeginPointer(Vector2 position) { pointersNum++; - var pointer = pointerPool.Get(); - beginPointer(pointer, position, remap); + var pointer = touchPool.Get(); + beginPointer(pointer, position, true); + pointer.Flags |= Pointer.FLAG_FIRST_BUTTON; return pointer; } + private TouchPointer internalReturnPointer(TouchPointer pointer, Vector2 position) + { + pointersNum++; + var newPointer = touchPool.Get(); + newPointer.CopyFrom(pointer); + beginPointer(newPointer, position, false); + return newPointer; + } + private void internalEndPointer(int id) { pointersNum--; diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs index 4357f4eb0..3474e4341 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs @@ -20,48 +20,69 @@ namespace TouchScript.InputSources.InputHandlers /// public class Windows8PointerHandler : WindowsPointerHandler { + + private ObjectPool mousePool; + private ObjectPool penPool; private MousePointer mousePointer; private PenPointer penPointer; /// public Windows8PointerHandler(Action beginPointer, Action movePointer, Action endPointer, Action cancelPointer) : base(beginPointer, movePointer, endPointer, cancelPointer) { - mousePointer = new MousePointer(this); - penPointer = new PenPointer(this); + mousePool = new ObjectPool(4, () => new MousePointer(this), null, (t) => t.INTERNAL_Reset()); + penPool = new ObjectPool(2, () => new PenPointer(this), null, (t) => t.INTERNAL_Reset()); registerWindowProc(wndProcWin8); } + #region Public methods + /// public override bool CancelPointer(Pointer pointer, bool @return) { if (pointer.Equals(mousePointer)) { cancelPointer(mousePointer.Id); - if (@return) beginPointer(mousePointer, pointer.Position, false); + if (@return) mousePointer = internalReturnMousePointer(mousePointer, pointer.Position); + else mousePointer = null; return true; } if (pointer.Equals(penPointer)) { cancelPointer(penPointer.Id); - if (@return) beginPointer(penPointer, pointer.Position, false); + if (@return) penPointer = internalReturnPenPointer(penPointer, pointer.Position); + else penPointer = null; return true; } return base.CancelPointer(pointer, @return); } - #region Internal methods - - public override void INTERNAL_ReleasePointer(Pointer pointer) + /// + public override void Dispose() { - if (pointer.Equals(mousePointer)) + if (mousePointer != null) { - mousePointer.INTERNAL_Reset(); - } else if (pointer.Equals(penPointer)) + cancelPointer(mousePointer.Id); + mousePointer = null; + } + if (penPointer != null) { - penPointer.INTERNAL_Reset(); + cancelPointer(penPointer.Id); + penPointer = null; } - base.INTERNAL_ReleasePointer(pointer); + + base.Dispose(); + } + + #endregion + + #region Internal methods + + public override void INTERNAL_ReleasePointer(Pointer pointer) + { + if (pointer is MousePointer) mousePool.Release(pointer as MousePointer); + else if (pointer is PenPointer) penPool.Release(pointer as PenPointer); + else base.INTERNAL_ReleasePointer(pointer); } #endregion @@ -114,13 +135,13 @@ private void decodeWin8Touches(uint msg, IntPtr wParam, IntPtr lParam) switch (pointerInfo.pointerType) { case POINTER_INPUT_TYPE.PT_MOUSE: - beginPointer(mousePointer, position, true); + internalBeginMousePointer(position); break; case POINTER_INPUT_TYPE.PT_TOUCH: winTouchToInternalId.Add(pointerId, internalBeginTouchPointer(position).Id); break; case POINTER_INPUT_TYPE.PT_PEN: - beginPointer(penPointer, position, true); + internalBeginPenPointer(position); break; } } @@ -183,6 +204,35 @@ private void decodeWin8Touches(uint msg, IntPtr wParam, IntPtr lParam) break; } } + + private void internalBeginMousePointer(Vector2 position) + { + beginPointer(mousePointer, position, true); + mousePointer.Flags |= Pointer.FLAG_FIRST_BUTTON; + } + + private MousePointer internalReturnMousePointer(MousePointer pointer, Vector2 position) + { + var newPointer = mousePool.Get(); + newPointer.CopyFrom(pointer); + beginPointer(newPointer, position, false); + return newPointer; + } + + private void internalBeginPenPointer(Vector2 position) + { + beginPointer(penPointer, position, true); + penPointer.Flags |= Pointer.FLAG_FIRST_BUTTON; + } + + private PenPointer internalReturnPenPointer(PenPointer pointer, Vector2 position) + { + var newPointer = penPool.Get(); + newPointer.CopyFrom(pointer); + beginPointer(newPointer, position, false); + return newPointer; + } + } public class Windows7PointerHandler : WindowsPointerHandler @@ -351,10 +401,13 @@ public void UpdateInput() {} /// public virtual bool CancelPointer(Pointer pointer, bool @return) { + var touch = pointer as TouchPointer; + if (touch == null) return false; + int internalTouchId = -1; foreach (var t in winTouchToInternalId) { - if (t.Value == pointer.Id) + if (t.Value == touch.Id) { internalTouchId = t.Key; break; @@ -362,8 +415,8 @@ public virtual bool CancelPointer(Pointer pointer, bool @return) } if (internalTouchId > -1) { - cancelPointer(pointer.Id); - if (@return) winTouchToInternalId[internalTouchId] = internalBeginTouchPointer(pointer.Position, false).Id; + cancelPointer(touch.Id); + if (@return) winTouchToInternalId[internalTouchId] = internalReturnTouchPointer(touch, touch.Position).Id; return true; } return false; @@ -384,23 +437,32 @@ public virtual void Dispose() public virtual void INTERNAL_ReleasePointer(Pointer pointer) { - var touchPointer = pointer as TouchPointer; - if (touchPointer == null) return; + var p = pointer as TouchPointer; + if (p == null) return; - touchPool.Release(touchPointer); + touchPool.Release(p); } #endregion #region Protected methods - protected Pointer internalBeginTouchPointer(Vector2 position, bool remap = true) + protected Pointer internalBeginTouchPointer(Vector2 position) { var pointer = touchPool.Get(); - beginPointer(pointer, position, remap); + beginPointer(pointer, position, true); + pointer.Flags |= Pointer.FLAG_FIRST_BUTTON; return pointer; } + private TouchPointer internalReturnTouchPointer(TouchPointer pointer, Vector2 position) + { + var newPointer = touchPool.Get(); + newPointer.CopyFrom(pointer); + beginPointer(newPointer, position, false); + return newPointer; + } + protected void registerWindowProc(WndProcDelegate windowProc) { newWndProc = windowProc; diff --git a/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs index 8189e7b66..eaaf12be1 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs @@ -28,5 +28,21 @@ public ObjectPointer(IInputSource input) : base(input) } #endregion + + #region Public methods + + public override void CopyFrom(Pointer target) + { + base.CopyFrom(target); + var obj = target as ObjectPointer; + if (obj == null) return; + + ObjectId = obj.ObjectId; + Width = obj.Width; + Height = obj.Height; + Angle = obj.Angle; + } + + #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 55bd2d7d4..0d9c6c788 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs @@ -2,6 +2,7 @@ * @author Valentin Simonov / http://va.lent.in/ */ +using System; using TouchScript.Hit; using TouchScript.InputSources; using TouchScript.Layers; @@ -16,11 +17,47 @@ namespace TouchScript.Pointers /// public class Pointer { - #region Constants + /// + /// Invalid pointer id. + /// public const int INVALID_POINTER = -1; + /// + /// Indicates that this pointer is generated by script and is not mapped to any device input. + /// + public const uint FLAG_ARTIFICIAL = 1 << 0; + + /// + /// Indicates a primary action, analogous to a left mouse button down. + /// A or has this flag set when it is in contact with the digitizer surface. + /// A has this flag set when it is in contact with the digitizer surface with no buttons pressed. + /// A has this flag set when the left mouse button is down. + /// + public const uint FLAG_FIRST_BUTTON = 1 << 1; + + /// + /// 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. + /// + public const uint FLAG_SECOND_BUTTON = 1 << 2; + + /// + /// Analogous to a mouse wheel button down. + /// A or does not use this flag. + /// A does not use this flag. + /// A has this flag set when the mouse wheel button is down. + /// + public const uint FLAG_THIRD_BUTTON = 1 << 3; + + /// + /// Indicates that this pointer is in contact with the surface. When this flag is not set, it indicates a hovering pointer. + /// + public const uint FLAG_INCONTACT = FLAG_FIRST_BUTTON | FLAG_SECOND_BUTTON | FLAG_THIRD_BUTTON; + public enum PointerType { Touch, @@ -40,6 +77,8 @@ public enum PointerType public PointerType Type { get; protected set; } + public uint Flags { get; internal set; } + /// /// Original hit target. /// @@ -97,6 +136,20 @@ public ProjectionParams ProjectionParams #region Public methods + public virtual void CopyFrom(Pointer target) + { + Id = target.Id; + Type = target.Type; + Flags = target.Flags; + Target = target.Target; + Hit = target.Hit; + Layer = target.Layer; + InputSource = target.InputSource; + position = target.position; + PreviousPosition = target.PreviousPosition; + newPosition = target.newPosition; + } + /// public override bool Equals(object other) { @@ -129,7 +182,7 @@ public Pointer(IInputSource input) { Type = PointerType.Touch; InputSource = input; - INTERNAL_Reset(); + INTERNAL_Reset(); } #endregion @@ -149,6 +202,7 @@ internal void INTERNAL_Reset() Hit = default(TouchHit); Target = null; Layer = null; + Flags = 0; } internal void INTERNAL_ResetPosition() @@ -174,6 +228,5 @@ internal int INTERNAL_Release() } #endregion - } } \ No newline at end of file From fde2b05f601e1839b288d63dd7021e27c7c7e70b Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 3 Jul 2016 16:07:51 +0300 Subject: [PATCH 015/211] Renamed TouchScript.Debug namespace to TouchScript.DebugUtils. --- .../Base/PinnedTransformGestureBase.cs | 2 +- .../Gestures/Base/TransformGestureBase.cs | 2 +- .../Gestures/PinnedTransformGesture.cs | 2 +- .../Scripts/Gestures/TransformGesture.cs | 2 +- .../Scripts/TouchManagerInstance.cs | 2 +- .../Utils/{Debug.meta => DebugUtils.meta} | 0 .../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 + 10 files changed, 674 insertions(+), 5 deletions(-) rename Source/Assets/TouchScript/Scripts/Utils/{Debug.meta => DebugUtils.meta} (100%) create mode 100644 Source/Assets/TouchScript/Scripts/Utils/DebugUtils/DebugHelper.cs create mode 100644 Source/Assets/TouchScript/Scripts/Utils/DebugUtils/DebugHelper.cs.meta create mode 100644 Source/Assets/TouchScript/Scripts/Utils/DebugUtils/GLDebug.cs create mode 100644 Source/Assets/TouchScript/Scripts/Utils/DebugUtils/GLDebug.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Base/PinnedTransformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/Base/PinnedTransformGestureBase.cs index 426391b67..b68e7f494 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Base/PinnedTransformGestureBase.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Base/PinnedTransformGestureBase.cs @@ -10,7 +10,7 @@ #if TOUCHSCRIPT_DEBUG using System.Collections; -using TouchScript.Utils.Debug; +using TouchScript.Utils.DebugUtils; #endif namespace TouchScript.Gestures.Base diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs index 0fe272ee8..dea9abb3c 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs @@ -12,7 +12,7 @@ #if TOUCHSCRIPT_DEBUG using System.Collections; -using TouchScript.Utils.Debug; +using TouchScript.Utils.DebugUtils; #endif namespace TouchScript.Gestures.Base diff --git a/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs index 341fa7b95..b6d3746ac 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs @@ -8,7 +8,7 @@ using TouchScript.Utils.Geom; using TouchScript.Pointers; #if TOUCHSCRIPT_DEBUG -using TouchScript.Utils.Debug; +using TouchScript.Utils.DebugUtils; #endif using UnityEngine; diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs index 73c7c1488..415908778 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs @@ -8,7 +8,7 @@ using TouchScript.Utils; using TouchScript.Pointers; #if TOUCHSCRIPT_DEBUG -using TouchScript.Utils.Debug; +using TouchScript.Utils.DebugUtils; #endif using UnityEngine; diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs index 4524cdf30..37503985b 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs @@ -12,7 +12,7 @@ using TouchScript.Utils; using TouchScript.Pointers; #if TOUCHSCRIPT_DEBUG -using TouchScript.Utils.Debug; +using TouchScript.Utils.DebugUtils; #endif using UnityEngine; diff --git a/Source/Assets/TouchScript/Scripts/Utils/Debug.meta b/Source/Assets/TouchScript/Scripts/Utils/DebugUtils.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/Utils/Debug.meta rename to Source/Assets/TouchScript/Scripts/Utils/DebugUtils.meta diff --git a/Source/Assets/TouchScript/Scripts/Utils/DebugUtils/DebugHelper.cs b/Source/Assets/TouchScript/Scripts/Utils/DebugUtils/DebugHelper.cs new file mode 100644 index 000000000..6643dcba8 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Utils/DebugUtils/DebugHelper.cs @@ -0,0 +1,20 @@ +/* + * @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 new file mode 100644 index 000000000..5b1668f61 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Utils/DebugUtils/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/Utils/DebugUtils/GLDebug.cs b/Source/Assets/TouchScript/Scripts/Utils/DebugUtils/GLDebug.cs new file mode 100644 index 000000000..8c342a185 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Utils/DebugUtils/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.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 new file mode 100644 index 000000000..35dd6354f --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Utils/DebugUtils/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: From 8f3aea20275d4ff441ec4987c06ba6290e4a620f Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 3 Jul 2016 16:16:05 +0300 Subject: [PATCH 016/211] Added Flags to Pointer Visualizer. --- .../Behaviors/Visualizer/TouchVisualizerEditor.cs | 4 +++- .../Scripts/Behaviors/Visualizer/PointerProxy.cs | 15 ++++++++++++++- .../Behaviors/Visualizer/PointerVisualizer.cs | 14 ++++++++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs b/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs index b4fd352f6..c6151328e 100644 --- a/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs +++ b/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs @@ -10,11 +10,12 @@ namespace TouchScript.Editor.Behaviors.Visualizer internal sealed class TouchVisualizerEditor : UnityEditor.Editor { - private SerializedProperty touchProxy, useDPI, touchSize, showTouchId; + private SerializedProperty touchProxy, useDPI, touchSize, showTouchId, showFlags; private void OnEnable() { showTouchId = serializedObject.FindProperty("showPointerId"); + showFlags = serializedObject.FindProperty("showFlags"); touchProxy = serializedObject.FindProperty("pointerProxy"); useDPI = serializedObject.FindProperty("useDPI"); touchSize = serializedObject.FindProperty("pointerSize"); @@ -27,6 +28,7 @@ public override void OnInspectorGUI() EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(touchProxy, new GUIContent("Pointer Proxy")); EditorGUILayout.PropertyField(showTouchId, new GUIContent("Show Pointer Id")); + EditorGUILayout.PropertyField(showFlags, new GUIContent("Show Flags")); EditorGUILayout.PropertyField(useDPI, new GUIContent("Use DPI")); if (useDPI.boolValue) diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs index 7ec855964..8c0ccf2a5 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs @@ -35,7 +35,7 @@ protected override void updateOnce(Pointer pointer) gameObject.name = stringBuilder.ToString(); if (Text == null) return; - if (!ShowPointerId) return; + if (!ShowPointerId && !ShowFlags) return; stringBuilder.Length = 0; if (ShowPointerId) @@ -43,6 +43,13 @@ protected override void updateOnce(Pointer pointer) stringBuilder.Append("Id: "); stringBuilder.Append(pointer.Id); } + if (ShowFlags) + { + if (stringBuilder.Length > 0) stringBuilder.Append("\n"); + stringBuilder.Append("Flags: "); + stringBuilder.Append(pointer.Flags); + } + Text.text = stringBuilder.ToString(); } @@ -76,6 +83,12 @@ public int Size /// 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 diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs index a08ce3229..e97512ad9 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs @@ -41,6 +41,16 @@ public bool ShowPointerId set { showPointerId = 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 + { + get { return showFlags; } + set { showFlags = value; } + } + /// /// Gets or sets whether is using DPI to scale pointer cursors. /// @@ -71,6 +81,9 @@ public float PointerSize [SerializeField] private bool showPointerId = true; + [SerializeField] + private bool showFlags = true; + [SerializeField] private bool useDPI = true; @@ -164,6 +177,7 @@ private void pointersBeganHandler(object sender, PointerEventArgs e) var proxy = pool.Get(); proxy.Size = getPointerSize(); proxy.ShowPointerId = showPointerId; + proxy.ShowFlags = showFlags; proxy.Init(rect, pointer); proxies.Add(pointer.Id, proxy); } From f69ae093a50c0f38b6988e8c50b6525bc2f73654 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 3 Jul 2016 16:21:34 +0300 Subject: [PATCH 017/211] MouseHandler users FLAG_ARTIFICIAL for the fake touch. --- .../Scripts/InputSources/InputHandlers/MouseHandler.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs index 4e6daf0fc..df80a3276 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs @@ -97,9 +97,9 @@ public void UpdateInput() { var pos = Input.mousePosition; if ((Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt)) && fakeMousePointer == null) - fakeMousePointer = internalBeginPointer(new Vector2(pos.x, pos.y)); + fakeMousePointer = internalBeginPointer(new Vector2(pos.x, pos.y), Pointer.FLAG_FIRST_BUTTON | Pointer.FLAG_ARTIFICIAL); else if (mousePointer == null) - mousePointer = internalBeginPointer(new Vector2(pos.x, pos.y)); + mousePointer = internalBeginPointer(new Vector2(pos.x, pos.y), Pointer.FLAG_FIRST_BUTTON); } else if (Input.GetMouseButton(0)) { @@ -175,11 +175,11 @@ public void INTERNAL_ReleasePointer(Pointer pointer) #region Private functions - private MousePointer internalBeginPointer(Vector2 position) + private MousePointer internalBeginPointer(Vector2 position, uint flags) { var pointer = mousePool.Get(); beginPointer(pointer, position, true); - pointer.Flags |= Pointer.FLAG_FIRST_BUTTON; + pointer.Flags |= flags; return pointer; } From c1334a20b45e6beb7e38cc73ab84872bbc25a511 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 3 Jul 2016 17:17:52 +0300 Subject: [PATCH 018/211] PointerVIsualizer bool values are aligned left in the editor. --- .../Scripts/Behaviors/Visualizer/PointerVisualizer.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs index e97512ad9..d5a5fa8a5 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.Utils.Attributes; using UnityEngine; namespace TouchScript.Behaviors.Visualizer @@ -79,12 +80,15 @@ public float PointerSize private PointerProxyBase pointerProxy; [SerializeField] + [ToggleLeft] private bool showPointerId = true; [SerializeField] + [ToggleLeft] private bool showFlags = true; [SerializeField] + [ToggleLeft] private bool useDPI = true; [SerializeField] From 4ce6ba705f23ee54297295ae9f5ccd0d2a3baa87 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 3 Jul 2016 17:18:23 +0300 Subject: [PATCH 019/211] Added a " " between checkbox and label in ToggleLeft. --- .../TouchScript/Editor/Utils/PropertyDrawers/ToggleLeftDrawer.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/ToggleLeftDrawer.cs b/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/ToggleLeftDrawer.cs index 18f86b140..01959b3c1 100644 --- a/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/ToggleLeftDrawer.cs +++ b/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/ToggleLeftDrawer.cs @@ -10,6 +10,7 @@ internal sealed class ToggleLeftDrawer : PropertyDrawer public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { label = EditorGUI.BeginProperty(position, label, property); + label.text = " " + label.text; EditorGUI.BeginChangeCheck(); var boolValue = EditorGUI.ToggleLeft(position, label, property.boolValue); if (EditorGUI.EndChangeCheck()) From 67141c1ff8b358ff10c45940f617896256568b21 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 3 Jul 2016 17:32:14 +0300 Subject: [PATCH 020/211] Ability to turn off emulated mouse in mouse input. --- .../Visualizer/TouchVisualizerEditor.cs | 2 - .../InputSources/StandardInputEditor.cs | 29 +++++-- .../InputHandlers/MouseHandler.cs | 27 ++++++- .../Scripts/InputSources/StandardInput.cs | 80 +++++++++++++++++-- 4 files changed, 118 insertions(+), 20 deletions(-) diff --git a/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs b/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs index c6151328e..09f952bac 100644 --- a/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs +++ b/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs @@ -25,7 +25,6 @@ public override void OnInspectorGUI() { serializedObject.Update(); - EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(touchProxy, new GUIContent("Pointer Proxy")); EditorGUILayout.PropertyField(showTouchId, new GUIContent("Show Pointer Id")); EditorGUILayout.PropertyField(showFlags, new GUIContent("Show Flags")); @@ -33,7 +32,6 @@ public override void OnInspectorGUI() EditorGUILayout.PropertyField(useDPI, new GUIContent("Use DPI")); if (useDPI.boolValue) { - EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(touchSize, new GUIContent("Pointer Size (cm)")); } diff --git a/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs b/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs index 44a324d6f..3870ff347 100644 --- a/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs +++ b/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs @@ -12,24 +12,30 @@ internal sealed class StandardInputEditor : InputSourceEditor webGLTouch, windows8Mouse, windows7Mouse, - universalWindowsMouse; + universalWindowsMouse, + emulateSecondMousePointer; + + private StandardInput instance; protected override void OnEnable() { base.OnEnable(); - windows8Touch = serializedObject.FindProperty("Windows8API"); - windows7Touch = serializedObject.FindProperty("Windows7API"); - webPlayerTouch = serializedObject.FindProperty("WebPlayerTouch"); - webGLTouch = serializedObject.FindProperty("WebGLTouch"); - windows8Mouse = serializedObject.FindProperty("Windows8Mouse"); - windows7Mouse = serializedObject.FindProperty("Windows7Mouse"); - universalWindowsMouse = serializedObject.FindProperty("UniversalWindowsMouse"); + instance = target as StandardInput; + windows8Touch = serializedObject.FindProperty("windows8API"); + windows7Touch = serializedObject.FindProperty("windows7API"); + webPlayerTouch = serializedObject.FindProperty("webPlayerTouch"); + webGLTouch = serializedObject.FindProperty("webGLTouch"); + windows8Mouse = serializedObject.FindProperty("windows8Mouse"); + windows7Mouse = serializedObject.FindProperty("windows7Mouse"); + universalWindowsMouse = serializedObject.FindProperty("universalWindowsMouse"); + emulateSecondMousePointer = serializedObject.FindProperty("emulateSecondMousePointer"); } public override void OnInspectorGUI() { serializedObject.UpdateIfDirtyOrScript(); + EditorGUILayout.PropertyField(windows8Touch); EditorGUILayout.PropertyField(windows7Touch); EditorGUILayout.PropertyField(webPlayerTouch); @@ -37,6 +43,13 @@ public override void OnInspectorGUI() EditorGUILayout.PropertyField(windows8Mouse); EditorGUILayout.PropertyField(windows7Mouse); EditorGUILayout.PropertyField(universalWindowsMouse); + + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(emulateSecondMousePointer); + if (EditorGUI.EndChangeCheck()) + { + instance.EmulateSecondMousePointer = emulateSecondMousePointer.boolValue; + } serializedObject.ApplyModifiedProperties(); base.OnInspectorGUI(); } diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs index df80a3276..177d46d7e 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs @@ -16,10 +16,22 @@ public class MouseHandler : IInputSource, IDisposable { #region Public properties + public bool EmulateSecondMousePointer + { + get { return emulateSecondMousePointer; } + set + { + emulateSecondMousePointer = value; + if (fakeMousePointer != null) CancelPointer(fakeMousePointer, false); + } + } + #endregion #region Private variables + private bool emulateSecondMousePointer = true; + private Action beginPointer; private Action movePointer; private Action endPointer; @@ -87,7 +99,9 @@ public void UpdateInput() } // Need to end fake pointer - if (fakeMousePointer != null && !(Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt))) + if (emulateSecondMousePointer + && fakeMousePointer != null + && !(Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt))) { endPointer(fakeMousePointer.Id); fakeMousePointer = null; @@ -96,10 +110,16 @@ public void UpdateInput() if (Input.GetMouseButtonDown(0)) { var pos = Input.mousePosition; - if ((Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt)) && fakeMousePointer == null) + if (emulateSecondMousePointer + && fakeMousePointer == null + && (Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt))) + { fakeMousePointer = internalBeginPointer(new Vector2(pos.x, pos.y), Pointer.FLAG_FIRST_BUTTON | Pointer.FLAG_ARTIFICIAL); + } else if (mousePointer == null) + { mousePointer = internalBeginPointer(new Vector2(pos.x, pos.y), Pointer.FLAG_FIRST_BUTTON); + } } else if (Input.GetMouseButton(0)) { @@ -107,7 +127,8 @@ public void UpdateInput() if (mousePointPos != pos) { mousePointPos = pos; - if (fakeMousePointer != null) + if (emulateSecondMousePointer + && fakeMousePointer != null) { if (mousePointer == null) movePointer(fakeMousePointer.Id, new Vector2(pos.x, pos.y)); else movePointer(mousePointer.Id, new Vector2(pos.x, pos.y)); diff --git a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs index 924c61da4..9d04781b5 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs @@ -7,6 +7,7 @@ #endif using TouchScript.InputSources.InputHandlers; using TouchScript.Pointers; +using TouchScript.Utils.Attributes; using UnityEngine; namespace TouchScript.InputSources @@ -80,42 +81,106 @@ public enum Windows7APIType /// /// Pointer API to use on Windows 8. /// - public Windows8APIType Windows8API = Windows8APIType.Windows8; + public Windows8APIType Windows8API + { + get { return windows8API; } + } /// /// Pointer API to use on Windows 7. /// - public Windows7APIType Windows7API = Windows7APIType.Windows7; + public Windows7APIType Windows7API + { + get { return windows7API; } + } /// /// Initialize touch input in WebPlayer or not. /// - public bool WebPlayerTouch = true; + public bool WebPlayerTouch + { + get { return webPlayerTouch; } + } /// /// Initialize touch input in WebGL or not. /// - public bool WebGLTouch = true; + public bool WebGLTouch + { + get { return webGLTouch; } + } /// /// Initialize mouse input on Windows 8+ or not. /// - public bool Windows8Mouse = true; + public bool Windows8Mouse + { + get { return windows8Mouse; } + } /// /// Initialize mouse input on Windows 7 or not. /// - public bool Windows7Mouse = true; + public bool Windows7Mouse + { + get { return windows7Mouse; } + } /// /// Initialize mouse input on UWP or not. /// - public bool UniversalWindowsMouse = true; + public bool UniversalWindowsMouse + { + get { return universalWindowsMouse; } + } + + /// + /// Use emulated second mouse pointer with ALT or not. + /// + public bool EmulateSecondMousePointer + { + get { return emulateSecondMousePointer; } + set + { + emulateSecondMousePointer = value; + if (mouseHandler != null) mouseHandler.EmulateSecondMousePointer = value; + } + } #endregion #region Private variables + [SerializeField] + private Windows8APIType windows8API = Windows8APIType.Windows8; + + [SerializeField] + private Windows7APIType windows7API = Windows7APIType.Windows7; + + [ToggleLeft] + [SerializeField] + private bool webPlayerTouch = true; + + [ToggleLeft] + [SerializeField] + private bool webGLTouch = true; + + [ToggleLeft] + [SerializeField] + private bool windows8Mouse = true; + + [ToggleLeft] + [SerializeField] + private bool windows7Mouse = true; + + [ToggleLeft] + [SerializeField] + private bool universalWindowsMouse = true; + + [ToggleLeft] + [SerializeField] + private bool emulateSecondMousePointer = true; + private MouseHandler mouseHandler; private TouchHandler touchHandler; #if UNITY_STANDALONE_WIN && !UNITY_EDITOR @@ -270,6 +335,7 @@ protected override void OnDisable() private void enableMouse() { mouseHandler = new MouseHandler(beginPointer, movePointer, endPointer, cancelPointer); + mouseHandler.EmulateSecondMousePointer = emulateSecondMousePointer; Debug.Log("[TouchScript] Initialized Unity mouse input."); } From fa5a177207eab2c9199260adec735afc9a004bb3 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 3 Jul 2016 17:34:39 +0300 Subject: [PATCH 021/211] Added @author comments to editor scripts which didn't have it. --- .../Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs | 5 ++++- .../TouchScript/Editor/InputSources/InputSourceEditor.cs | 4 ++++ .../TouchScript/Editor/InputSources/MobileInputEditor.cs | 4 ++++ .../TouchScript/Editor/InputSources/MouseInputEditor.cs | 4 ++++ .../TouchScript/Editor/InputSources/StandardInputEditor.cs | 6 +++++- Source/Assets/TouchScript/Editor/Layers/UILayerEditor.cs | 1 - .../Editor/Utils/PropertyDrawers/NullToggleDrawer.cs | 4 ++++ .../Editor/Utils/PropertyDrawers/ToggleLeftDrawer.cs | 4 ++++ 8 files changed, 29 insertions(+), 3 deletions(-) diff --git a/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs b/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs index 09f952bac..a341ad656 100644 --- a/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs +++ b/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs @@ -1,4 +1,7 @@ - +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + using TouchScript.Behaviors.Visualizer; using UnityEditor; using UnityEngine; diff --git a/Source/Assets/TouchScript/Editor/InputSources/InputSourceEditor.cs b/Source/Assets/TouchScript/Editor/InputSources/InputSourceEditor.cs index f369b51b9..1bfa60eb3 100644 --- a/Source/Assets/TouchScript/Editor/InputSources/InputSourceEditor.cs +++ b/Source/Assets/TouchScript/Editor/InputSources/InputSourceEditor.cs @@ -1,3 +1,7 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + using TouchScript.Editor.Utils; using UnityEditor; using UnityEngine; diff --git a/Source/Assets/TouchScript/Editor/InputSources/MobileInputEditor.cs b/Source/Assets/TouchScript/Editor/InputSources/MobileInputEditor.cs index 493983e23..3b5b213d2 100644 --- a/Source/Assets/TouchScript/Editor/InputSources/MobileInputEditor.cs +++ b/Source/Assets/TouchScript/Editor/InputSources/MobileInputEditor.cs @@ -1,3 +1,7 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + using TouchScript.InputSources; using UnityEditor; diff --git a/Source/Assets/TouchScript/Editor/InputSources/MouseInputEditor.cs b/Source/Assets/TouchScript/Editor/InputSources/MouseInputEditor.cs index f43294bdf..848e3e5d3 100644 --- a/Source/Assets/TouchScript/Editor/InputSources/MouseInputEditor.cs +++ b/Source/Assets/TouchScript/Editor/InputSources/MouseInputEditor.cs @@ -1,3 +1,7 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + using TouchScript.InputSources; using UnityEditor; diff --git a/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs b/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs index 3870ff347..9a66a78b1 100644 --- a/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs +++ b/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs @@ -1,4 +1,8 @@ -using TouchScript.InputSources; +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using TouchScript.InputSources; using UnityEditor; namespace TouchScript.Editor.InputSources diff --git a/Source/Assets/TouchScript/Editor/Layers/UILayerEditor.cs b/Source/Assets/TouchScript/Editor/Layers/UILayerEditor.cs index 300e32b23..0fc7f5f0f 100644 --- a/Source/Assets/TouchScript/Editor/Layers/UILayerEditor.cs +++ b/Source/Assets/TouchScript/Editor/Layers/UILayerEditor.cs @@ -4,7 +4,6 @@ using TouchScript.Layers; using UnityEditor; -using UnityEngine; namespace TouchScript.Editor.Layers { diff --git a/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/NullToggleDrawer.cs b/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/NullToggleDrawer.cs index e5ac4f26a..34e4280be 100644 --- a/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/NullToggleDrawer.cs +++ b/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/NullToggleDrawer.cs @@ -1,3 +1,7 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + using TouchScript.Utils.Attributes; using UnityEditor; using UnityEngine; diff --git a/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/ToggleLeftDrawer.cs b/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/ToggleLeftDrawer.cs index 01959b3c1..2a6e5ae51 100644 --- a/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/ToggleLeftDrawer.cs +++ b/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/ToggleLeftDrawer.cs @@ -1,3 +1,7 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + using TouchScript.Utils.Attributes; using UnityEditor; using UnityEngine; From d4a4adacca3991a8b47ff1a09e847e3e331957d3 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 3 Jul 2016 17:39:23 +0300 Subject: [PATCH 022/211] Forgot to commit remoted Debug folder. --- .../Scripts/Utils/Debug/DebugHelper.cs | 20 - .../Scripts/Utils/Debug/DebugHelper.cs.meta | 12 - .../Scripts/Utils/Debug/GLDebug.cs | 625 ------------------ .../Scripts/Utils/Debug/GLDebug.cs.meta | 12 - 4 files changed, 669 deletions(-) delete mode 100644 Source/Assets/TouchScript/Scripts/Utils/Debug/DebugHelper.cs delete mode 100644 Source/Assets/TouchScript/Scripts/Utils/Debug/DebugHelper.cs.meta delete mode 100644 Source/Assets/TouchScript/Scripts/Utils/Debug/GLDebug.cs delete mode 100644 Source/Assets/TouchScript/Scripts/Utils/Debug/GLDebug.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/Utils/Debug/DebugHelper.cs b/Source/Assets/TouchScript/Scripts/Utils/Debug/DebugHelper.cs deleted file mode 100644 index fe0ea37df..000000000 --- a/Source/Assets/TouchScript/Scripts/Utils/Debug/DebugHelper.cs +++ /dev/null @@ -1,20 +0,0 @@ -/* - * @author Valentin Simonov / http://va.lent.in/ - */ - -using UnityEngine; - -#if TOUCHSCRIPT_DEBUG - -namespace TouchScript.Utils.Debug -{ - 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/Debug/DebugHelper.cs.meta b/Source/Assets/TouchScript/Scripts/Utils/Debug/DebugHelper.cs.meta deleted file mode 100644 index 5b1668f61..000000000 --- a/Source/Assets/TouchScript/Scripts/Utils/Debug/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/Debug/GLDebug.cs b/Source/Assets/TouchScript/Scripts/Utils/Debug/GLDebug.cs deleted file mode 100644 index 157373575..000000000 --- a/Source/Assets/TouchScript/Scripts/Utils/Debug/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.Debug -{ - 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/Debug/GLDebug.cs.meta b/Source/Assets/TouchScript/Scripts/Utils/Debug/GLDebug.cs.meta deleted file mode 100644 index 35dd6354f..000000000 --- a/Source/Assets/TouchScript/Scripts/Utils/Debug/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 5a6241be61b8b46b13f1ced77788c098cb0ecfd5 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 3 Jul 2016 17:39:36 +0300 Subject: [PATCH 023/211] Renamed Clusters to Clusters2D. --- .../Scripts/Clusters/{Clusters.cs => Clusters2D.cs} | 6 +++--- .../Clusters/{Clusters.cs.meta => Clusters2D.cs.meta} | 0 .../Gestures/Clustered/ClusteredScreenTransformGesture.cs | 2 +- .../Scripts/Gestures/Clustered/ClusteredTransformGesture.cs | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) rename Source/Assets/TouchScript/Scripts/Clusters/{Clusters.cs => Clusters2D.cs} (99%) rename Source/Assets/TouchScript/Scripts/Clusters/{Clusters.cs.meta => Clusters2D.cs.meta} (100%) diff --git a/Source/Assets/TouchScript/Scripts/Clusters/Clusters.cs b/Source/Assets/TouchScript/Scripts/Clusters/Clusters2D.cs similarity index 99% rename from Source/Assets/TouchScript/Scripts/Clusters/Clusters.cs rename to Source/Assets/TouchScript/Scripts/Clusters/Clusters2D.cs index d4752a99c..3082e4fcf 100644 --- a/Source/Assets/TouchScript/Scripts/Clusters/Clusters.cs +++ b/Source/Assets/TouchScript/Scripts/Clusters/Clusters2D.cs @@ -12,7 +12,7 @@ namespace TouchScript.Clusters /// /// Represents a pool of points separated into two clusters. /// - public sealed class Clusters + public sealed class Clusters2D { #region Constants @@ -80,9 +80,9 @@ public bool HasClusters #endregion /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// - public Clusters() + public Clusters2D() { MinPointsDistance = 0; markDirty(); diff --git a/Source/Assets/TouchScript/Scripts/Clusters/Clusters.cs.meta b/Source/Assets/TouchScript/Scripts/Clusters/Clusters2D.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/Clusters/Clusters.cs.meta rename to Source/Assets/TouchScript/Scripts/Clusters/Clusters2D.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredScreenTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredScreenTransformGesture.cs index 94f9f6015..42356e234 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredScreenTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredScreenTransformGesture.cs @@ -19,7 +19,7 @@ public class ClusteredScreenTransformGesture : ScreenTransformGesture { #region Private variables - private Clusters.Clusters clusters = new Clusters.Clusters(); + private Clusters.Clusters2D clusters = new Clusters.Clusters2D(); #endregion diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredTransformGesture.cs index f5832ce6d..b5a7799e4 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredTransformGesture.cs @@ -19,7 +19,7 @@ public class ClusteredTransformGesture : TransformGesture { #region Private variables - private Clusters.Clusters clusters = new Clusters.Clusters(); + private Clusters.Clusters2D clusters = new Clusters.Clusters2D(); #endregion From f2815eeca22b7768388e18e7fd49fbee4badafb6 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 3 Jul 2016 17:59:00 +0300 Subject: [PATCH 024/211] Proper pointer return and flags logic to TUIO Input. --- .../TUIO/Scripts/InputSources/TuioInput.cs | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs b/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs index dc2d7cd8b..37eb59401 100644 --- a/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs +++ b/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs @@ -145,7 +145,7 @@ public override bool CancelPointer(Pointer pointer, bool @return) cancelPointer(pointer.Id); if (@return) { - cursorToInternalId[cursor] = internalBeginTouch(pointer.Position, false); + cursorToInternalId[cursor] = internalReturnTouch(pointer as TouchPointer, pointer.Position); } else { @@ -170,7 +170,7 @@ public override bool CancelPointer(Pointer pointer, bool @return) cancelPointer(pointer.Id); if (@return) { - objectToInternalId[obj] = internalBeginObject(pointer.Position, false); + objectToInternalId[obj] = internalReturnObject(pointer as ObjectPointer, pointer.Position); } else { @@ -193,7 +193,7 @@ public override bool CancelPointer(Pointer pointer, bool @return) cancelPointer(pointer.Id); if (@return) { - blobToInternalId[blob] = internalBeginObject(pointer.Position, false); + blobToInternalId[blob] = internalReturnObject(pointer as ObjectPointer, pointer.Position); } else { @@ -262,20 +262,38 @@ protected override void OnDisable() #region Private functions - private TouchPointer internalBeginTouch(Vector2 position, bool remap = true) + private TouchPointer internalBeginTouch(Vector2 position) { var pointer = touchPool.Get(); - beginPointer(pointer, position, remap); + beginPointer(pointer, position, true); + pointer.Flags |= Pointer.FLAG_FIRST_BUTTON; return pointer; } + private TouchPointer internalReturnTouch(TouchPointer pointer, Vector2 position) + { + var newPointer = touchPool.Get(); + newPointer.CopyFrom(pointer); + beginPointer(newPointer, position, false); + return newPointer; + } + private ObjectPointer internalBeginObject(Vector2 position, bool remap = true) { var pointer = objectPool.Get(); beginPointer(pointer, position, remap); + pointer.Flags |= Pointer.FLAG_FIRST_BUTTON; return pointer; } + private ObjectPointer internalReturnObject(ObjectPointer pointer, Vector2 position) + { + var newPointer = objectPool.Get(); + newPointer.CopyFrom(pointer); + beginPointer(newPointer, position, false); + return newPointer; + } + private void connect() { if (!Application.isPlaying) return; From 4544163dd573e3383746d79dc202748ce430f764 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 3 Jul 2016 18:26:57 +0300 Subject: [PATCH 025/211] Fixed some spaces in editor labels. --- .../Gestures/Base/PinnedTransformGestureBaseEditor.cs | 4 ++-- .../Editor/Gestures/Base/TransformGestureBaseEditor.cs | 6 +++--- Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs | 2 +- .../Editor/Utils/PropertyDrawers/NullToggleDrawer.cs | 1 + 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Source/Assets/TouchScript/Editor/Gestures/Base/PinnedTransformGestureBaseEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/Base/PinnedTransformGestureBaseEditor.cs index e30f044f5..805f52518 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/Base/PinnedTransformGestureBaseEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/Base/PinnedTransformGestureBaseEditor.cs @@ -11,8 +11,8 @@ namespace TouchScript.Editor.Gestures.Base internal class PinnedTransformGestureBaseEditor : GestureEditor { public static readonly GUIContent TYPE = new GUIContent("Transform Type", "Specifies what gestures should be detected: Rotation, Scaling."); - public static readonly GUIContent TYPE_ROTATION = new GUIContent("Rotation", "Rotating with two or more fingers."); - public static readonly GUIContent TYPE_SCALING = new GUIContent("Scaling", "Scaling with two or more fingers."); + public static readonly GUIContent TYPE_ROTATION = new GUIContent(" Rotation", "Rotating with two or more fingers."); + public static readonly GUIContent TYPE_SCALING = new GUIContent(" Scaling", "Scaling with two or more fingers."); public static readonly GUIContent SCREEN_TRANSFORM_THRESHOLD = new GUIContent("Movement Threshold (cm)", "Minimum distance in cm pointers must move for the gesture to begin."); protected SerializedProperty type; diff --git a/Source/Assets/TouchScript/Editor/Gestures/Base/TransformGestureBaseEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/Base/TransformGestureBaseEditor.cs index 149ce164a..c0882805d 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/Base/TransformGestureBaseEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/Base/TransformGestureBaseEditor.cs @@ -11,9 +11,9 @@ namespace TouchScript.Editor.Gestures.Base internal class TransformGestureBaseEditor : GestureEditor { public static readonly GUIContent TYPE = new GUIContent("Transform Type", "Specifies what gestures should be detected: Translation, Rotation, Scaling."); - public static readonly GUIContent TYPE_TRANSLATION = new GUIContent("Translation", "Dragging with one ore more fingers."); - public static readonly GUIContent TYPE_ROTATION = new GUIContent("Rotation", "Rotating with two or more fingers."); - public static readonly GUIContent TYPE_SCALING = new GUIContent("Scaling", "Scaling with two or more fingers."); + public static readonly GUIContent TYPE_TRANSLATION = new GUIContent(" Translation", "Dragging with one ore more fingers."); + public static readonly GUIContent TYPE_ROTATION = new GUIContent(" Rotation", "Rotating with two or more fingers."); + public static readonly GUIContent TYPE_SCALING = new GUIContent(" Scaling", "Scaling with two or more fingers."); public static readonly GUIContent 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 SCREEN_TRANSFORM_THRESHOLD = new GUIContent("Movement Threshold (cm)", "Minimum distance in cm pointers must move for the gesture to begin."); diff --git a/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs index 08d8d394a..c6ea3d272 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/GestureEditor.cs @@ -25,7 +25,7 @@ internal class GestureEditor : UnityEditor.Editor private static readonly GUIContent 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."); private static readonly GUIContent COMBINE_TOUCH_POINTERS = new GUIContent("Combine Interval (sec)", COMBINE_POINTERS.tooltip); private static readonly GUIContent REQUIRE_GESTURE_TO_FAIL = new GUIContent("Require Other Gesture to Fail", "Gesture which must fail for this gesture to start."); - private static readonly GUIContent LIMIT_POINTERS = new GUIContent("Limit Pointers", ""); + private static readonly GUIContent LIMIT_POINTERS = new GUIContent(" Limit Pointers", ""); protected bool shouldDrawCombineTouches = false; diff --git a/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/NullToggleDrawer.cs b/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/NullToggleDrawer.cs index 34e4280be..5d908bfe8 100644 --- a/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/NullToggleDrawer.cs +++ b/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/NullToggleDrawer.cs @@ -137,6 +137,7 @@ public override void OnGUI(Rect position, SerializedProperty property, GUIConten private void Begin(Rect position, SerializedProperty property, GUIContent label) { label = EditorGUI.BeginProperty(position, label, property); + label.text = " " + label.text; position.height = 16; expanded = EditorGUI.ToggleLeft(position, label, expanded == true); } From 4e7dce47765bcdc6692c1cc05063ab52c8286809 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 3 Jul 2016 18:32:43 +0300 Subject: [PATCH 026/211] Updated example scenes. --- .../TouchScript/Examples/Camera/Camera.unity | 18 +-- .../Examples/Checkers/Checkers.unity | 37 +++--- .../TouchScript/Examples/Colors/Colors.unity | 24 ++-- .../TouchScript/Examples/Cube/Cube.unity | 26 ++--- .../Examples/Multiuser/Multiuser.unity | 87 +++++++------- .../TouchScript/Examples/Photos/Photos.unity | 23 ++++ .../TouchScript/Examples/Portal/Portal.unity | 108 ++++++++++-------- .../Examples/RawInput/RawInput.unity | 24 ++-- .../TouchScript/Examples/Taps/Taps.unity | 9 +- 9 files changed, 182 insertions(+), 174 deletions(-) diff --git a/Source/Assets/TouchScript/Examples/Camera/Camera.unity b/Source/Assets/TouchScript/Examples/Camera/Camera.unity index 2a3e264c3..f29f470d0 100644 --- a/Source/Assets/TouchScript/Examples/Camera/Camera.unity +++ b/Source/Assets/TouchScript/Examples/Camera/Camera.unity @@ -729,11 +729,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 74ae431eff8434b0897d3f7f1cff4311, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 - minTouches: 1 - maxTouches: 1 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 1 + maxPointers: 1 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -798,11 +799,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 74ae431eff8434b0897d3f7f1cff4311, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 - minTouches: 2 - maxTouches: 10 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 2 + maxPointers: 10 + combinePointers: 0 + combinePointersInterval: .300000012 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 5cdd294c2..3389c7e3b 100644 --- a/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity +++ b/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity @@ -337,7 +337,7 @@ Prefab: m_Modifications: - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: layers.Array.size - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: m_LocalPosition.x @@ -370,7 +370,7 @@ Prefab: - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: layers.Array.data[0] value: - objectReference: {fileID: 0} + objectReference: {fileID: 62216953} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} m_IsPrefabParent: 0 @@ -390,22 +390,14 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: advancedProps: 0 - TouchTags: - tagList: - - Touch - MouseTags: - tagList: - - Mouse - PenTags: - tagList: - - Pen - Windows8Touch: 0 - Windows7Touch: 0 - WebPlayerTouch: 1 - WebGLTouch: 1 - Windows8Mouse: 1 - Windows7Mouse: 1 - UniversalWindowsMouse: 1 + windows8API: 0 + windows7API: 0 + webPlayerTouch: 1 + webGLTouch: 1 + windows8Mouse: 1 + windows7Mouse: 1 + universalWindowsMouse: 1 + emulateSecondMousePointer: 1 --- !u!1001 &556842199 Prefab: m_ObjectHideFlags: 0 @@ -2130,11 +2122,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 38e07bff8743d4ee38bf724a7a2b4cbb, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} diff --git a/Source/Assets/TouchScript/Examples/Colors/Colors.unity b/Source/Assets/TouchScript/Examples/Colors/Colors.unity index 7508c3c40..7cf715d42 100644 --- a/Source/Assets/TouchScript/Examples/Colors/Colors.unity +++ b/Source/Assets/TouchScript/Examples/Colors/Colors.unity @@ -340,22 +340,14 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: advancedProps: 0 - TouchTags: - tagList: - - Touch - MouseTags: - tagList: - - Mouse - PenTags: - tagList: - - Pen - Windows8Touch: 0 - Windows7Touch: 0 - WebPlayerTouch: 1 - WebGLTouch: 1 - Windows8Mouse: 1 - Windows7Mouse: 1 - UniversalWindowsMouse: 1 + 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 c3e94de74..2f7cbe01e 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Cube.unity +++ b/Source/Assets/TouchScript/Examples/Cube/Cube.unity @@ -361,22 +361,14 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: advancedProps: 0 - TouchTags: - tagList: - - Touch - MouseTags: - tagList: - - Mouse - PenTags: - tagList: - - Pen - Windows8API: 0 - Windows7API: 0 - WebPlayerTouch: 1 - WebGLTouch: 1 - Windows8Mouse: 1 - Windows7Mouse: 1 - UniversalWindowsMouse: 1 + windows8API: 0 + windows7API: 0 + webPlayerTouch: 1 + webGLTouch: 1 + windows8Mouse: 1 + windows7Mouse: 1 + universalWindowsMouse: 1 + emulateSecondMousePointer: 1 --- !u!1 &732284827 GameObject: m_ObjectHideFlags: 0 @@ -761,6 +753,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1277,6 +1270,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 3fd90a8856e1a49eba25728d5aaac9f2, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 diff --git a/Source/Assets/TouchScript/Examples/Multiuser/Multiuser.unity b/Source/Assets/TouchScript/Examples/Multiuser/Multiuser.unity index b17cd18a8..75cc9ae9f 100644 --- a/Source/Assets/TouchScript/Examples/Multiuser/Multiuser.unity +++ b/Source/Assets/TouchScript/Examples/Multiuser/Multiuser.unity @@ -719,11 +719,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 7a878a6ff128243dfb1d89ca0273f059, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -920,11 +921,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 7a878a6ff128243dfb1d89ca0273f059, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -1068,22 +1070,14 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: advancedProps: 0 - TouchTags: - tagList: - - Touch - MouseTags: - tagList: - - Mouse - PenTags: - tagList: - - Pen - Windows8Touch: 0 - Windows7Touch: 0 - WebPlayerTouch: 1 - WebGLTouch: 1 - Windows8Mouse: 1 - Windows7Mouse: 1 - UniversalWindowsMouse: 1 + windows8API: 0 + windows7API: 0 + webPlayerTouch: 1 + webGLTouch: 1 + windows8Mouse: 1 + windows7Mouse: 1 + universalWindowsMouse: 1 + emulateSecondMousePointer: 1 --- !u!1001 &583512110 Prefab: m_ObjectHideFlags: 0 @@ -1365,11 +1359,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -1957,11 +1952,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 7a878a6ff128243dfb1d89ca0273f059, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -2110,11 +2106,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 38e07bff8743d4ee38bf724a7a2b4cbb, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -2575,11 +2572,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 38e07bff8743d4ee38bf724a7a2b4cbb, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -3556,11 +3554,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} diff --git a/Source/Assets/TouchScript/Examples/Photos/Photos.unity b/Source/Assets/TouchScript/Examples/Photos/Photos.unity index 44b668854..f15c35c93 100644 --- a/Source/Assets/TouchScript/Examples/Photos/Photos.unity +++ b/Source/Assets/TouchScript/Examples/Photos/Photos.unity @@ -388,6 +388,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c34dc6093a49a481db532b87b45132a4, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -936,6 +937,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -962,6 +964,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1328,6 +1331,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c34dc6093a49a481db532b87b45132a4, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1579,6 +1583,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1612,6 +1617,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1789,6 +1795,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1822,6 +1829,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -2573,6 +2581,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c34dc6093a49a481db532b87b45132a4, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -2719,6 +2728,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -2752,6 +2762,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -3130,6 +3141,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c34dc6093a49a481db532b87b45132a4, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -3485,6 +3497,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c34dc6093a49a481db532b87b45132a4, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -3966,6 +3979,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c34dc6093a49a481db532b87b45132a4, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -4110,6 +4124,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c34dc6093a49a481db532b87b45132a4, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -4340,6 +4355,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c34dc6093a49a481db532b87b45132a4, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -4641,6 +4657,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -4674,6 +4691,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -4996,6 +5014,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c34dc6093a49a481db532b87b45132a4, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -5410,6 +5429,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -5443,6 +5463,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -5616,6 +5637,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c34dc6093a49a481db532b87b45132a4, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -5830,6 +5852,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c34dc6093a49a481db532b87b45132a4, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 diff --git a/Source/Assets/TouchScript/Examples/Portal/Portal.unity b/Source/Assets/TouchScript/Examples/Portal/Portal.unity index 9b3f7c071..747740f26 100644 --- a/Source/Assets/TouchScript/Examples/Portal/Portal.unity +++ b/Source/Assets/TouchScript/Examples/Portal/Portal.unity @@ -357,11 +357,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -383,11 +384,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 141e75b9b7edb42df80a22a14f03ae4b, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -405,11 +407,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -773,11 +776,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -811,11 +815,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 141e75b9b7edb42df80a22a14f03ae4b, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -833,11 +838,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -974,11 +980,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -1000,11 +1007,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 141e75b9b7edb42df80a22a14f03ae4b, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -1022,11 +1030,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -1290,11 +1299,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -1316,11 +1326,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 141e75b9b7edb42df80a22a14f03ae4b, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -1338,11 +1349,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} diff --git a/Source/Assets/TouchScript/Examples/RawInput/RawInput.unity b/Source/Assets/TouchScript/Examples/RawInput/RawInput.unity index 41c59ad9d..5fe4ddd45 100644 --- a/Source/Assets/TouchScript/Examples/RawInput/RawInput.unity +++ b/Source/Assets/TouchScript/Examples/RawInput/RawInput.unity @@ -316,22 +316,14 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: advancedProps: 0 - TouchTags: - tagList: - - Touch - MouseTags: - tagList: - - Mouse - PenTags: - tagList: - - Pen - Windows8Touch: 0 - Windows7Touch: 0 - WebPlayerTouch: 1 - WebGLTouch: 1 - Windows8Mouse: 1 - Windows7Mouse: 1 - UniversalWindowsMouse: 1 + 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 ac3b692c9..cf2dd12fe 100644 --- a/Source/Assets/TouchScript/Examples/Taps/Taps.unity +++ b/Source/Assets/TouchScript/Examples/Taps/Taps.unity @@ -474,11 +474,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 7a878a6ff128243dfb1d89ca0273f059, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 + minPointers: 0 + maxPointers: 0 + combinePointers: 0 + combinePointersInterval: .300000012 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} From d3a16bf1bb43156cc3c3143c4cd415debab82f52 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 3 Jul 2016 20:12:40 +0300 Subject: [PATCH 027/211] Renamed Began event to Pressed, Ended event to Released. Added "Added" and "Removed" events which right now do nothing. --- .../Examples/RawInput/Scripts/Spawner.cs | 6 +- .../Behaviors/TouchScriptInputModule.cs | 26 +++--- .../Behaviors/Visualizer/PointerVisualizer.cs | 14 +-- .../Scripts/GestureManagerInstance.cs | 30 +++--- .../Base/PinnedTransformGestureBase.cs | 8 +- .../Gestures/Base/TransformGestureBase.cs | 8 +- .../ClusteredScreenTransformGesture.cs | 8 +- .../Clustered/ClusteredTransformGesture.cs | 8 +- .../Scripts/Gestures/FlickGesture.cs | 8 +- .../TouchScript/Scripts/Gestures/Gesture.cs | 12 +-- .../Scripts/Gestures/LongPressGesture.cs | 8 +- .../Scripts/Gestures/MetaGesture.cs | 8 +- .../Gestures/PinnedTransformGesture.cs | 8 +- .../Scripts/Gestures/PressGesture.cs | 4 +- .../Scripts/Gestures/ReleaseGesture.cs | 4 +- .../Scripts/Gestures/TapGesture.cs | 8 +- .../Scripts/Gestures/TransformGesture.cs | 4 +- .../Scripts/Gestures/UI/UIGesture.cs | 8 +- .../TouchScript/Scripts/ITouchManager.cs | 30 ++++-- .../TouchScript/Scripts/TouchManager.cs | 84 ++++++++++++----- .../Scripts/TouchManagerInstance.cs | 91 +++++++++++-------- Source/ProjectSettings/ProjectSettings.asset | 2 +- 22 files changed, 222 insertions(+), 165 deletions(-) diff --git a/Source/Assets/TouchScript/Examples/RawInput/Scripts/Spawner.cs b/Source/Assets/TouchScript/Examples/RawInput/Scripts/Spawner.cs index 275aeace7..b7f6fd2ae 100644 --- a/Source/Assets/TouchScript/Examples/RawInput/Scripts/Spawner.cs +++ b/Source/Assets/TouchScript/Examples/RawInput/Scripts/Spawner.cs @@ -14,7 +14,7 @@ private void OnEnable() { if (TouchManager.Instance != null) { - TouchManager.Instance.PointersBegan += pointersBeganHandler; + TouchManager.Instance.PointersPressed += pointersPressedHandler; } } @@ -22,7 +22,7 @@ private void OnDisable() { if (TouchManager.Instance != null) { - TouchManager.Instance.PointersBegan -= pointersBeganHandler; + TouchManager.Instance.PointersPressed -= pointersPressedHandler; } } @@ -33,7 +33,7 @@ private void spawnPrefabAt(Vector2 position) obj.transform.rotation = transform.rotation; } - private void pointersBeganHandler(object sender, PointerEventArgs e) + private void pointersPressedHandler(object sender, PointerEventArgs e) { foreach (var pointer in e.Pointers) { diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/TouchScriptInputModule.cs b/Source/Assets/TouchScript/Scripts/Behaviors/TouchScriptInputModule.cs index b1f7e6ef4..f6ff61ab4 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/TouchScriptInputModule.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/TouchScriptInputModule.cs @@ -133,9 +133,9 @@ public override void ActivateModule() var touchManager = TouchManager.Instance; if (touchManager != null) { - touchManager.PointersBegan += pointersBeganHandler; + touchManager.PointersPressed += pointersPressedHandler; touchManager.PointersMoved += pointersMovedHandler; - touchManager.PointersEnded += pointersEndedHandler; + touchManager.PointersReleased += pointersReleasedHandler; touchManager.PointersCancelled += pointersCancelledHandler; } @@ -154,9 +154,9 @@ public override void DeactivateModule() var touchManager = TouchManager.Instance; if (touchManager != null) { - touchManager.PointersBegan -= pointersBeganHandler; + touchManager.PointersPressed -= pointersPressedHandler; touchManager.PointersMoved -= pointersMovedHandler; - touchManager.PointersEnded -= pointersEndedHandler; + touchManager.PointersReleased -= pointersReleasedHandler; touchManager.PointersCancelled -= pointersCancelledHandler; } @@ -443,21 +443,21 @@ protected void deselectIfSelectionChanged(GameObject currentOverGo, BaseEventDat #region Private functions - private void processBegan(Pointer pointer) + private void processPressed(Pointer pointer) { PointerEventData pointerEvent = initPointerData(pointer); raycastPointer(pointerEvent); injectPointer(pointerEvent); } - private void processMove(Pointer pointer) + private void processMoved(Pointer pointer) { PointerEventData pointerEvent = updatePointerData(pointer); raycastPointer(pointerEvent); movePointer(pointerEvent); } - private void processEnded(Pointer pointer) + private void processReleased(Pointer pointer) { PointerEventData pointerEvent = updatePointerData(pointer); raycastPointer(pointerEvent); @@ -562,28 +562,28 @@ private bool sendUpdateEventToSelectedObject() #region Pointer event callbacks - private void pointersBeganHandler(object sender, PointerEventArgs pointerEventArgs) + private void pointersPressedHandler(object sender, PointerEventArgs pointerEventArgs) { var pointers = pointerEventArgs.Pointers; - for (var i = 0; i < pointers.Count; i++) processBegan(pointers[i]); + for (var i = 0; i < pointers.Count; i++) processPressed(pointers[i]); } private void pointersMovedHandler(object sender, PointerEventArgs pointerEventArgs) { var pointers = pointerEventArgs.Pointers; - for (var i = 0; i < pointers.Count; i++) processMove(pointers[i]); + for (var i = 0; i < pointers.Count; i++) processMoved(pointers[i]); } - private void pointersEndedHandler(object sender, PointerEventArgs pointerEventArgs) + private void pointersReleasedHandler(object sender, PointerEventArgs pointerEventArgs) { var pointers = pointerEventArgs.Pointers; - for (var i = 0; i < pointers.Count; i++) processEnded(pointers[i]); + for (var i = 0; i < pointers.Count; i++) processReleased(pointers[i]); } private void pointersCancelledHandler(object sender, PointerEventArgs pointerEventArgs) { var pointers = pointerEventArgs.Pointers; - for (var i = 0; i < pointers.Count; i++) processEnded(pointers[i]); + for (var i = 0; i < pointers.Count; i++) processReleased(pointers[i]); } #endregion diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs index d5a5fa8a5..a0586ec83 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs @@ -119,8 +119,8 @@ private void OnEnable() { if (TouchManager.Instance != null) { - TouchManager.Instance.PointersBegan += pointersBeganHandler; - TouchManager.Instance.PointersEnded += pointersEndedHandler; + TouchManager.Instance.PointersPressed += pointersPressedHandler; + TouchManager.Instance.PointersReleased += pointersReleasedHandler; TouchManager.Instance.PointersMoved += pointersMovedHandler; TouchManager.Instance.PointersCancelled += pointersCancelledHandler; } @@ -130,8 +130,8 @@ private void OnDisable() { if (TouchManager.Instance != null) { - TouchManager.Instance.PointersBegan -= pointersBeganHandler; - TouchManager.Instance.PointersEnded -= pointersEndedHandler; + TouchManager.Instance.PointersPressed -= pointersPressedHandler; + TouchManager.Instance.PointersReleased -= pointersReleasedHandler; TouchManager.Instance.PointersMoved -= pointersMovedHandler; TouchManager.Instance.PointersCancelled -= pointersCancelledHandler; } @@ -170,7 +170,7 @@ private void updateDefaultSize() #region Event handlers - private void pointersBeganHandler(object sender, PointerEventArgs e) + private void pointersPressedHandler(object sender, PointerEventArgs e) { if (pointerProxy == null) return; @@ -199,7 +199,7 @@ private void pointersMovedHandler(object sender, PointerEventArgs e) } } - private void pointersEndedHandler(object sender, PointerEventArgs e) + private void pointersReleasedHandler(object sender, PointerEventArgs e) { var count = e.Pointers.Count; for (var i = 0; i < count; i++) @@ -214,7 +214,7 @@ private void pointersEndedHandler(object sender, PointerEventArgs e) private void pointersCancelledHandler(object sender, PointerEventArgs e) { - pointersEndedHandler(sender, e); + pointersReleasedHandler(sender, e); } #endregion diff --git a/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs b/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs index c1e820175..f5f690dcb 100644 --- a/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs @@ -53,7 +53,7 @@ public static IGestureManager Instance // Upcoming changes private List gesturesToReset = new List(20); - private Action> _updateBegan, _updateMoved, _updateEnded, _updateCancelled; + private Action> _updatePressed, _updateMoved, _updateReleased, _updateCancelled; private Action _processTarget, _processTargetBegan; #endregion @@ -97,9 +97,9 @@ private void Awake() _processTarget = processTarget; _processTargetBegan = processTargetBegan; - _updateBegan = doUpdateBegan; + _updatePressed = doUpdatePressed; _updateMoved = doUpdateMoved; - _updateEnded = doUpdateEnded; + _updateReleased = doUpdateReleased; _updateCancelled = doUpdateCancelled; gestureListPool.WarmUp(5); @@ -114,9 +114,9 @@ private void OnEnable() { touchManager.FrameStarted += frameStartedHandler; touchManager.FrameFinished += frameFinishedHandler; - touchManager.PointersBegan += pointersBeganHandler; touchManager.PointersMoved += pointersMovedHandler; - touchManager.PointersEnded += pointersEndedHandler; + touchManager.PointersPressed += pointersPressedHandler; + touchManager.PointersReleased += pointersReleasedHandler; touchManager.PointersCancelled += pointersCancelledHandler; } } @@ -128,9 +128,9 @@ private void OnDisable() { touchManager.FrameStarted -= frameStartedHandler; touchManager.FrameFinished -= frameFinishedHandler; - touchManager.PointersBegan -= pointersBeganHandler; touchManager.PointersMoved -= pointersMovedHandler; - touchManager.PointersEnded -= pointersEndedHandler; + touchManager.PointersPressed -= pointersPressedHandler; + touchManager.PointersReleased -= pointersReleasedHandler; touchManager.PointersCancelled -= pointersCancelledHandler; } } @@ -215,9 +215,9 @@ internal Gesture.GestureState INTERNAL_GestureChangeState(Gesture gesture, Gestu #region Private functions - private void doUpdateBegan(Gesture gesture, IList pointers) + private void doUpdatePressed(Gesture gesture, IList pointers) { - gesture.INTERNAL_PointerBegan(pointers); + gesture.INTERNAL_PointersPressed(pointers); } private void doUpdateMoved(Gesture gesture, IList pointers) @@ -225,9 +225,9 @@ private void doUpdateMoved(Gesture gesture, IList pointers) gesture.INTERNAL_PointersMoved(pointers); } - private void doUpdateEnded(Gesture gesture, IList pointers) + private void doUpdateReleased(Gesture gesture, IList pointers) { - gesture.INTERNAL_PointersEnded(pointers); + gesture.INTERNAL_PointersReleased(pointers); } private void doUpdateCancelled(Gesture gesture, IList pointers) @@ -563,9 +563,9 @@ private void frameStartedHandler(object sender, EventArgs eventArgs) resetGestures(); } - private void pointersBeganHandler(object sender, PointerEventArgs pointerEventArgs) + private void pointersPressedHandler(object sender, PointerEventArgs pointerEventArgs) { - update(pointerEventArgs.Pointers, _processTargetBegan, _updateBegan); + update(pointerEventArgs.Pointers, _processTargetBegan, _updatePressed); } private void pointersMovedHandler(object sender, PointerEventArgs pointerEventArgs) @@ -573,9 +573,9 @@ private void pointersMovedHandler(object sender, PointerEventArgs pointerEventAr update(pointerEventArgs.Pointers, _processTarget, _updateMoved); } - private void pointersEndedHandler(object sender, PointerEventArgs pointerEventArgs) + private void pointersReleasedHandler(object sender, PointerEventArgs pointerEventArgs) { - update(pointerEventArgs.Pointers, _processTarget, _updateEnded); + update(pointerEventArgs.Pointers, _processTarget, _updateReleased); } private void pointersCancelledHandler(object sender, PointerEventArgs pointerEventArgs) diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Base/PinnedTransformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/Base/PinnedTransformGestureBase.cs index b68e7f494..2f11364bd 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Base/PinnedTransformGestureBase.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Base/PinnedTransformGestureBase.cs @@ -241,9 +241,9 @@ protected override void OnEnable() #region Gesture callbacks /// - protected override void pointersBegan(IList pointers) + protected override void pointersPressed(IList pointers) { - base.pointersBegan(pointers); + base.pointersPressed(pointers); if (pointersNumState == PointersNumState.PassedMaxThreshold || pointersNumState == PointersNumState.PassedMinMaxThreshold) @@ -259,9 +259,9 @@ protected override void pointersBegan(IList pointers) } /// - protected override void pointersEnded(IList pointers) + protected override void pointersReleased(IList pointers) { - base.pointersEnded(pointers); + base.pointersReleased(pointers); if (pointersNumState == PointersNumState.PassedMinThreshold) { diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs index dea9abb3c..7b1be94e3 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs @@ -286,9 +286,9 @@ protected override void OnEnable() #region Gesture callbacks /// - protected override void pointersBegan(IList pointers) + protected override void pointersPressed(IList pointers) { - base.pointersBegan(pointers); + base.pointersPressed(pointers); if (pointersNumState == PointersNumState.PassedMaxThreshold || pointersNumState == PointersNumState.PassedMinMaxThreshold) @@ -429,9 +429,9 @@ protected override void pointersMoved(IList pointers) } /// - protected override void pointersEnded(IList pointers) + protected override void pointersReleased(IList pointers) { - base.pointersEnded(pointers); + base.pointersReleased(pointers); if (pointersNumState == PointersNumState.PassedMinThreshold) { diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredScreenTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredScreenTransformGesture.cs index 42356e234..0824a77da 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredScreenTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredScreenTransformGesture.cs @@ -26,11 +26,11 @@ public class ClusteredScreenTransformGesture : ScreenTransformGesture #region Gesture callbacks /// - protected override void pointersBegan(IList pointers) + protected override void pointersPressed(IList pointers) { clusters.AddPoints(pointers); - base.pointersBegan(pointers); + base.pointersPressed(pointers); } /// @@ -42,11 +42,11 @@ protected override void pointersMoved(IList pointers) } /// - protected override void pointersEnded(IList pointers) + protected override void pointersReleased(IList pointers) { clusters.RemovePoints(pointers); - base.pointersEnded(pointers); + base.pointersReleased(pointers); } /// diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredTransformGesture.cs index b5a7799e4..cfb163f4d 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredTransformGesture.cs @@ -26,11 +26,11 @@ public class ClusteredTransformGesture : TransformGesture #region Gesture callbacks /// - protected override void pointersBegan(IList pointers) + protected override void pointersPressed(IList pointers) { clusters.AddPoints(pointers); - base.pointersBegan(pointers); + base.pointersPressed(pointers); } /// @@ -42,11 +42,11 @@ protected override void pointersMoved(IList pointers) } /// - protected override void pointersEnded(IList pointers) + protected override void pointersReleased(IList pointers) { clusters.RemovePoints(pointers); - base.pointersEnded(pointers); + base.pointersReleased(pointers); } /// diff --git a/Source/Assets/TouchScript/Scripts/Gestures/FlickGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/FlickGesture.cs index 63d31b05b..4b4e85fb2 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/FlickGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/FlickGesture.cs @@ -154,9 +154,9 @@ protected void LateUpdate() #region Gesture callbacks /// - protected override void pointersBegan(IList pointers) + protected override void pointersPressed(IList pointers) { - base.pointersBegan(pointers); + base.pointersPressed(pointers); if (pointersNumState == PointersNumState.PassedMaxThreshold || pointersNumState == PointersNumState.PassedMinMaxThreshold) @@ -188,9 +188,9 @@ protected override void pointersMoved(IList pointers) } /// - protected override void pointersEnded(IList pointers) + protected override void pointersReleased(IList pointers) { - base.pointersEnded(pointers); + base.pointersReleased(pointers); if (NumPointers == 0) { diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs index 4ceb450af..403cffc6b 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs @@ -718,7 +718,7 @@ internal void INTERNAL_Reset() reset(); } - internal void INTERNAL_PointerBegan(IList pointers) + internal void INTERNAL_PointersPressed(IList pointers) { if (numPointers == 0) layer = pointers[0].Layer; @@ -764,7 +764,7 @@ internal void INTERNAL_PointerBegan(IList pointers) activePointers.AddRange(pointers); numPointers = total; - pointersBegan(pointers); + pointersPressed(pointers); } internal void INTERNAL_PointersMoved(IList pointers) @@ -775,7 +775,7 @@ internal void INTERNAL_PointersMoved(IList pointers) pointersMoved(pointers); } - internal void INTERNAL_PointersEnded(IList pointers) + internal void INTERNAL_PointersReleased(IList pointers) { var count = pointers.Count; var total = numPointers - count; @@ -847,7 +847,7 @@ internal void INTERNAL_PointersEnded(IList pointers) } } - pointersEnded(pointers); + pointersReleased(pointers); } internal void INTERNAL_PointersCancelled(IList pointers) @@ -957,7 +957,7 @@ protected bool setState(GestureState value) /// Called when new pointers appear. /// /// The pointers. - protected virtual void pointersBegan(IList pointers) {} + protected virtual void pointersPressed(IList pointers) {} /// /// Called for moved pointers. @@ -969,7 +969,7 @@ protected virtual void pointersMoved(IList pointers) {} /// Called if pointers are removed. /// /// The pointers. - protected virtual void pointersEnded(IList pointers) {} + protected virtual void pointersReleased(IList pointers) {} /// /// Called when pointers are cancelled. diff --git a/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs index 22fc570fd..e7e073bd5 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs @@ -102,9 +102,9 @@ protected override void OnEnable() #region Gesture callbacks /// - protected override void pointersBegan(IList pointers) + protected override void pointersPressed(IList pointers) { - base.pointersBegan(pointers); + base.pointersPressed(pointers); if (pointersNumState == PointersNumState.PassedMaxThreshold || pointersNumState == PointersNumState.PassedMinMaxThreshold) @@ -130,9 +130,9 @@ protected override void pointersMoved(IList pointers) } /// - protected override void pointersEnded(IList pointers) + protected override void pointersReleased(IList pointers) { - base.pointersEnded(pointers); + base.pointersReleased(pointers); if (pointersNumState == PointersNumState.PassedMinThreshold) { diff --git a/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs index b173af864..6c7430d8b 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs @@ -90,9 +90,9 @@ public event EventHandler PointerCancelled #region Gesture callbacks /// - protected override void pointersBegan(IList pointers) + protected override void pointersPressed(IList pointers) { - base.pointersBegan(pointers); + base.pointersPressed(pointers); if (State == GestureState.Possible) setState(GestureState.Began); @@ -128,9 +128,9 @@ protected override void pointersMoved(IList pointers) } /// - protected override void pointersEnded(IList pointers) + protected override void pointersReleased(IList pointers) { - base.pointersEnded(pointers); + base.pointersReleased(pointers); if ((State == GestureState.Began || State == GestureState.Changed) && NumPointers == 0) setState(GestureState.Ended); diff --git a/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs index b6d3746ac..385f3916b 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs @@ -150,9 +150,9 @@ protected override void OnEnable() #region Gesture callbacks /// - protected override void pointersBegan(IList pointers) + protected override void pointersPressed(IList pointers) { - base.pointersBegan(pointers); + base.pointersPressed(pointers); if (State != GestureState.Possible) return; if (NumPointers == pointers.Count) @@ -259,9 +259,9 @@ protected override void pointersMoved(IList pointers) #if TOUCHSCRIPT_DEBUG /// - protected override void pointersEnded(IList pointers) + protected override void pointersReleased(IList pointers) { - base.pointersEnded(pointers); + base.pointersReleased(pointers); if (NumPointers == 0) return; drawDebug(activePointers[0].ProjectionParams.ProjectFrom(cachedTransform.position), activePointers[0].Position); diff --git a/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs index fc82905b2..ccbf5c4ac 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs @@ -93,9 +93,9 @@ public override bool CanBePreventedByGesture(Gesture gesture) } /// - protected override void pointersBegan(IList pointers) + protected override void pointersPressed(IList pointers) { - base.pointersBegan(pointers); + base.pointersPressed(pointers); if (pointersNumState == PointersNumState.PassedMinThreshold) setState(GestureState.Recognized); } diff --git a/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs index 3e659181f..9b55bc09b 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs @@ -93,9 +93,9 @@ public override bool CanBePreventedByGesture(Gesture gesture) } /// - protected override void pointersEnded(IList pointers) + protected override void pointersReleased(IList pointers) { - base.pointersEnded(pointers); + base.pointersReleased(pointers); if (pointersNumState == PointersNumState.PassedMinThreshold) setState(GestureState.Recognized); } diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs index 02e9ad618..cbd9b6bea 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs @@ -125,9 +125,9 @@ protected override void OnEnable() #region Gesture callbacks /// - protected override void pointersBegan(IList pointers) + protected override void pointersPressed(IList pointers) { - base.pointersBegan(pointers); + base.pointersPressed(pointers); if (pointersNumState == PointersNumState.PassedMaxThreshold || pointersNumState == PointersNumState.PassedMinMaxThreshold) @@ -184,9 +184,9 @@ protected override void pointersMoved(IList pointers) } /// - protected override void pointersEnded(IList pointers) + protected override void pointersReleased(IList pointers) { - base.pointersEnded(pointers); + base.pointersReleased(pointers); if (NumPointers == 0) { diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs index 415908778..9e88a1b91 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs @@ -158,9 +158,9 @@ protected override void OnEnable() #region Gesture callbacks /// - protected override void pointersBegan(IList pointers) + protected override void pointersPressed(IList pointers) { - base.pointersBegan(pointers); + base.pointersPressed(pointers); if (State != GestureState.Possible) return; if (NumPointers == pointers.Count) diff --git a/Source/Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs index 88263f1a4..8313317df 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs @@ -44,9 +44,9 @@ public override bool CanBePreventedByGesture(Gesture gesture) } /// - protected override void pointersBegan(IList pointers) + protected override void pointersPressed(IList pointers) { - base.pointersBegan(pointers); + base.pointersPressed(pointers); if (NumPointers == pointers.Count) setState(GestureState.Began); @@ -89,9 +89,9 @@ protected override void pointersMoved(IList pointers) } /// - protected override void pointersEnded(IList pointers) + protected override void pointersReleased(IList pointers) { - base.pointersEnded(pointers); + base.pointersReleased(pointers); PointerData onTarget = new PointerData(); for (var i = 0; i < pointers.Count; i++) diff --git a/Source/Assets/TouchScript/Scripts/ITouchManager.cs b/Source/Assets/TouchScript/Scripts/ITouchManager.cs index 8307e3928..91ba9507d 100644 --- a/Source/Assets/TouchScript/Scripts/ITouchManager.cs +++ b/Source/Assets/TouchScript/Scripts/ITouchManager.cs @@ -20,9 +20,9 @@ namespace TouchScript /// Every frame pointer events are dispatched in this order: /// /// FrameStarted - /// PointersBegan + /// PointersPressed /// PointersMoved - /// PointersEnded + /// PointersReleased /// PointersCancelled /// FrameFinished /// @@ -33,10 +33,10 @@ namespace TouchScript /// /// This sample shows how to get TouchManager instance and subscribe to events. /// - /// TouchManager.Instance.PointersBegan += - /// (sender, args) => { foreach (var pointer in args.Pointers) Debug.Log("Began: " + pointer.Id); }; - /// TouchManager.Instance.PointersEnded += - /// (sender, args) => { foreach (var pointer in args.Pointers) Debug.Log("Ended: " + pointer.Id); }; + /// TouchManager.Instance.PointersPressed += + /// (sender, args) => { foreach (var pointer in args.Pointers) Debug.Log("Pressed: " + pointer.Id); }; + /// TouchManager.Instance.PointersReleased += + /// (sender, args) => { foreach (var pointer in args.Pointers) Debug.Log("Released: " + pointer.Id); }; /// /// public interface ITouchManager @@ -52,9 +52,9 @@ public interface ITouchManager event EventHandler FrameFinished; /// - /// Occurs when new pointers are added. + /// Occurs when new hovering pointers are added. /// - event EventHandler PointersBegan; + event EventHandler PointersAdded; /// /// Occurs when pointers are updated. @@ -62,9 +62,19 @@ public interface ITouchManager event EventHandler PointersMoved; /// - /// Occurs when pointers are removed. + /// Occurs when pointers touch the surface. /// - event EventHandler PointersEnded; + event EventHandler PointersPressed; + + /// + /// Occurs when pointers are released. + /// + event EventHandler PointersReleased; + + /// + /// Occurs when pointers are removed from the system. + /// + event EventHandler PointersRemoved; /// /// Occurs when pointers are cancelled. diff --git a/Source/Assets/TouchScript/Scripts/TouchManager.cs b/Source/Assets/TouchScript/Scripts/TouchManager.cs index 2f90ec00f..15d563237 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/ */ @@ -23,10 +23,10 @@ namespace TouchScript /// /// This sample shows how to get Pointer Manager instance and subscribe to events. /// - /// TouchManager.Instance.PointersBegan += - /// (sender, args) => { foreach (var pointer in args.Pointers) Debug.Log("Began: " + pointer.Id); }; - /// TouchManager.Instance.PointersEnded += - /// (sender, args) => { foreach (var pointer in args.Pointers) Debug.Log("Ended: " + pointer.Id); }; + /// TouchManager.Instance.PointersPressed += + /// (sender, args) => { foreach (var pointer in args.Pointers) Debug.Log("Pressed: " + pointer.Id); }; + /// TouchManager.Instance.PointersReleased += + /// (sender, args) => { foreach (var pointer in args.Pointers) Debug.Log("Released: " + pointer.Id); }; /// /// [AddComponentMenu("TouchScript/Pointer Manager")] @@ -57,9 +57,9 @@ public enum MessageType FrameFinished = 1 << 1, /// - /// Some pointers have begun during the frame. + /// Some pointers were added during the frame. /// - PointersBegan = 1 << 2, + PointersAdded = 1 << 2, /// /// Some pointers have moved during the frame. @@ -67,14 +67,24 @@ public enum MessageType PointersMoved = 1 << 3, /// - /// Some pointers have ended during the frame. + /// Some pointers have touched the surface during the frame. /// - PointersEnded = 1 << 4, + PointersPressed = 1 << 4, + + /// + /// Some pointers were released during the frame. + /// + PointersReleased = 1 << 5, + + /// + /// Some pointers were removed during the frame. + /// + PointersRemoved = 1 << 6, /// /// Some pointers were cancelled during the frame. /// - PointersCancelled = 1 << 5 + PointersCancelled = 1 << 7 } /// @@ -93,9 +103,9 @@ public enum MessageName OnPointerFrameFinished = MessageType.FrameFinished, /// - /// Some pointers have begun during the frame. + /// Some pointers were added during the frame. /// - OnPointersBegan = MessageType.PointersBegan, + OnPointersAdded = MessageType.PointersAdded, /// /// Some pointers have moved during the frame. @@ -103,9 +113,19 @@ public enum MessageName OnPointersMoved = MessageType.PointersMoved, /// - /// Some pointers have ended during the frame. + /// Some pointers have touched the surface during the frame. + /// + OnPointersPressed = MessageType.PointersPressed, + + /// + /// Some pointers were released during the frame. + /// + OnPointersReleased = MessageType.PointersReleased, + + /// + /// Some pointers were removed during the frame. /// - OnPointersEnded = MessageType.PointersEnded, + OnPointersRemoved = MessageType.PointersRemoved, /// /// Some pointers were cancelled during the frame. @@ -270,8 +290,8 @@ public static bool IsInvalidPosition(Vector2 position) private bool useSendMessage = false; [SerializeField] - private MessageType sendMessageEvents = MessageType.PointersBegan | MessageType.PointersCancelled | - MessageType.PointersEnded | MessageType.PointersMoved; + private MessageType sendMessageEvents = MessageType.PointersPressed | MessageType.PointersCancelled | + MessageType.PointersReleased | MessageType.PointersMoved; [SerializeField] private GameObject sendMessageTarget; @@ -323,9 +343,11 @@ private void updateSubscription() if ((SendMessageEvents & MessageType.FrameStarted) != 0) Instance.FrameStarted += frameStartedHandler; if ((SendMessageEvents & MessageType.FrameFinished) != 0) Instance.FrameFinished += frameFinishedHandler; - if ((SendMessageEvents & MessageType.PointersBegan) != 0) Instance.PointersBegan += pointersBeganHandler; + if ((SendMessageEvents & MessageType.PointersAdded) != 0) Instance.PointersAdded += pointersAddedHandler; if ((SendMessageEvents & MessageType.PointersMoved) != 0) Instance.PointersMoved += pointersMovedHandler; - if ((SendMessageEvents & MessageType.PointersEnded) != 0) Instance.PointersEnded += pointersEndedHandler; + if ((SendMessageEvents & MessageType.PointersPressed) != 0) Instance.PointersPressed += pointersPressedHandler; + if ((SendMessageEvents & MessageType.PointersReleased) != 0) Instance.PointersReleased += pointersReleasedHandler; + if ((SendMessageEvents & MessageType.PointersRemoved) != 0) Instance.PointersRemoved += pointersRemovedHandler; if ((SendMessageEvents & MessageType.PointersCancelled) != 0) Instance.PointersCancelled += pointersCancelledHandler; } @@ -336,15 +358,17 @@ private void removeSubscriptions() Instance.FrameStarted -= frameStartedHandler; Instance.FrameFinished -= frameFinishedHandler; - Instance.PointersBegan -= pointersBeganHandler; + Instance.PointersAdded -= pointersAddedHandler; Instance.PointersMoved -= pointersMovedHandler; - Instance.PointersEnded -= pointersEndedHandler; + Instance.PointersPressed -= pointersPressedHandler; + Instance.PointersReleased -= pointersReleasedHandler; + Instance.PointersRemoved -= pointersRemovedHandler; Instance.PointersCancelled -= pointersCancelledHandler; } - private void pointersBeganHandler(object sender, PointerEventArgs e) + private void pointersAddedHandler(object sender, PointerEventArgs e) { - sendMessageTarget.SendMessage(MessageName.OnPointersBegan.ToString(), e.Pointers, + sendMessageTarget.SendMessage(MessageName.OnPointersAdded.ToString(), e.Pointers, SendMessageOptions.DontRequireReceiver); } @@ -354,9 +378,21 @@ private void pointersMovedHandler(object sender, PointerEventArgs e) SendMessageOptions.DontRequireReceiver); } - private void pointersEndedHandler(object sender, PointerEventArgs e) + private void pointersPressedHandler(object sender, PointerEventArgs e) + { + sendMessageTarget.SendMessage(MessageName.OnPointersPressed.ToString(), e.Pointers, + SendMessageOptions.DontRequireReceiver); + } + + private void pointersReleasedHandler(object sender, PointerEventArgs e) + { + sendMessageTarget.SendMessage(MessageName.OnPointersReleased.ToString(), e.Pointers, + SendMessageOptions.DontRequireReceiver); + } + + private void pointersRemovedHandler(object sender, PointerEventArgs e) { - sendMessageTarget.SendMessage(MessageName.OnPointersEnded.ToString(), e.Pointers, + sendMessageTarget.SendMessage(MessageName.OnPointersRemoved.ToString(), e.Pointers, SendMessageOptions.DontRequireReceiver); } diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs index 37503985b..43227ea75 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs @@ -40,10 +40,10 @@ public event EventHandler FrameFinished } /// - public event EventHandler PointersBegan + public event EventHandler PointersAdded { - add { pointersBeganInvoker += value; } - remove { pointersBeganInvoker -= value; } + add { pointersAddedInvoker += value; } + remove { pointersAddedInvoker -= value; } } /// @@ -54,10 +54,24 @@ public event EventHandler PointersMoved } /// - public event EventHandler PointersEnded + public event EventHandler PointersPressed { - add { pointersEndedInvoker += value; } - remove { pointersEndedInvoker -= value; } + add { pointersPressedInvoker += value; } + remove { pointersPressedInvoker -= value; } + } + + /// + public event EventHandler PointersReleased + { + add { pointersReleasedInvoker += value; } + remove { pointersReleasedInvoker -= value; } + } + + /// + public event EventHandler PointersRemoved + { + add { pointersRemovedInvoker += value; } + remove { pointersRemovedInvoker -= value; } } /// @@ -68,10 +82,7 @@ public event EventHandler PointersCancelled } // Needed to overcome iOS AOT limitations - private EventHandler pointersBeganInvoker, - pointersMovedInvoker, - pointersEndedInvoker, - pointersCancelledInvoker; + private EventHandler pointersAddedInvoker, pointersMovedInvoker, pointersPressedInvoker, pointersReleasedInvoker, pointersRemovedInvoker, pointersCancelledInvoker; private EventHandler frameStartedInvoker, frameFinishedInvoker; @@ -200,9 +211,9 @@ public IList ActivePointers private Dictionary idToPointer = new Dictionary(30); // Upcoming changes - private List pointersBegan = new List(10); + private List pointersPressed = new List(10); private HashSet pointersUpdated = new HashSet(); - private HashSet pointersEnded = new HashSet(); + private HashSet pointersReleased = new HashSet(); private HashSet pointersCancelled = new HashSet(); private static ObjectPool> pointerListPool = new ObjectPool>(2, @@ -355,7 +366,7 @@ internal void INTERNAL_BeginPointer(Pointer pointer, Vector2 position) lock (pointerLock) { pointer.INTERNAL_Init(nextPointerId++, position); - pointersBegan.Add(pointer); + pointersPressed.Add(pointer); } } @@ -387,7 +398,7 @@ internal void INTERNAL_MovePointer(int id, Vector2 position) if (!idToPointer.TryGetValue(id, out pointer)) { // This pointer was added this frame - pointer = pointersBegan.Find((t) => t.Id == id); + pointer = pointersPressed.Find((t) => t.Id == id); // No pointer with such id if (pointer == null) { @@ -413,7 +424,7 @@ internal void INTERNAL_EndPointer(int id) if (!idToPointer.TryGetValue(id, out pointer)) { // This pointer was added this frame - pointer = pointersBegan.Find((t) => t.Id == id); + pointer = pointersPressed.Find((t) => t.Id == id); // No pointer with such id if (pointer == null) { @@ -424,7 +435,7 @@ internal void INTERNAL_EndPointer(int id) return; } } - if (!pointersEnded.Contains(id)) pointersEnded.Add(id); + if (!pointersReleased.Contains(id)) pointersReleased.Add(id); #if TOUCHSCRIPT_DEBUG else Debug.LogWarning("TouchScript > Pointer with id [" + id + @@ -442,7 +453,7 @@ internal void INTERNAL_CancelPointer(int id) if (!idToPointer.TryGetValue(id, out pointer)) { // This pointer was added this frame - pointer = pointersBegan.Find((t) => t.Id == id); + pointer = pointersPressed.Find((t) => t.Id == id); // No pointer with such id if (pointer == null) { @@ -581,7 +592,7 @@ private void updateInputs() for (var i = 0; i < inputCount; i++) inputs[i].UpdateInput(); } - private void updateBegan(List pointers) + private void updatePressed(List pointers) { var count = pointers.Count; var list = pointerListPool.Get(); @@ -604,8 +615,8 @@ private void updateBegan(List pointers) #endif } - if (pointersBeganInvoker != null) - pointersBeganInvoker.InvokeHandleExceptions(this, PointerEventArgs.GetCachedEventArgs(list)); + if (pointersPressedInvoker != null) + pointersPressedInvoker.InvokeHandleExceptions(this, PointerEventArgs.GetCachedEventArgs(list)); pointerListPool.Release(list); } @@ -644,7 +655,7 @@ private void updateUpdated(List pointers) pointerListPool.Release(list); } - private void updateEnded(List pointers) + private void updateReleased(List pointers) { var endedCount = pointers.Count; var list = pointerListPool.Get(); @@ -655,7 +666,7 @@ private void updateEnded(List pointers) if (!idToPointer.TryGetValue(id, out pointer)) { #if TOUCHSCRIPT_DEBUG - Debug.LogWarning("TouchScript > Id [" + id + "] was in ENDED list but no pointer with such id found."); + Debug.LogWarning("TouchScript > Id [" + id + "] was in RELEASED list but no pointer with such id found."); #endif continue; } @@ -669,8 +680,8 @@ private void updateEnded(List pointers) #endif } - if (pointersEndedInvoker != null) - pointersEndedInvoker.InvokeHandleExceptions(this, PointerEventArgs.GetCachedEventArgs(list)); + if (pointersReleasedInvoker != null) + pointersReleasedInvoker.InvokeHandleExceptions(this, PointerEventArgs.GetCachedEventArgs(list)); for (var i = 0; i < endedCount; i++) { @@ -722,17 +733,17 @@ private void updatePointers() if (frameStartedInvoker != null) frameStartedInvoker.InvokeHandleExceptions(this, EventArgs.Empty); // need to copy buffers since they might get updated during execution - List beganList = null; + List pressedList = null; List updatedList = null; - List endedList = null; + List releasedList = null; List cancelledList = null; lock (pointerLock) { - if (pointersBegan.Count > 0) + if (pointersPressed.Count > 0) { - beganList = pointerListPool.Get(); - beganList.AddRange(pointersBegan); - pointersBegan.Clear(); + pressedList = pointerListPool.Get(); + pressedList.AddRange(pointersPressed); + pointersPressed.Clear(); } if (pointersUpdated.Count > 0) { @@ -740,11 +751,11 @@ private void updatePointers() updatedList.AddRange(pointersUpdated); pointersUpdated.Clear(); } - if (pointersEnded.Count > 0) + if (pointersReleased.Count > 0) { - endedList = intListPool.Get(); - endedList.AddRange(pointersEnded); - pointersEnded.Clear(); + releasedList = intListPool.Get(); + releasedList.AddRange(pointersReleased); + pointersReleased.Clear(); } if (pointersCancelled.Count > 0) { @@ -754,20 +765,20 @@ private void updatePointers() } } - if (beganList != null) + if (pressedList != null) { - updateBegan(beganList); - pointerListPool.Release(beganList); + updatePressed(pressedList); + pointerListPool.Release(pressedList); } if (updatedList != null) { updateUpdated(updatedList); intListPool.Release(updatedList); } - if (endedList != null) + if (releasedList != null) { - updateEnded(endedList); - intListPool.Release(endedList); + updateReleased(releasedList); + intListPool.Release(releasedList); } if (cancelledList != null) { diff --git a/Source/ProjectSettings/ProjectSettings.asset b/Source/ProjectSettings/ProjectSettings.asset index 592e3872c..a1c719b32 100644 --- a/Source/ProjectSettings/ProjectSettings.asset +++ b/Source/ProjectSettings/ProjectSettings.asset @@ -323,7 +323,7 @@ PlayerSettings: psmSplashimage: {fileID: 0} spritePackerPolicy: scriptingDefineSymbols: - 1: + 1: TOUCHSCRIPT_DEBUG 4: metroPackageName: General Examples metroPackageLogo: From 1b76a65dbf8f1032ea9b73eccdf5a6351ed0617a Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Mon, 4 Jul 2016 02:24:36 +0300 Subject: [PATCH 028/211] Adding functionality for new lifecycle events. MouseInput generates Move events. --- .../Scripts/InputSources/IInputSource.cs | 2 +- .../InputHandlers/MouseHandler.cs | 156 +++++++------ .../Scripts/InputSources/InputSource.cs | 50 ++-- .../Scripts/InputSources/StandardInput.cs | 8 +- .../TouchScript/Scripts/Layers/TouchLayer.cs | 14 +- .../TouchScript/Scripts/Pointers/Pointer.cs | 1 - .../Scripts/TouchManagerInstance.cs | 218 ++++++++++++++---- 7 files changed, 298 insertions(+), 151 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs b/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs index b6ee650fb..a576d2db2 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs @@ -40,6 +40,6 @@ public interface IRemapableInputSource public interface INTERNAL_IInputSource { - void INTERNAL_ReleasePointer(Pointer pointer); + void INTERNAL_DiscardPointer(Pointer pointer); } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs index 177d46d7e..9b0a673b1 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs @@ -32,10 +32,12 @@ public bool EmulateSecondMousePointer private bool emulateSecondMousePointer = true; - private Action beginPointer; - private Action movePointer; - private Action endPointer; - private Action cancelPointer; + private AddPointerDelegate addPointer; + private MovePointerDelegate movePointer; + private PressPointerDelegate pressPointer; + private ReleasePointerDelegate releasePointer; + private RemovePointerDelegate removePointer; + private CancelPointerDelegate cancelPointer; private ObjectPool mousePool; private MousePointer mousePointer, fakeMousePointer; @@ -46,18 +48,23 @@ public bool EmulateSecondMousePointer /// /// Initializes a new instance of the class. /// - /// A function called when a new pointer is detected. As this function must accept a Vector2 position of the new pointer and return an instance of . + /// A function called when a new pointer is detected. As this function must accept a Vector2 position of the new pointer and return an instance of . /// A function called when a pointer is moved. As this function must accept an int id and a Vector2 position. - /// A function called when a pointer is lifted off. As this function must accept an int id. + /// A function called when a pointer is lifted off. As this function must accept an int id. /// A function called when a pointer is cancelled. As this function must accept an int id. - public MouseHandler(Action beginPointer, Action movePointer, Action endPointer, Action cancelPointer) + public MouseHandler(AddPointerDelegate addPointer, MovePointerDelegate movePointer, PressPointerDelegate pressPointer, ReleasePointerDelegate releasePointer, RemovePointerDelegate removePointer, CancelPointerDelegate cancelPointer) { - this.beginPointer = beginPointer; + this.addPointer = addPointer; this.movePointer = movePointer; - this.endPointer = endPointer; + this.pressPointer = pressPointer; + this.releasePointer = releasePointer; + this.removePointer = removePointer; this.cancelPointer = cancelPointer; mousePool = new ObjectPool(4, () => new MousePointer(this), null, (t) => t.INTERNAL_Reset()); + + mousePointPos = Input.mousePosition; + mousePointer = internalAddPointer(mousePointPos); } #region Public methods @@ -69,12 +76,12 @@ public void EndPointers() { if (mousePointer != null) { - endPointer(mousePointer.Id); + releasePointer(mousePointer.Id); mousePointer = null; } if (fakeMousePointer != null) { - endPointer(fakeMousePointer.Id); + releasePointer(fakeMousePointer.Id); fakeMousePointer = null; } } @@ -84,65 +91,72 @@ public void EndPointers() /// public void UpdateInput() { - // If mouse button was pressed and released during the same frame, - // we need to figure out what happened first. - var upHandled = false; - if (Input.GetMouseButtonUp(0)) + var pos = Input.mousePosition; + if (mousePointPos != pos) { - // Release happened first? - if (mousePointer != null) - { - endPointer(mousePointer.Id); - mousePointer = null; - upHandled = true; - } + mousePointPos = pos; + movePointer(mousePointer.Id, new Vector2(pos.x, pos.y)); } - // Need to end fake pointer - if (emulateSecondMousePointer - && fakeMousePointer != null - && !(Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt))) - { - endPointer(fakeMousePointer.Id); - fakeMousePointer = null; - } - - if (Input.GetMouseButtonDown(0)) - { - var pos = Input.mousePosition; - if (emulateSecondMousePointer - && fakeMousePointer == null - && (Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt))) - { - fakeMousePointer = internalBeginPointer(new Vector2(pos.x, pos.y), Pointer.FLAG_FIRST_BUTTON | Pointer.FLAG_ARTIFICIAL); - } - else if (mousePointer == null) - { - mousePointer = internalBeginPointer(new Vector2(pos.x, pos.y), Pointer.FLAG_FIRST_BUTTON); - } - } - else if (Input.GetMouseButton(0)) - { - var pos = Input.mousePosition; - if (mousePointPos != pos) - { - mousePointPos = pos; - if (emulateSecondMousePointer - && fakeMousePointer != null) - { - if (mousePointer == null) movePointer(fakeMousePointer.Id, new Vector2(pos.x, pos.y)); - else movePointer(mousePointer.Id, new Vector2(pos.x, pos.y)); - } - else if (mousePointer != null) movePointer(mousePointer.Id, new Vector2(pos.x, pos.y)); - } - } - - // Release mouse if we haven't done it yet - if (Input.GetMouseButtonUp(0) && !upHandled && mousePointer != null) - { - endPointer(mousePointer.Id); - mousePointer = null; - } + //// If mouse button was pressed and released during the same frame, + //// we need to figure out what happened first. + //var upHandled = false; + //if (Input.GetMouseButtonUp(0)) + //{ + // // Release happened first? + // if (mousePointer != null) + // { + // releasePointer(mousePointer.Id); + // mousePointer = null; + // upHandled = true; + // } + //} + + //// Need to end fake pointer + //if (emulateSecondMousePointer + // && fakeMousePointer != null + // && !(Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt))) + //{ + // releasePointer(fakeMousePointer.Id); + // fakeMousePointer = null; + //} + + //if (Input.GetMouseButtonDown(0)) + //{ + // var pos = Input.mousePosition; + // if (emulateSecondMousePointer + // && fakeMousePointer == null + // && (Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt))) + // { + // fakeMousePointer = internalAddPointer(new Vector2(pos.x, pos.y), Pointer.FLAG_FIRST_BUTTON | Pointer.FLAG_ARTIFICIAL); + // } + // else if (mousePointer == null) + // { + // mousePointer = internalAddPointer(new Vector2(pos.x, pos.y), Pointer.FLAG_FIRST_BUTTON); + // } + //} + //else if (Input.GetMouseButton(0)) + //{ + // var pos = Input.mousePosition; + // if (mousePointPos != pos) + // { + // mousePointPos = pos; + // if (emulateSecondMousePointer + // && fakeMousePointer != null) + // { + // if (mousePointer == null) movePointer(fakeMousePointer.Id, new Vector2(pos.x, pos.y)); + // else movePointer(mousePointer.Id, new Vector2(pos.x, pos.y)); + // } + // else if (mousePointer != null) movePointer(mousePointer.Id, new Vector2(pos.x, pos.y)); + // } + //} + + //// Release mouse if we haven't done it yet + //if (Input.GetMouseButtonUp(0) && !upHandled && mousePointer != null) + //{ + // releasePointer(mousePointer.Id); + // mousePointer = null; + //} } /// @@ -184,7 +198,7 @@ public void Dispose() #region Internal methods - public void INTERNAL_ReleasePointer(Pointer pointer) + public void INTERNAL_DiscardPointer(Pointer pointer) { var p = pointer as MousePointer; if (p == null) return; @@ -196,10 +210,10 @@ public void INTERNAL_ReleasePointer(Pointer pointer) #region Private functions - private MousePointer internalBeginPointer(Vector2 position, uint flags) + private MousePointer internalAddPointer(Vector2 position, uint flags = 0) { var pointer = mousePool.Get(); - beginPointer(pointer, position, true); + addPointer(pointer, position); pointer.Flags |= flags; return pointer; } @@ -208,7 +222,7 @@ private MousePointer internalReturnPointer(MousePointer pointer, Vector2 positio { var newPointer = mousePool.Get(); newPointer.CopyFrom(pointer); - beginPointer(newPointer, position, false); + //pressPointer(newPointer, position, false); return newPointer; } diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs index 0f2091828..db4866cfc 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs @@ -8,6 +8,23 @@ namespace TouchScript.InputSources { + + #region Consts + + public delegate void AddPointerDelegate(Pointer pointer, Vector2 position, bool remap = true); + + public delegate void MovePointerDelegate(int id, Vector2 position); + + public delegate void PressPointerDelegate(int id); + + public delegate void ReleasePointerDelegate(int id); + + public delegate void RemovePointerDelegate(int id); + + public delegate void CancelPointerDelegate(int id); + + #endregion + /// /// Base class for all pointer input sources. /// @@ -53,7 +70,7 @@ public virtual bool CancelPointer(Pointer pointer, bool @return) #region Internal methods - public virtual void INTERNAL_ReleasePointer(Pointer pointer) {} + public virtual void INTERNAL_DiscardPointer(Pointer pointer) {} #endregion @@ -85,44 +102,43 @@ protected virtual void OnDisable() #region Protected methods - /// - /// Begin pointer in given screen position. - /// - /// Screen position. - /// New pointer. - protected virtual void beginPointer(Pointer pointer, Vector2 position, bool remap = true) + protected virtual void addPointer(Pointer pointer, Vector2 position, bool remap = true) { if (coordinatesRemapper != null && remap) position = coordinatesRemapper.Remap(position); - manager.INTERNAL_BeginPointer(pointer, position); + manager.INTERNAL_AddPointer(pointer, position); } /// - /// Mark pointer as updated. + /// Mark pointer as moved. /// /// Pointer id. - protected virtual void updatePointer(int id) + /// Screen position. + protected virtual void movePointer(int id, Vector2 position) { - manager.INTERNAL_UpdatePointer(id); + if (coordinatesRemapper != null) position = coordinatesRemapper.Remap(position); + manager.INTERNAL_MovePointer(id, position); } /// - /// Mark pointer as moved. + /// Begin pointer in given screen position. /// - /// Pointer id. /// Screen position. - protected virtual void movePointer(int id, Vector2 position) + /// New pointer. + protected virtual void pressPointer(int id) { - if (coordinatesRemapper != null) position = coordinatesRemapper.Remap(position); - manager.INTERNAL_MovePointer(id, position); } /// /// End pointer with id. /// /// Pointer id. + protected virtual void releasePointer(int id) + { + manager.INTERNAL_ReleasePointer(id); + } + protected virtual void endPointer(int id) { - manager.INTERNAL_EndPointer(id); } /// diff --git a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs index 9d04781b5..7cb556aff 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs @@ -334,7 +334,7 @@ protected override void OnDisable() private void enableMouse() { - mouseHandler = new MouseHandler(beginPointer, movePointer, endPointer, cancelPointer); + mouseHandler = new MouseHandler(addPointer, movePointer, pressPointer, releasePointer, endPointer, cancelPointer); mouseHandler.EmulateSecondMousePointer = emulateSecondMousePointer; Debug.Log("[TouchScript] Initialized Unity mouse input."); } @@ -350,7 +350,7 @@ private void disableMouse() private void enableTouch() { - touchHandler = new TouchHandler(beginPointer, movePointer, endPointer, cancelPointer); + //touchHandler = new TouchHandler(pressPointer, movePointer, releasePointer, cancelPointer); Debug.Log("[TouchScript] Initialized Unity touch input."); } @@ -381,7 +381,7 @@ private void disableWindows8Mouse() private void enableWindows7Touch() { - windows7PointerHandler = new Windows7PointerHandler(beginPointer, movePointer, endPointer, cancelPointer); + windows7PointerHandler = new Windows7PointerHandler(pressPointer, movePointer, releasePointer, cancelPointer); Debug.Log("[TouchScript] Initialized Windows 7 pointer input."); } @@ -396,7 +396,7 @@ private void disableWindows7Touch() private void enableWindows8Touch() { - windows8PointerHandler = new Windows8PointerHandler(beginPointer, movePointer, endPointer, cancelPointer); + windows8PointerHandler = new Windows8PointerHandler(pressPointer, movePointer, releasePointer, cancelPointer); Debug.Log("[TouchScript] Initialized Windows 8 pointer input."); } diff --git a/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs index 00911e70c..cf0a75010 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs @@ -166,7 +166,12 @@ protected virtual void OnDestroy() #region Internal methods - internal bool INTERNAL_BeginPointer(Pointer pointer) + internal void INTERNAL_UpdatePointer(Pointer pointer) + { + updatePointer(pointer); + } + + internal bool INTERNAL_PressPointer(Pointer pointer) { TouchHit hit; if (Delegate != null && Delegate.ShouldReceivePointer(this, pointer) == false) return false; @@ -183,12 +188,7 @@ internal bool INTERNAL_BeginPointer(Pointer pointer) return false; } - internal void INTERNAL_UpdatePointer(Pointer pointer) - { - updatePointer(pointer); - } - - internal void INTERNAL_EndPointer(Pointer pointer) + internal void INTERNAL_ReleasePointer(Pointer pointer) { endPointer(pointer); } diff --git a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs index 0d9c6c788..af58037e0 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs @@ -209,7 +209,6 @@ internal void INTERNAL_ResetPosition() { PreviousPosition = position; position = newPosition; - newPosition = position; } internal void INTERNAL_SetPosition(Vector2 value) diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs index 43227ea75..3b683d04f 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs @@ -211,9 +211,11 @@ public IList ActivePointers private Dictionary idToPointer = new Dictionary(30); // Upcoming changes - private List pointersPressed = new List(10); + private List pointersAdded = new List(10); private HashSet pointersUpdated = new HashSet(); + private HashSet pointersPressed = new HashSet(); private HashSet pointersReleased = new HashSet(); + private HashSet pointersRemoved = new HashSet(); private HashSet pointersCancelled = new HashSet(); private static ObjectPool> pointerListPool = new ObjectPool>(2, @@ -361,36 +363,41 @@ public void CancelPointer(int id) #region Internal methods - internal void INTERNAL_BeginPointer(Pointer pointer, Vector2 position) + internal void INTERNAL_AddPointer(Pointer pointer, Vector2 position) { lock (pointerLock) { pointer.INTERNAL_Init(nextPointerId++, position); - pointersPressed.Add(pointer); + pointersAdded.Add(pointer); } } - /// - /// Update pointer without moving it - /// - /// Pointer id - internal void INTERNAL_UpdatePointer(int id) + internal void INTERNAL_MovePointer(int id, Vector2 position) { lock (pointerLock) { - if (idToPointer.ContainsKey(id)) + Pointer pointer; + if (!idToPointer.TryGetValue(id, out pointer)) { - if (!pointersUpdated.Contains(id)) pointersUpdated.Add(id); - } + // This pointer was added this frame + pointer = pointersAdded.Find((t) => t.Id == id); + // No pointer with such id + if (pointer == null) + { #if TOUCHSCRIPT_DEBUG - else - Debug.LogWarning("TouchScript > Pointer with id [" + id + - "] is requested to UPDATE but no pointer with such id found."); + Debug.LogWarning("TouchScript > Pointer with id [" + id + "] is requested to MOVE to " + position + + " but no pointer with such id found."); #endif + return; + } + } + + pointer.INTERNAL_SetPosition(position); + if (!pointersUpdated.Contains(id)) pointersUpdated.Add(id); } } - internal void INTERNAL_MovePointer(int id, Vector2 position) + internal void INTERNAL_PressPointer(int id) { lock (pointerLock) { @@ -398,25 +405,28 @@ internal void INTERNAL_MovePointer(int id, Vector2 position) if (!idToPointer.TryGetValue(id, out pointer)) { // This pointer was added this frame - pointer = pointersPressed.Find((t) => t.Id == id); + pointer = pointersAdded.Find((t) => t.Id == id); // No pointer with such id if (pointer == null) { #if TOUCHSCRIPT_DEBUG - Debug.LogWarning("TouchScript > Pointer with id [" + id + "] is requested to MOVE to " + position + - " but no pointer with such id found."); + Debug.LogWarning("TouchScript > Pointer with id [" + id + + "] is requested to PRESS but no pointer with such id found."); #endif return; } } - - pointer.INTERNAL_SetPosition(position); - if (!pointersUpdated.Contains(id)) pointersUpdated.Add(id); + if (!pointersPressed.Contains(id)) pointersPressed.Add(id); +#if TOUCHSCRIPT_DEBUG + else + Debug.LogWarning("TouchScript > Pointer with id [" + id + + "] is requested to PRESS more than once this frame."); +#endif } } /// - internal void INTERNAL_EndPointer(int id) + internal void INTERNAL_ReleasePointer(int id) { lock (pointerLock) { @@ -424,7 +434,7 @@ internal void INTERNAL_EndPointer(int id) if (!idToPointer.TryGetValue(id, out pointer)) { // This pointer was added this frame - pointer = pointersPressed.Find((t) => t.Id == id); + pointer = pointersAdded.Find((t) => t.Id == id); // No pointer with such id if (pointer == null) { @@ -444,6 +454,35 @@ internal void INTERNAL_EndPointer(int id) } } + /// + internal void INTERNAL_RemovePointer(int id) + { + lock (pointerLock) + { + 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) + { +#if TOUCHSCRIPT_DEBUG + Debug.LogWarning("TouchScript > Pointer with id [" + id + + "] is requested to REMOVE but no pointer with such id found."); +#endif + return; + } + } + if (!pointersRemoved.Contains(id)) pointersRemoved.Add(pointer.Id); +#if TOUCHSCRIPT_DEBUG + else + Debug.LogWarning("TouchScript > Pointer with id [" + id + + "] is requested to REMOVE more than once this frame."); +#endif + } + } + /// internal void INTERNAL_CancelPointer(int id) { @@ -453,7 +492,7 @@ internal void INTERNAL_CancelPointer(int id) if (!idToPointer.TryGetValue(id, out pointer)) { // This pointer was added this frame - pointer = pointersPressed.Find((t) => t.Id == id); + pointer = pointersAdded.Find((t) => t.Id == id); // No pointer with such id if (pointer == null) { @@ -592,31 +631,24 @@ private void updateInputs() for (var i = 0; i < inputCount; i++) inputs[i].UpdateInput(); } - private void updatePressed(List pointers) + private void updateAdded(List pointers) { - var count = pointers.Count; + var addedCount = pointers.Count; var list = pointerListPool.Get(); - for (var i = 0; i < count; i++) + for (var i = 0; i < addedCount; i++) { var pointer = pointers[i]; list.Add(pointer); this.pointers.Add(pointer); idToPointer.Add(pointer.Id, pointer); - for (var j = 0; j < layerCount; j++) - { - var touchLayer = layers[j]; - if (touchLayer == null || !touchLayer.enabled) continue; - if (touchLayer.INTERNAL_BeginPointer(pointer)) break; - } - #if TOUCHSCRIPT_DEBUG addDebugFigureForPointer(pointer); #endif } - if (pointersPressedInvoker != null) - pointersPressedInvoker.InvokeHandleExceptions(this, PointerEventArgs.GetCachedEventArgs(list)); + if (pointersAddedInvoker != null) + pointersAddedInvoker.InvokeHandleExceptions(this, PointerEventArgs.GetCachedEventArgs(list)); pointerListPool.Release(list); } @@ -655,11 +687,45 @@ private void updateUpdated(List pointers) pointerListPool.Release(list); } + private void updatePressed(List pointers) + { + var pressedCount = pointers.Count; + var list = pointerListPool.Get(); + for (var i = 0; i < pressedCount; i++) + { + var id = pointers[i]; + Pointer pointer; + if (!idToPointer.TryGetValue(id, out pointer)) + { +#if TOUCHSCRIPT_DEBUG + Debug.LogWarning("TouchScript > Id [" + id + + "] was in PRESSED list but no pointer with such id found."); +#endif + continue; + } + list.Add(pointer); + for (var j = 0; j < layerCount; j++) + { + var touchLayer = layers[j]; + if (touchLayer == null || !touchLayer.enabled) continue; + if (touchLayer.INTERNAL_PressPointer(pointer)) break; + } + +#if TOUCHSCRIPT_DEBUG + addDebugFigureForPointer(pointer); +#endif + } + + if (pointersPressedInvoker != null) + pointersPressedInvoker.InvokeHandleExceptions(this, PointerEventArgs.GetCachedEventArgs(list)); + pointerListPool.Release(list); + } + private void updateReleased(List pointers) { - var endedCount = pointers.Count; + var releasedCount = pointers.Count; var list = pointerListPool.Get(); - for (var i = 0; i < endedCount; i++) + for (var i = 0; i < releasedCount; i++) { var id = pointers[i]; Pointer pointer; @@ -667,13 +733,41 @@ private void updateReleased(List pointers) { #if TOUCHSCRIPT_DEBUG Debug.LogWarning("TouchScript > Id [" + id + "] was in RELEASED list but no pointer with such id found."); +#endif + continue; + } + list.Add(pointer); + if (pointer.Layer != null) pointer.Layer.INTERNAL_ReleasePointer(pointer); + pointer.Layer = null; + +#if TOUCHSCRIPT_DEBUG + addDebugFigureForPointer(pointer); +#endif + } + + if (pointersReleasedInvoker != null) + pointersReleasedInvoker.InvokeHandleExceptions(this, PointerEventArgs.GetCachedEventArgs(list)); + pointerListPool.Release(list); + } + + private void updateRemoved(List pointers) + { + var removedCount = pointers.Count; + var list = pointerListPool.Get(); + for (var i = 0; i < removedCount; i++) + { + var id = pointers[i]; + Pointer pointer; + if (!idToPointer.TryGetValue(id, out pointer)) + { +#if TOUCHSCRIPT_DEBUG + Debug.LogWarning("TouchScript > Id [" + id + "] was in REMOVED list but no pointer with such id found."); #endif continue; } idToPointer.Remove(id); this.pointers.Remove(pointer); list.Add(pointer); - if (pointer.Layer != null) pointer.Layer.INTERNAL_EndPointer(pointer); #if TOUCHSCRIPT_DEBUG removeDebugFigureForPointer(pointer); @@ -683,10 +777,10 @@ private void updateReleased(List pointers) if (pointersReleasedInvoker != null) pointersReleasedInvoker.InvokeHandleExceptions(this, PointerEventArgs.GetCachedEventArgs(list)); - for (var i = 0; i < endedCount; i++) + for (var i = 0; i < removedCount; i++) { var pointer = list[i]; - pointer.InputSource.INTERNAL_ReleasePointer(pointer); + pointer.InputSource.INTERNAL_DiscardPointer(pointer); } pointerListPool.Release(list); } @@ -723,7 +817,7 @@ private void updateCancelled(List pointers) for (var i = 0; i < cancelledCount; i++) { var pointer = list[i]; - pointer.InputSource.INTERNAL_ReleasePointer(pointer); + pointer.InputSource.INTERNAL_DiscardPointer(pointer); } pointerListPool.Release(list); } @@ -733,17 +827,19 @@ private void updatePointers() if (frameStartedInvoker != null) frameStartedInvoker.InvokeHandleExceptions(this, EventArgs.Empty); // need to copy buffers since they might get updated during execution - List pressedList = null; + List addedList = null; List updatedList = null; + List pressedList = null; List releasedList = null; + List removedList = null; List cancelledList = null; lock (pointerLock) { - if (pointersPressed.Count > 0) + if (pointersAdded.Count > 0) { - pressedList = pointerListPool.Get(); - pressedList.AddRange(pointersPressed); - pointersPressed.Clear(); + addedList = pointerListPool.Get(); + addedList.AddRange(pointersAdded); + pointersAdded.Clear(); } if (pointersUpdated.Count > 0) { @@ -751,12 +847,24 @@ private void updatePointers() updatedList.AddRange(pointersUpdated); pointersUpdated.Clear(); } + if (pointersPressed.Count > 0) + { + pressedList = intListPool.Get(); + pressedList.AddRange(pointersPressed); + pointersPressed.Clear(); + } if (pointersReleased.Count > 0) { releasedList = intListPool.Get(); releasedList.AddRange(pointersReleased); pointersReleased.Clear(); } + if (pointersRemoved.Count > 0) + { + removedList = intListPool.Get(); + removedList.AddRange(pointersRemoved); + pointersRemoved.Clear(); + } if (pointersCancelled.Count > 0) { cancelledList = intListPool.Get(); @@ -765,21 +873,31 @@ private void updatePointers() } } - if (pressedList != null) + if (addedList != null) { - updatePressed(pressedList); - pointerListPool.Release(pressedList); + updateAdded(addedList); + pointerListPool.Release(addedList); } if (updatedList != null) { updateUpdated(updatedList); intListPool.Release(updatedList); } + if (pressedList != null) + { + updatePressed(pressedList); + intListPool.Release(pressedList); + } if (releasedList != null) { updateReleased(releasedList); intListPool.Release(releasedList); } + if (removedList != null) + { + updateRemoved(removedList); + intListPool.Release(removedList); + } if (cancelledList != null) { updateCancelled(cancelledList); From 36ab6bbac3aca1b9fef71fbddfced8dd76ad8591 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Mon, 4 Jul 2016 03:04:04 +0300 Subject: [PATCH 029/211] New events for mouse press/release work. --- .../InputHandlers/MouseHandler.cs | 37 +++++++++++++++++++ .../Scripts/InputSources/InputSource.cs | 1 + 2 files changed, 38 insertions(+) diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs index 9b0a673b1..c0f2bb0f3 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs @@ -91,6 +91,34 @@ public void EndPointers() /// public void UpdateInput() { + var flags = mousePointer.Flags & Pointer.FLAG_INCONTACT; + if (flags == 0) + { + // Hovering point + if (Input.GetMouseButtonDown(0) || Input.GetMouseButtonDown(1) || Input.GetMouseButtonDown(2)) + { + // But there was a click this frame + var newFlags = getMouseButtonFlags(); + mousePointer.Flags = (flags & ~Pointer.FLAG_INCONTACT) | newFlags; + pressPointer(mousePointer.Id); + if (newFlags == 0) + { + // And release the same frame + releasePointer(mousePointer.Id); + } + } + } + else + { + var newFlags = getMouseButtonFlags(); + mousePointer.Flags = (flags & ~Pointer.FLAG_INCONTACT) | newFlags; + if (newFlags == 0) + { + // Released this frame + releasePointer(mousePointer.Id); + } + } + var pos = Input.mousePosition; if (mousePointPos != pos) { @@ -210,6 +238,15 @@ public void INTERNAL_DiscardPointer(Pointer pointer) #region Private functions + private uint getMouseButtonFlags() + { + uint pressedButtons = 0; + if (Input.GetMouseButton(0)) pressedButtons |= Pointer.FLAG_FIRST_BUTTON; + if (Input.GetMouseButton(1)) pressedButtons |= Pointer.FLAG_SECOND_BUTTON; + if (Input.GetMouseButton(2)) pressedButtons |= Pointer.FLAG_THIRD_BUTTON; + return pressedButtons; + } + private MousePointer internalAddPointer(Vector2 position, uint flags = 0) { var pointer = mousePool.Get(); diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs index db4866cfc..8bbabad53 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs @@ -126,6 +126,7 @@ protected virtual void movePointer(int id, Vector2 position) /// New pointer. protected virtual void pressPointer(int id) { + manager.INTERNAL_PressPointer(id); } /// From 3289d6d52e8328662a0a46e56d6d9856ac0a0180 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Mon, 4 Jul 2016 04:20:36 +0300 Subject: [PATCH 030/211] =?UTF-8?q?Implemented=20mouse=20fake=20pointer,?= =?UTF-8?q?=20fixed=20pointer=20refcount=20error=20=E2=80=94=20now=20refco?= =?UTF-8?q?unt=20resets=20on=20release.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TouchScript/Scripts/ITouchManager.cs | 2 +- .../Scripts/InputSources/IInputSource.cs | 2 +- .../InputHandlers/MouseHandler.cs | 116 +++++++----------- .../Scripts/InputSources/InputSource.cs | 5 +- .../Scripts/InputSources/StandardInput.cs | 14 +-- .../TouchScript/Scripts/Pointers/Pointer.cs | 5 + .../Scripts/TouchManagerInstance.cs | 9 +- 7 files changed, 63 insertions(+), 90 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/ITouchManager.cs b/Source/Assets/TouchScript/Scripts/ITouchManager.cs index 91ba9507d..54392ea19 100644 --- a/Source/Assets/TouchScript/Scripts/ITouchManager.cs +++ b/Source/Assets/TouchScript/Scripts/ITouchManager.cs @@ -206,7 +206,7 @@ public interface ITouchManager /// /// Pointer id to cancel. /// Should the pointer be returned to the system. - void CancelPointer(int id, bool @return); + void CancelPointer(int id, bool shouldReturn); /// /// Cancels a pointer. diff --git a/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs b/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs index a576d2db2..66887a63a 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs @@ -26,7 +26,7 @@ public interface IInputSource : INTERNAL_IInputSource /// The pointer. /// if set to true returns the pointer back to the system with different id. /// True if the pointer belongs to this Input and was successfully cancelled; false otherwise. - bool CancelPointer(Pointer pointer, bool @return); + bool CancelPointer(Pointer pointer, bool shouldReturn); } public interface IRemapableInputSource diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs index c0f2bb0f3..234997d1f 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs @@ -91,8 +91,25 @@ public void EndPointers() /// public void UpdateInput() { - var flags = mousePointer.Flags & Pointer.FLAG_INCONTACT; - if (flags == 0) + if (fakeMousePointer != null + && !(Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt))) + { + fakeMousePointer.Flags = fakeMousePointer.Flags & ~Pointer.FLAG_INCONTACT; + releasePointer(fakeMousePointer.Id); + removePointer(fakeMousePointer.Id); + fakeMousePointer = null; + } + + var pos = Input.mousePosition; + if (mousePointPos != pos) + { + mousePointPos = pos; + movePointer(mousePointer.Id, new Vector2(pos.x, pos.y)); + } + + var flags = mousePointer.Flags; + var buttonFlags = flags & Pointer.FLAG_INCONTACT; + if (buttonFlags == 0) { // Hovering point if (Input.GetMouseButtonDown(0) || Input.GetMouseButtonDown(1) || Input.GetMouseButtonDown(2)) @@ -105,6 +122,13 @@ public void UpdateInput() { // And release the same frame releasePointer(mousePointer.Id); + if (emulateSecondMousePointer + && (Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt)) + && fakeMousePointer == null) + { + fakeMousePointer = internalAddPointer(mousePointPos); + fakeMousePointer.Flags = flags | Pointer.FLAG_ARTIFICIAL; + } } } } @@ -116,91 +140,31 @@ public void UpdateInput() { // Released this frame releasePointer(mousePointer.Id); + if (emulateSecondMousePointer + && (Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt)) + && fakeMousePointer == null) + { + fakeMousePointer = internalAddPointer(mousePointPos, flags | Pointer.FLAG_ARTIFICIAL); + pressPointer(fakeMousePointer.Id); + } } } - - var pos = Input.mousePosition; - if (mousePointPos != pos) - { - mousePointPos = pos; - movePointer(mousePointer.Id, new Vector2(pos.x, pos.y)); - } - - //// If mouse button was pressed and released during the same frame, - //// we need to figure out what happened first. - //var upHandled = false; - //if (Input.GetMouseButtonUp(0)) - //{ - // // Release happened first? - // if (mousePointer != null) - // { - // releasePointer(mousePointer.Id); - // mousePointer = null; - // upHandled = true; - // } - //} - - //// Need to end fake pointer - //if (emulateSecondMousePointer - // && fakeMousePointer != null - // && !(Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt))) - //{ - // releasePointer(fakeMousePointer.Id); - // fakeMousePointer = null; - //} - - //if (Input.GetMouseButtonDown(0)) - //{ - // var pos = Input.mousePosition; - // if (emulateSecondMousePointer - // && fakeMousePointer == null - // && (Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt))) - // { - // fakeMousePointer = internalAddPointer(new Vector2(pos.x, pos.y), Pointer.FLAG_FIRST_BUTTON | Pointer.FLAG_ARTIFICIAL); - // } - // else if (mousePointer == null) - // { - // mousePointer = internalAddPointer(new Vector2(pos.x, pos.y), Pointer.FLAG_FIRST_BUTTON); - // } - //} - //else if (Input.GetMouseButton(0)) - //{ - // var pos = Input.mousePosition; - // if (mousePointPos != pos) - // { - // mousePointPos = pos; - // if (emulateSecondMousePointer - // && fakeMousePointer != null) - // { - // if (mousePointer == null) movePointer(fakeMousePointer.Id, new Vector2(pos.x, pos.y)); - // else movePointer(mousePointer.Id, new Vector2(pos.x, pos.y)); - // } - // else if (mousePointer != null) movePointer(mousePointer.Id, new Vector2(pos.x, pos.y)); - // } - //} - - //// Release mouse if we haven't done it yet - //if (Input.GetMouseButtonUp(0) && !upHandled && mousePointer != null) - //{ - // releasePointer(mousePointer.Id); - // mousePointer = null; - //} } /// - public bool CancelPointer(Pointer pointer, bool @return) + public bool CancelPointer(Pointer pointer, bool shouldReturn) { if (pointer.Equals(mousePointer)) { cancelPointer(mousePointer.Id); - if (@return) mousePointer = internalReturnPointer(mousePointer, pointer.Position); - else mousePointer = null; + if (shouldReturn) mousePointer = internalReturnPointer(mousePointer, pointer.Position); + else mousePointer = internalAddPointer(mousePointPos); // can't totally cancell mouse pointer return true; } if (pointer.Equals(fakeMousePointer)) { cancelPointer(fakeMousePointer.Id); - if (@return) fakeMousePointer = internalReturnPointer(fakeMousePointer, pointer.Position); + if (shouldReturn) fakeMousePointer = internalReturnPointer(fakeMousePointer, pointer.Position); else fakeMousePointer = null; return true; } @@ -258,8 +222,10 @@ private MousePointer internalAddPointer(Vector2 position, uint flags = 0) private MousePointer internalReturnPointer(MousePointer pointer, Vector2 position) { var newPointer = mousePool.Get(); - newPointer.CopyFrom(pointer); - //pressPointer(newPointer, position, false); +// newPointer.CopyFrom(pointer); + newPointer.Flags = pointer.Flags; + addPointer(newPointer, position, false); + if ((newPointer.Flags & Pointer.FLAG_INCONTACT) != 0) pressPointer(newPointer.Id); return newPointer; } diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs index 8bbabad53..5fdc9b16c 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs @@ -61,7 +61,7 @@ public ICoordinatesRemapper CoordinatesRemapper public virtual void UpdateInput() {} /// - public virtual bool CancelPointer(Pointer pointer, bool @return) + public virtual bool CancelPointer(Pointer pointer, bool shouldReturn) { return false; } @@ -138,8 +138,9 @@ protected virtual void releasePointer(int id) manager.INTERNAL_ReleasePointer(id); } - protected virtual void endPointer(int id) + protected virtual void removePointer(int id) { + manager.INTERNAL_RemovePointer(id); } /// diff --git a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs index 7cb556aff..2ddc6f655 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs @@ -213,16 +213,16 @@ public override void UpdateInput() } /// - public override bool CancelPointer(Pointer pointer, bool @return) + public override bool CancelPointer(Pointer pointer, bool shouldReturn) { - base.CancelPointer(pointer, @return); + base.CancelPointer(pointer, shouldReturn); var handled = false; - if (touchHandler != null) handled = touchHandler.CancelPointer(pointer, @return); - if (mouseHandler != null && !handled) handled = mouseHandler.CancelPointer(pointer, @return); + if (touchHandler != null) handled = touchHandler.CancelPointer(pointer, shouldReturn); + if (mouseHandler != null && !handled) handled = mouseHandler.CancelPointer(pointer, shouldReturn); #if UNITY_STANDALONE_WIN && !UNITY_EDITOR - if (windows7PointerHandler != null && !handled) handled = windows7PointerHandler.CancelPointer(pointer, @return); - if (windows8PointerHandler != null && !handled) handled = windows8PointerHandler.CancelPointer(pointer, @return); + if (windows7PointerHandler != null && !handled) handled = windows7PointerHandler.CancelPointer(pointer, shouldReturn); + if (windows8PointerHandler != null && !handled) handled = windows8PointerHandler.CancelPointer(pointer, shouldReturn); #endif return handled; @@ -334,7 +334,7 @@ protected override void OnDisable() private void enableMouse() { - mouseHandler = new MouseHandler(addPointer, movePointer, pressPointer, releasePointer, endPointer, cancelPointer); + mouseHandler = new MouseHandler(addPointer, movePointer, pressPointer, releasePointer, removePointer, cancelPointer); mouseHandler.EmulateSecondMousePointer = emulateSecondMousePointer; Debug.Log("[TouchScript] Initialized Unity mouse input."); } diff --git a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs index af58037e0..f3eabb532 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs @@ -226,6 +226,11 @@ internal int INTERNAL_Release() return --refCount; } + internal void INTERNAL_ClearRefCount() + { + refCount = 0; + } + #endregion } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs index 3b683d04f..a44d2c54a 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs @@ -344,12 +344,12 @@ public bool GetHitTarget(Vector2 position, out TouchHit hit, out TouchLayer laye } /// - public void CancelPointer(int id, bool @return) + public void CancelPointer(int id, bool shouldReturn) { Pointer pointer; if (idToPointer.TryGetValue(id, out pointer)) { - pointer.InputSource.CancelPointer(pointer, @return); + pointer.InputSource.CancelPointer(pointer, shouldReturn); } } @@ -451,6 +451,7 @@ internal void INTERNAL_ReleasePointer(int id) Debug.LogWarning("TouchScript > Pointer with id [" + id + "] is requested to END more than once this frame."); #endif + pointer.INTERNAL_ClearRefCount(); } } @@ -774,8 +775,8 @@ private void updateRemoved(List pointers) #endif } - if (pointersReleasedInvoker != null) - pointersReleasedInvoker.InvokeHandleExceptions(this, PointerEventArgs.GetCachedEventArgs(list)); + if (pointersRemovedInvoker != null) + pointersRemovedInvoker.InvokeHandleExceptions(this, PointerEventArgs.GetCachedEventArgs(list)); for (var i = 0; i < removedCount; i++) { From 645a9ac790f5c9d9376b9f5a95c1ec248bab3abb Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 5 Jul 2016 03:35:03 +0300 Subject: [PATCH 031/211] Removed EndPointers from MouseHandler since it doesn't seem to make sense with Input.simulateMouseWithTouches = false; --- .../InputSources/InputHandlers/MouseHandler.cs | 17 ----------------- .../Scripts/InputSources/StandardInput.cs | 16 ++++------------ 2 files changed, 4 insertions(+), 29 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs index 234997d1f..8a5f2de1e 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs @@ -69,23 +69,6 @@ public MouseHandler(AddPointerDelegate addPointer, MovePointerDelegate movePoint #region Public methods - /// - /// Immediately ends all pointers. - /// - public void EndPointers() - { - if (mousePointer != null) - { - releasePointer(mousePointer.Id); - mousePointer = null; - } - if (fakeMousePointer != null) - { - releasePointer(fakeMousePointer.Id); - fakeMousePointer = null; - } - } - /// /// Updates this instance. /// diff --git a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs index 2ddc6f655..eb8809191 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs @@ -198,18 +198,8 @@ public override void UpdateInput() { base.UpdateInput(); - if (touchHandler != null) - { - touchHandler.UpdateInput(); - // Unity adds mouse events from touches resulting in duplicated pointers. - // Don't update mouse if pointer input is present. - if (mouseHandler != null) - { - if (touchHandler.HasPointers) mouseHandler.EndPointers(); - else mouseHandler.UpdateInput(); - } - } - else if (mouseHandler != null) mouseHandler.UpdateInput(); + if (touchHandler != null) touchHandler.UpdateInput(); + if (mouseHandler != null) mouseHandler.UpdateInput(); } /// @@ -237,6 +227,8 @@ protected override void OnEnable() { base.OnEnable(); + Input.simulateMouseWithTouches = false; + #if UNITY_EDITOR enableTouch(); enableMouse(); From 2fb9e37fb4f585dd22837d2a5a25e0e083358259 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 5 Jul 2016 03:37:26 +0300 Subject: [PATCH 032/211] Removed MouseInput and MobileInput. --- .../Editor/InputSources/MobileInputEditor.cs | 34 ------- .../InputSources/MobileInputEditor.cs.meta | 12 --- .../Editor/InputSources/MouseInputEditor.cs | 35 ------- .../InputSources/MouseInputEditor.cs.meta | 12 --- .../Scripts/InputSources/MobileInput.cs | 99 ------------------- .../Scripts/InputSources/MobileInput.cs.meta | 12 --- .../Scripts/InputSources/MouseInput.cs | 97 ------------------ .../Scripts/InputSources/MouseInput.cs.meta | 12 --- 8 files changed, 313 deletions(-) delete mode 100644 Source/Assets/TouchScript/Editor/InputSources/MobileInputEditor.cs delete mode 100644 Source/Assets/TouchScript/Editor/InputSources/MobileInputEditor.cs.meta delete mode 100644 Source/Assets/TouchScript/Editor/InputSources/MouseInputEditor.cs delete mode 100644 Source/Assets/TouchScript/Editor/InputSources/MouseInputEditor.cs.meta delete mode 100644 Source/Assets/TouchScript/Scripts/InputSources/MobileInput.cs delete mode 100644 Source/Assets/TouchScript/Scripts/InputSources/MobileInput.cs.meta delete mode 100644 Source/Assets/TouchScript/Scripts/InputSources/MouseInput.cs delete mode 100644 Source/Assets/TouchScript/Scripts/InputSources/MouseInput.cs.meta diff --git a/Source/Assets/TouchScript/Editor/InputSources/MobileInputEditor.cs b/Source/Assets/TouchScript/Editor/InputSources/MobileInputEditor.cs deleted file mode 100644 index 3b5b213d2..000000000 --- a/Source/Assets/TouchScript/Editor/InputSources/MobileInputEditor.cs +++ /dev/null @@ -1,34 +0,0 @@ -/* - * @author Valentin Simonov / http://va.lent.in/ - */ - -using TouchScript.InputSources; -using UnityEditor; - -namespace TouchScript.Editor.InputSources -{ -#pragma warning disable 0618 - [CustomEditor(typeof (MobileInput), true)] -#pragma warning restore 0618 - internal sealed class MobileInputEditor : InputSourceEditor - { - private SerializedProperty disableOnNonTouchPlatforms; - - protected override void OnEnable() - { - base.OnEnable(); - - disableOnNonTouchPlatforms = serializedObject.FindProperty("DisableOnNonTouchPlatforms"); - } - - public override void OnInspectorGUI() - { - serializedObject.UpdateIfDirtyOrScript(); - - EditorGUILayout.PropertyField(disableOnNonTouchPlatforms); - - serializedObject.ApplyModifiedProperties(); - base.OnInspectorGUI(); - } - } -} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Editor/InputSources/MobileInputEditor.cs.meta b/Source/Assets/TouchScript/Editor/InputSources/MobileInputEditor.cs.meta deleted file mode 100644 index c7c046401..000000000 --- a/Source/Assets/TouchScript/Editor/InputSources/MobileInputEditor.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 8fa81a2cd8d004ae49a1960cd7fa1862 -timeCreated: 1447582130 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Source/Assets/TouchScript/Editor/InputSources/MouseInputEditor.cs b/Source/Assets/TouchScript/Editor/InputSources/MouseInputEditor.cs deleted file mode 100644 index 848e3e5d3..000000000 --- a/Source/Assets/TouchScript/Editor/InputSources/MouseInputEditor.cs +++ /dev/null @@ -1,35 +0,0 @@ -/* - * @author Valentin Simonov / http://va.lent.in/ - */ - -using TouchScript.InputSources; -using UnityEditor; - -namespace TouchScript.Editor.InputSources -{ -#pragma warning disable 0618 - [CustomEditor(typeof(MouseInput), true)] -#pragma warning restore 0618 - internal sealed class MouseInputEditor : InputSourceEditor - { - private SerializedProperty disableOnMobilePlatforms; - - protected override void OnEnable() - { - base.OnEnable(); - - disableOnMobilePlatforms = serializedObject.FindProperty("DisableOnMobilePlatforms"); - } - - public override void OnInspectorGUI() - { - serializedObject.UpdateIfDirtyOrScript(); - - EditorGUILayout.PropertyField(disableOnMobilePlatforms); - - serializedObject.ApplyModifiedProperties(); - base.OnInspectorGUI(); - } - - } -} diff --git a/Source/Assets/TouchScript/Editor/InputSources/MouseInputEditor.cs.meta b/Source/Assets/TouchScript/Editor/InputSources/MouseInputEditor.cs.meta deleted file mode 100644 index f831d438d..000000000 --- a/Source/Assets/TouchScript/Editor/InputSources/MouseInputEditor.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 2675434635a8a4b3dbdd6aef444c8ebe -timeCreated: 1447582130 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/InputSources/MobileInput.cs b/Source/Assets/TouchScript/Scripts/InputSources/MobileInput.cs deleted file mode 100644 index cc441dea9..000000000 --- a/Source/Assets/TouchScript/Scripts/InputSources/MobileInput.cs +++ /dev/null @@ -1,99 +0,0 @@ -/* - * @author Michael Holub - * @author Valentin Simonov / http://va.lent.in/ - */ - -using TouchScript.Utils.Attributes; -using TouchScript.Pointers; -using TouchScript.InputSources.InputHandlers; -using UnityEngine; - -namespace TouchScript.InputSources -{ - /// - /// Mobile Input Source. Gathers touch input from built-in Unity's Input.Touches API. Though, should be used on mobile devices. - /// - [System.Obsolete("MobileInput is deprecated! Please use StandardInput instead.")] - public sealed class MobileInput : InputSource - { - #region Public properties - - /// - /// Indicates if this input source should be disabled on platforms which don't support pointer input with Input.Pointers. - /// - [ToggleLeft] - public bool DisableOnNonTouchPlatforms = true; - - #endregion - - #region Private variables - - private TouchHandler touchHandler; - - #endregion - - #region Public methods - - /// - public override void UpdateInput() - { - base.UpdateInput(); - - if (touchHandler != null) touchHandler.UpdateInput(); - } - - /// - public override bool CancelPointer(Pointer pointer, bool @return) - { - if (touchHandler != null) return touchHandler.CancelPointer(pointer, @return); - return base.CancelPointer(pointer, @return); - } - - #endregion - - #region Unity methods - - /// - protected override void OnEnable() - { - Debug.LogWarning("[TouchScript] MobileInput is deprecated! Please use StandardInput instead."); - - if (DisableOnNonTouchPlatforms) - { - switch (Application.platform) - { - case RuntimePlatform.Android: - case RuntimePlatform.IPhonePlayer: - case RuntimePlatform.MetroPlayerARM: - case RuntimePlatform.MetroPlayerX64: - case RuntimePlatform.MetroPlayerX86: - case RuntimePlatform.WP8Player: - case RuntimePlatform.BlackBerryPlayer: - break; - default: - // don't need mobile pointer here - enabled = false; - return; - } - } - - touchHandler = new TouchHandler(beginPointer, movePointer, endPointer, cancelPointer); - - base.OnEnable(); - } - - /// - protected override void OnDisable() - { - if (touchHandler != null) - { - touchHandler.Dispose(); - touchHandler = null; - } - - base.OnDisable(); - } - - #endregion - } -} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/InputSources/MobileInput.cs.meta b/Source/Assets/TouchScript/Scripts/InputSources/MobileInput.cs.meta deleted file mode 100644 index 5ee21e83d..000000000 --- a/Source/Assets/TouchScript/Scripts/InputSources/MobileInput.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 33cbf52dea18b40649d742b0c6f96d3c -timeCreated: 1447582130 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/InputSources/MouseInput.cs b/Source/Assets/TouchScript/Scripts/InputSources/MouseInput.cs deleted file mode 100644 index 34a6d9ce6..000000000 --- a/Source/Assets/TouchScript/Scripts/InputSources/MouseInput.cs +++ /dev/null @@ -1,97 +0,0 @@ -/* - * @author Valentin Simonov / http://va.lent.in/ - */ - -using TouchScript.Utils.Attributes; -using TouchScript.Pointers; -using TouchScript.InputSources.InputHandlers; -using UnityEngine; - -namespace TouchScript.InputSources -{ - /// - /// Input source which transforms mouse to pointer. - /// - [System.Obsolete("MouseInput is deprecated! Please use StandardInput instead.")] - public sealed class MouseInput : InputSource - { - #region Public properties - - /// - /// Indicates if this input source should be disabled on mobile platforms. - /// - /// - /// Operation Systems which support touch input send first touches as mouse clicks which may result in duplicated pointer points in exactly the same coordinates. This affects clusters and multitouch gestures. - /// - [ToggleLeft] - public bool DisableOnMobilePlatforms = true; - - #endregion - - #region Private variables - - private MouseHandler mouseHandler; - - #endregion - - #region Public methods - - /// - public override void UpdateInput() - { - base.UpdateInput(); - - mouseHandler.UpdateInput(); - } - - /// - public override bool CancelPointer(Pointer pointer, bool @return) - { - if (mouseHandler != null) return mouseHandler.CancelPointer(pointer, @return); - return base.CancelPointer(pointer, @return); - } - - #endregion - - #region Unity methods - - /// - protected override void OnEnable() - { - base.OnEnable(); - - Debug.LogWarning("[TouchScript] MouseInput is deprecated! Please use StandardInput instead."); - - if (DisableOnMobilePlatforms) - { - switch (Application.platform) - { - case RuntimePlatform.Android: - case RuntimePlatform.IPhonePlayer: - case RuntimePlatform.WP8Player: - case RuntimePlatform.MetroPlayerARM: - case RuntimePlatform.MetroPlayerX64: - case RuntimePlatform.MetroPlayerX86: - case RuntimePlatform.TizenPlayer: - case RuntimePlatform.BlackBerryPlayer: - // don't need mouse here - enabled = false; - return; - } - } - - mouseHandler = new MouseHandler(beginPointer, movePointer, endPointer, cancelPointer); - } - - /// - protected override void OnDisable() - { - mouseHandler.Dispose(); - mouseHandler = null; - - base.OnDisable(); - } - - #endregion - } -} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/InputSources/MouseInput.cs.meta b/Source/Assets/TouchScript/Scripts/InputSources/MouseInput.cs.meta deleted file mode 100644 index e01a1e26f..000000000 --- a/Source/Assets/TouchScript/Scripts/InputSources/MouseInput.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 17fdf02507df2433595874500f6eef4c -timeCreated: 1447582130 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: From ba4889cce713db63f25d014bd1ca828f20f296f0 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 5 Jul 2016 03:43:02 +0300 Subject: [PATCH 033/211] Fixed a typo in MouseHandler dealing with fake mouse pointer. --- .../Scripts/InputSources/InputHandlers/MouseHandler.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs index 8a5f2de1e..d72a77f8a 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs @@ -109,8 +109,8 @@ public void UpdateInput() && (Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt)) && fakeMousePointer == null) { - fakeMousePointer = internalAddPointer(mousePointPos); - fakeMousePointer.Flags = flags | Pointer.FLAG_ARTIFICIAL; + fakeMousePointer = internalAddPointer(mousePointPos, flags | Pointer.FLAG_ARTIFICIAL); + pressPointer(fakeMousePointer.Id); } } } From bf94637dd02ba3eea00a181ef5a95926dcb7887b Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 5 Jul 2016 04:09:11 +0300 Subject: [PATCH 034/211] Pointer.CopyFrom shouldn't copy hit/target values. --- .../Scripts/InputSources/InputHandlers/MouseHandler.cs | 3 +-- Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs | 5 ----- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs index d72a77f8a..f9e4cf3ef 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs @@ -205,8 +205,7 @@ private MousePointer internalAddPointer(Vector2 position, uint flags = 0) private MousePointer internalReturnPointer(MousePointer pointer, Vector2 position) { var newPointer = mousePool.Get(); -// newPointer.CopyFrom(pointer); - newPointer.Flags = pointer.Flags; + newPointer.CopyFrom(pointer); addPointer(newPointer, position, false); if ((newPointer.Flags & Pointer.FLAG_INCONTACT) != 0) pressPointer(newPointer.Id); return newPointer; diff --git a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs index f3eabb532..4c61a0541 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs @@ -138,13 +138,8 @@ public ProjectionParams ProjectionParams public virtual void CopyFrom(Pointer target) { - Id = target.Id; Type = target.Type; Flags = target.Flags; - Target = target.Target; - Hit = target.Hit; - Layer = target.Layer; - InputSource = target.InputSource; position = target.position; PreviousPosition = target.PreviousPosition; newPosition = target.newPosition; From 31ffca4eb4f964d337c8d2daebe9fda195c3bf99 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 5 Jul 2016 04:09:32 +0300 Subject: [PATCH 035/211] Oops, can't use Time.unscaledTime in another thread. --- Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs b/Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs index 85c02a6a8..338ae5011 100644 --- a/Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs +++ b/Source/Assets/TouchScript/Scripts/Utils/ObjectPool.cs @@ -98,13 +98,13 @@ public void Release(T element) private void log(string message) { if (string.IsNullOrEmpty(Name)) return; - UnityEngine.Debug.LogFormat("[{0}] ObjectPool ({1}): {2}", Time.unscaledTime, Name, message); + UnityEngine.Debug.LogFormat("[{0}] ObjectPool ({1}): {2}", DateTime.Now.ToString("hh:mm:ss.fff"), Name, message); } private void logError(string message) { if (string.IsNullOrEmpty(Name)) return; - UnityEngine.Debug.LogErrorFormat("[{0}] ObjectPool ({1}): {2}", Time.unscaledTime, Name, message); + UnityEngine.Debug.LogErrorFormat("[{0}] ObjectPool ({1}): {2}", DateTime.Now.ToString("hh:mm:ss.fff"), Name, message); } #endif } From 30c6c3d1689adc389710d2b56d9ea06189d9c3f3 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 5 Jul 2016 04:10:35 +0300 Subject: [PATCH 036/211] Added new events to TuioInput. --- .../TUIO/Scripts/InputSources/TuioInput.cs | 48 +++++++++++-------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs b/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs index 37eb59401..11667920f 100644 --- a/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs +++ b/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs @@ -108,6 +108,7 @@ public InputType SupportedInputs public TuioInput() { touchPool = new ObjectPool(20, () => new TouchPointer(this), null, (t) => t.INTERNAL_Reset()); + touchPool.Name = "TUIO"; objectPool = new ObjectPool(10, () => new ObjectPointer(this), null, (t) => t.INTERNAL_Reset()); } @@ -124,9 +125,9 @@ public override void UpdateInput() } /// - public override bool CancelPointer(Pointer pointer, bool @return) + public override bool CancelPointer(Pointer pointer, bool shouldReturn) { - base.CancelPointer(pointer, @return); + base.CancelPointer(pointer, shouldReturn); lock (this) { if (pointer.Type == Pointer.PointerType.Touch) @@ -143,7 +144,7 @@ public override bool CancelPointer(Pointer pointer, bool @return) if (cursor != null) { cancelPointer(pointer.Id); - if (@return) + if (shouldReturn) { cursorToInternalId[cursor] = internalReturnTouch(pointer as TouchPointer, pointer.Position); } @@ -168,7 +169,7 @@ public override bool CancelPointer(Pointer pointer, bool @return) if (obj != null) { cancelPointer(pointer.Id); - if (@return) + if (shouldReturn) { objectToInternalId[obj] = internalReturnObject(pointer as ObjectPointer, pointer.Position); } @@ -191,7 +192,7 @@ public override bool CancelPointer(Pointer pointer, bool @return) if (blob != null) { cancelPointer(pointer.Id); - if (@return) + if (shouldReturn) { blobToInternalId[blob] = internalReturnObject(pointer as ObjectPointer, pointer.Position); } @@ -210,7 +211,7 @@ public override bool CancelPointer(Pointer pointer, bool @return) #region Internal methods - public override void INTERNAL_ReleasePointer(Pointer pointer) + public override void INTERNAL_DiscardPointer(Pointer pointer) { if (pointer.Type == Pointer.PointerType.Touch) { @@ -262,11 +263,12 @@ protected override void OnDisable() #region Private functions - private TouchPointer internalBeginTouch(Vector2 position) + private TouchPointer internalAddTouch(Vector2 position, uint flags = 0) { var pointer = touchPool.Get(); - beginPointer(pointer, position, true); - pointer.Flags |= Pointer.FLAG_FIRST_BUTTON; + addPointer(pointer, position, true); + pressPointer(pointer.Id); + pointer.Flags |= flags; return pointer; } @@ -274,15 +276,17 @@ private TouchPointer internalReturnTouch(TouchPointer pointer, Vector2 position) { var newPointer = touchPool.Get(); newPointer.CopyFrom(pointer); - beginPointer(newPointer, position, false); + addPointer(newPointer, position, false); + pressPointer(newPointer.Id); return newPointer; } - private ObjectPointer internalBeginObject(Vector2 position, bool remap = true) + private ObjectPointer internalAddObject(Vector2 position, uint flags = 0) { var pointer = objectPool.Get(); - beginPointer(pointer, position, remap); - pointer.Flags |= Pointer.FLAG_FIRST_BUTTON; + addPointer(pointer, position, true); + pressPointer(pointer.Id); + pointer.Flags |= flags; return pointer; } @@ -290,7 +294,8 @@ private ObjectPointer internalReturnObject(ObjectPointer pointer, Vector2 positi { var newPointer = objectPool.Get(); newPointer.CopyFrom(pointer); - beginPointer(newPointer, position, false); + addPointer(newPointer, position, false); + pressPointer(newPointer.Id); return newPointer; } @@ -354,7 +359,7 @@ private void OnCursorAdded(object sender, TuioCursorEventArgs e) { var x = entity.X * screenWidth; var y = (1 - entity.Y) * screenHeight; - cursorToInternalId.Add(entity, internalBeginTouch(new Vector2(x, y))); + cursorToInternalId.Add(entity, internalAddTouch(new Vector2(x, y), Pointer.FLAG_FIRST_BUTTON)); } } @@ -382,7 +387,8 @@ private void OnCursorRemoved(object sender, TuioCursorEventArgs e) if (!cursorToInternalId.TryGetValue(entity, out touch)) return; cursorToInternalId.Remove(entity); - endPointer(touch.Id); + releasePointer(touch.Id); + removePointer(touch.Id); } } @@ -393,7 +399,7 @@ private void OnBlobAdded(object sender, TuioBlobEventArgs e) { var x = entity.X * screenWidth; var y = (1 - entity.Y) * screenHeight; - var touch = internalBeginObject(new Vector2(x, y)); + var touch = internalAddObject(new Vector2(x, y), Pointer.FLAG_FIRST_BUTTON); updateBlobProperties(touch, entity); blobToInternalId.Add(entity, touch); } @@ -424,7 +430,8 @@ private void OnBlobRemoved(object sender, TuioBlobEventArgs e) if (!blobToInternalId.TryGetValue(entity, out touch)) return; blobToInternalId.Remove(entity); - endPointer(touch.Id); + releasePointer(touch.Id); + removePointer(touch.Id); } } @@ -435,7 +442,7 @@ private void OnObjectAdded(object sender, TuioObjectEventArgs e) { var x = entity.X * screenWidth; var y = (1 - entity.Y) * screenHeight; - var touch = internalBeginObject(new Vector2(x, y)); + var touch = internalAddObject(new Vector2(x, y), Pointer.FLAG_FIRST_BUTTON); updateObjectProperties(touch, entity); objectToInternalId.Add(entity, touch); } @@ -466,7 +473,8 @@ private void OnObjectRemoved(object sender, TuioObjectEventArgs e) if (!objectToInternalId.TryGetValue(entity, out touch)) return; objectToInternalId.Remove(entity); - endPointer(touch.Id); + releasePointer(touch.Id); + removePointer(touch.Id); } } From 3a2fb4ea5528aead3b328c4391c7f88e32888824 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 5 Jul 2016 06:10:54 +0300 Subject: [PATCH 037/211] Updated MetaGesture with new events. --- .../Scripts/Gestures/MetaGesture.cs | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs index 6c7430d8b..51ce8fff0 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs @@ -22,7 +22,7 @@ public sealed class MetaGesture : Gesture /// /// Message dispatched when a pointer begins. /// - public const string POINTER_BEGAN_MESSAGE = "OnPointerBegan"; + public const string POINTER_PRESSED_MESSAGE = "OnPointerPressed"; /// /// Message dispatched when a pointer moves. @@ -32,7 +32,7 @@ public sealed class MetaGesture : Gesture /// /// Message dispatched when a pointer ends. /// - public const string POINTER_ENDED_MESSAGE = "OnPointerEnded"; + public const string POINTER_RELEASED_MESSAGE = "OnPointerReleased"; /// /// Message dispatched when a pointer is cancelled. @@ -46,10 +46,10 @@ public sealed class MetaGesture : Gesture /// /// Occurs when a pointer is added. /// - public event EventHandler PointerBegan + public event EventHandler PointerPressed { - add { pointerBeganInvoker += value; } - remove { pointerBeganInvoker -= value; } + add { pointerPressedInvoker += value; } + remove { pointerPressedInvoker -= value; } } /// @@ -64,10 +64,10 @@ public event EventHandler PointerMoved /// /// Occurs when a pointer is removed. /// - public event EventHandler PointerEnded + public event EventHandler PointerReleased { - add { pointerEndedInvoker += value; } - remove { pointerEndedInvoker -= value; } + add { pointerReleasedInvoker += value; } + remove { pointerReleasedInvoker -= value; } } /// @@ -80,9 +80,9 @@ public event EventHandler PointerCancelled } // Needed to overcome iOS AOT limitations - private EventHandler pointerBeganInvoker, + private EventHandler pointerPressedInvoker, pointerMovedInvoker, - pointerEndedInvoker, + pointerReleasedInvoker, pointerCancelledInvoker; #endregion @@ -97,14 +97,14 @@ protected override void pointersPressed(IList pointers) if (State == GestureState.Possible) setState(GestureState.Began); var length = pointers.Count; - if (pointerBeganInvoker != null) + if (pointerPressedInvoker != null) { for (var i = 0; i < length; i++) - pointerBeganInvoker.InvokeHandleExceptions(this, new MetaGestureEventArgs(pointers[i])); + pointerPressedInvoker.InvokeHandleExceptions(this, new MetaGestureEventArgs(pointers[i])); } if (UseSendMessage && SendMessageTarget != null) { - for (var i = 0; i < length; i++) SendMessageTarget.SendMessage(POINTER_BEGAN_MESSAGE, pointers[i], SendMessageOptions.DontRequireReceiver); + for (var i = 0; i < length; i++) SendMessageTarget.SendMessage(POINTER_PRESSED_MESSAGE, pointers[i], SendMessageOptions.DontRequireReceiver); } } @@ -135,14 +135,14 @@ protected override void pointersReleased(IList pointers) if ((State == GestureState.Began || State == GestureState.Changed) && NumPointers == 0) setState(GestureState.Ended); var length = pointers.Count; - if (pointerEndedInvoker != null) + if (pointerReleasedInvoker != null) { for (var i = 0; i < length; i++) - pointerEndedInvoker.InvokeHandleExceptions(this, new MetaGestureEventArgs(pointers[i])); + pointerReleasedInvoker.InvokeHandleExceptions(this, new MetaGestureEventArgs(pointers[i])); } if (UseSendMessage && SendMessageTarget != null) { - for (var i = 0; i < length; i++) SendMessageTarget.SendMessage(POINTER_ENDED_MESSAGE, pointers[i], SendMessageOptions.DontRequireReceiver); + for (var i = 0; i < length; i++) SendMessageTarget.SendMessage(POINTER_RELEASED_MESSAGE, pointers[i], SendMessageOptions.DontRequireReceiver); } } From d4d649815ee3b2ef5ca28d588f401eeda059bbd5 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 5 Jul 2016 06:12:50 +0300 Subject: [PATCH 038/211] Fixed Cube example. --- .../Examples/Cube/Scripts/RedirectInput.cs | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs index 736313bea..8954bcaaa 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs @@ -16,18 +16,20 @@ public class RedirectInput : InputSource private MetaGesture gesture; private Dictionary map = new Dictionary(); - public override bool CancelPointer(Pointer pointer, bool @return) + public override bool CancelPointer(Pointer pointer, bool shouldReturn) { - base.CancelPointer(pointer, @return); + base.CancelPointer(pointer, shouldReturn); map.Remove(pointer.Id); - if (@return) + if (shouldReturn) { TouchHit hit; if (gesture.GetTargetHitResult(pointer.Position, out hit)) { var newPointer = PointerFactory.Create(pointer.Type, this); - beginPointer(newPointer, processCoords(hit.RaycastHit.textureCoord)); + newPointer.CopyFrom(pointer); + addPointer(newPointer, processCoords(pointer.Hit.RaycastHit.textureCoord)); + pressPointer(newPointer.Id); map.Add(pointer.Id, newPointer.Id); } } @@ -40,10 +42,10 @@ protected override void OnEnable() gesture = GetComponent(); if (gesture) { - gesture.PointerBegan += pointerBeganHandler; + gesture.PointerPressed += pointerPressedHandler; gesture.PointerMoved += pointerMovedhandler; gesture.PointerCancelled += pointerCancelledhandler; - gesture.PointerEnded += pointerEndedHandler; + gesture.PointerReleased += pointerReleasedHandler; } } @@ -53,10 +55,10 @@ protected override void OnDisable() if (gesture) { - gesture.PointerBegan -= pointerBeganHandler; + gesture.PointerPressed -= pointerPressedHandler; gesture.PointerMoved -= pointerMovedhandler; gesture.PointerCancelled -= pointerCancelledhandler; - gesture.PointerEnded -= pointerEndedHandler; + gesture.PointerReleased -= pointerReleasedHandler; } } @@ -65,13 +67,15 @@ private Vector2 processCoords(Vector2 value) return new Vector2(value.x * Width, value.y * Height); } - private void pointerBeganHandler(object sender, MetaGestureEventArgs metaGestureEventArgs) + private void pointerPressedHandler(object sender, MetaGestureEventArgs metaGestureEventArgs) { var pointer = metaGestureEventArgs.Pointer; if (pointer.InputSource == this) return; var newPointer = PointerFactory.Create(pointer.Type, this); - beginPointer(newPointer, processCoords(pointer.Hit.RaycastHit.textureCoord)); + newPointer.CopyFrom(pointer); + addPointer(newPointer, processCoords(pointer.Hit.RaycastHit.textureCoord)); + pressPointer(newPointer.Id); map.Add(pointer.Id, newPointer.Id); } @@ -87,14 +91,16 @@ private void pointerMovedhandler(object sender, MetaGestureEventArgs metaGesture movePointer(id, processCoords(hit.RaycastHit.textureCoord)); } - private void pointerEndedHandler(object sender, MetaGestureEventArgs metaGestureEventArgs) + private void pointerReleasedHandler(object sender, MetaGestureEventArgs metaGestureEventArgs) { int id; var pointer = metaGestureEventArgs.Pointer; if (pointer.InputSource == this) return; if (!map.TryGetValue(pointer.Id, out id)) return; - endPointer(id); + map.Remove(pointer.Id); + releasePointer(id); + removePointer(id); } private void pointerCancelledhandler(object sender, MetaGestureEventArgs metaGestureEventArgs) @@ -104,6 +110,7 @@ private void pointerCancelledhandler(object sender, MetaGestureEventArgs metaGes if (pointer.InputSource == this) return; if (!map.TryGetValue(pointer.Id, out id)) return; + map.Remove(pointer.Id); cancelPointer(id); } From 4f00af109101d71721b9ddb3da615b1e690d9bc7 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 5 Jul 2016 06:16:44 +0300 Subject: [PATCH 039/211] Updated touch input with new events. --- .../InputHandlers/TouchHandler.cs | 60 +++++++++++-------- .../Scripts/InputSources/StandardInput.cs | 17 +----- 2 files changed, 35 insertions(+), 42 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs index 6d25bb39c..0c61b106c 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs @@ -31,10 +31,12 @@ public bool HasPointers #region Private variables - private Action beginPointer; - private Action movePointer; - private Action endPointer; - private Action cancelPointer; + private AddPointerDelegate addPointer; + private MovePointerDelegate movePointer; + private PressPointerDelegate pressPointer; + private ReleasePointerDelegate releasePointer; + private RemovePointerDelegate removePointer; + private CancelPointerDelegate cancelPointer; private ObjectPool touchPool; private Dictionary systemToInternalId = new Dictionary(); @@ -45,18 +47,21 @@ public bool HasPointers /// /// Initializes a new instance of the class. /// - /// A function called when a new pointer is detected. As this function must accept a Vector2 position of the new pointer and return an instance of . + /// A function called when a new pointer is detected. As this function must accept a Vector2 position of the new pointer and return an instance of . /// A function called when a pointer is moved. As this function must accept an int id and a Vector2 position. - /// A function called when a pointer is lifted off. As this function must accept an int id. + /// A function called when a pointer is lifted off. As this function must accept an int id. /// A function called when a pointer is cancelled. As this function must accept an int id. - public TouchHandler(Action beginPointer, Action movePointer, Action endPointer, Action cancelPointer) + public TouchHandler(AddPointerDelegate addPointer, MovePointerDelegate movePointer, PressPointerDelegate pressPointer, ReleasePointerDelegate releasePointer, RemovePointerDelegate removePointer, CancelPointerDelegate cancelPointer) { - this.beginPointer = beginPointer; + this.addPointer = addPointer; this.movePointer = movePointer; - this.endPointer = endPointer; + this.pressPointer = pressPointer; + this.releasePointer = releasePointer; + this.removePointer = removePointer; this.cancelPointer = cancelPointer; touchPool = new ObjectPool(10, () => new TouchPointer(this), null, (t) => t.INTERNAL_Reset()); + touchPool.Name = "Touch"; } #region Public methods @@ -77,12 +82,12 @@ public void UpdateInput() if (systemToInternalId.TryGetValue(t.fingerId, out touchState) && touchState.Phase != TouchPhase.Canceled) { // Ending previous touch (missed a frame) - internalEndPointer(touchState.Id); - systemToInternalId[t.fingerId] = new TouchState(internalBeginPointer(t.position).Id); + internalRemovePointer(touchState.Id); + systemToInternalId[t.fingerId] = new TouchState(internalAddPointer(t.position, Pointer.FLAG_FIRST_BUTTON).Id); } else { - systemToInternalId.Add(t.fingerId, new TouchState(internalBeginPointer(t.position).Id)); + systemToInternalId.Add(t.fingerId, new TouchState(internalAddPointer(t.position, Pointer.FLAG_FIRST_BUTTON).Id)); } break; case TouchPhase.Moved: @@ -93,19 +98,19 @@ public void UpdateInput() else { // Missed began phase - systemToInternalId.Add(t.fingerId, new TouchState(internalBeginPointer(t.position).Id)); + systemToInternalId.Add(t.fingerId, new TouchState(internalAddPointer(t.position, Pointer.FLAG_FIRST_BUTTON).Id)); } break; case TouchPhase.Ended: if (systemToInternalId.TryGetValue(t.fingerId, out touchState)) { systemToInternalId.Remove(t.fingerId); - if (touchState.Phase != TouchPhase.Canceled) internalEndPointer(touchState.Id); + if (touchState.Phase != TouchPhase.Canceled) internalRemovePointer(touchState.Id); } else { // Missed one finger begin-end transition - internalEndPointer(internalBeginPointer(t.position).Id); + internalRemovePointer(internalAddPointer(t.position, Pointer.FLAG_FIRST_BUTTON).Id); } break; case TouchPhase.Canceled: @@ -117,7 +122,7 @@ public void UpdateInput() else { // Missed one finger begin-end transition - internalCancelPointer(internalBeginPointer(t.position).Id); + internalCancelPointer(internalAddPointer(t.position, Pointer.FLAG_FIRST_BUTTON).Id); } break; case TouchPhase.Stationary: @@ -125,7 +130,7 @@ public void UpdateInput() else { // Missed begin phase - systemToInternalId.Add(t.fingerId, new TouchState(internalBeginPointer(t.position).Id)); + systemToInternalId.Add(t.fingerId, new TouchState(internalAddPointer(t.position, Pointer.FLAG_FIRST_BUTTON).Id)); } break; } @@ -133,7 +138,7 @@ public void UpdateInput() } /// - public bool CancelPointer(Pointer pointer, bool @return) + public bool CancelPointer(Pointer pointer, bool shouldReturn) { var touch = pointer as TouchPointer; if (touch == null) return false; @@ -150,7 +155,7 @@ public bool CancelPointer(Pointer pointer, bool @return) if (fingerId > -1) { internalCancelPointer(touch.Id); - if (@return) systemToInternalId[fingerId] = new TouchState(internalReturnPointer(touch, touch.Position).Id); + if (shouldReturn) systemToInternalId[fingerId] = new TouchState(internalReturnPointer(touch, touch.Position).Id); else systemToInternalId[fingerId] = new TouchState(touch.Id, TouchPhase.Canceled); return true; } @@ -171,7 +176,7 @@ public void Dispose() #region Internal methods - public void INTERNAL_ReleasePointer(Pointer pointer) + public void INTERNAL_DiscardPointer(Pointer pointer) { var p = pointer as TouchPointer; if (p == null) return; @@ -183,12 +188,13 @@ public void INTERNAL_ReleasePointer(Pointer pointer) #region Private functions - private Pointer internalBeginPointer(Vector2 position) + private Pointer internalAddPointer(Vector2 position, uint flags = 0) { pointersNum++; var pointer = touchPool.Get(); - beginPointer(pointer, position, true); - pointer.Flags |= Pointer.FLAG_FIRST_BUTTON; + addPointer(pointer, position, true); + pressPointer(pointer.Id); + pointer.Flags |= flags; return pointer; } @@ -197,14 +203,16 @@ private TouchPointer internalReturnPointer(TouchPointer pointer, Vector2 positio pointersNum++; var newPointer = touchPool.Get(); newPointer.CopyFrom(pointer); - beginPointer(newPointer, position, false); + addPointer(newPointer, position, false); + pressPointer(newPointer.Id); return newPointer; } - private void internalEndPointer(int id) + private void internalRemovePointer(int id) { pointersNum--; - endPointer(id); + releasePointer(id); + removePointer(id); } private void internalCancelPointer(int id) diff --git a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs index eb8809191..5b30de720 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs @@ -342,7 +342,7 @@ private void disableMouse() private void enableTouch() { - //touchHandler = new TouchHandler(pressPointer, movePointer, releasePointer, cancelPointer); + touchHandler = new TouchHandler(addPointer, movePointer, pressPointer, releasePointer, removePointer, cancelPointer); Debug.Log("[TouchScript] Initialized Unity touch input."); } @@ -356,21 +356,6 @@ private void disableTouch() } #if UNITY_STANDALONE_WIN && !UNITY_EDITOR - private void enableWindows8Mouse() - { - windows8MouseHandler = new Windows8MouseHandler(); - Debug.Log("[TouchScript] Initialized Windows 8 mouse input."); - } - - private void disableWindows8Mouse() - { - if (windows8MouseHandler != null) - { - windows8MouseHandler.Dispose(); - windows8MouseHandler = null; - } - } - private void enableWindows7Touch() { windows7PointerHandler = new Windows7PointerHandler(pressPointer, movePointer, releasePointer, cancelPointer); From ef72f16222dbb26c89932d0ff6fe85a00606d092 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 5 Jul 2016 06:21:13 +0300 Subject: [PATCH 040/211] Updating Windows handlers. --- .../InputHandlers/WindowsPointerHandlers.cs | 190 +++++++++++------- 1 file changed, 118 insertions(+), 72 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs index 3474e4341..4d2ba7322 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs @@ -20,41 +20,77 @@ namespace TouchScript.InputSources.InputHandlers /// public class Windows8PointerHandler : WindowsPointerHandler { + #region Public properties + public bool MouseInPointer + { + get { return mouseInPointer; } + set + { + EnableMouseInPointer(value); + mouseInPointer = value; + if (mouseInPointer) + { + if (mousePointer == null) mousePointer = internalAddMousePointer(Vector3.zero); + } + else + { + if (mousePointer != null) + { + if ((mousePointer.Flags & Pointer.FLAG_INCONTACT) != 0) releasePointer(mousePointer.Id); + removePointer(mousePointer.Id); + } + } + } + } + + #endregion + + #region Private variables + + private bool mouseInPointer = true; private ObjectPool mousePool; private ObjectPool penPool; private MousePointer mousePointer; private PenPointer penPointer; + #endregion + + #region Constructor + /// - public Windows8PointerHandler(Action beginPointer, Action movePointer, Action endPointer, Action cancelPointer) : base(beginPointer, movePointer, endPointer, cancelPointer) + public Windows8PointerHandler(AddPointerDelegate addPointer, MovePointerDelegate movePointer, PressPointerDelegate pressPointer, ReleasePointerDelegate releasePointer, RemovePointerDelegate removePointer, CancelPointerDelegate cancelPointer) : base(addPointer, movePointer, 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()); + mousePointer = internalAddMousePointer(Vector3.zero); + registerWindowProc(wndProcWin8); } + #endregion + #region Public methods /// - public override bool CancelPointer(Pointer pointer, bool @return) + public override bool CancelPointer(Pointer pointer, bool shouldReturn) { if (pointer.Equals(mousePointer)) { cancelPointer(mousePointer.Id); - if (@return) mousePointer = internalReturnMousePointer(mousePointer, pointer.Position); - else mousePointer = null; + if (shouldReturn) mousePointer = internalReturnMousePointer(mousePointer, pointer.Position); + else mousePointer = internalAddMousePointer(pointer.Position); // can't totally cancell mouse pointer return true; } if (pointer.Equals(penPointer)) { cancelPointer(penPointer.Id); - if (@return) penPointer = internalReturnPenPointer(penPointer, pointer.Position); - else penPointer = null; + if (shouldReturn) penPointer = internalReturnPenPointer(penPointer, pointer.Position); + else penPointer = internalAddPenPointer(pointer.Position); // can't totally cancell mouse pointer return true; } - return base.CancelPointer(pointer, @return); + return base.CancelPointer(pointer, shouldReturn); } /// @@ -71,6 +107,8 @@ public override void Dispose() penPointer = null; } + EnableMouseInPointer(false); + base.Dispose(); } @@ -78,11 +116,11 @@ public override void Dispose() #region Internal methods - public override void INTERNAL_ReleasePointer(Pointer pointer) + public override void INTERNAL_DiscardPointer(Pointer pointer) { if (pointer is MousePointer) mousePool.Release(pointer as MousePointer); else if (pointer is PenPointer) penPool.Release(pointer as PenPointer); - else base.INTERNAL_ReleasePointer(pointer); + else base.INTERNAL_DiscardPointer(pointer); } #endregion @@ -132,16 +170,19 @@ private void decodeWin8Touches(uint msg, IntPtr wParam, IntPtr lParam) { if ((pointerInfo.pointerFlags & POINTER_FLAG_CANCELLED) == POINTER_FLAG_CANCELLED) break; var position = new Vector2((p.X - offsetX) * scaleX, Screen.height - (p.Y - offsetY) * scaleY); + var buttonFlags = (pointerInfo.pointerFlags << 3) & Pointer.FLAG_INCONTACT; switch (pointerInfo.pointerType) { case POINTER_INPUT_TYPE.PT_MOUSE: - internalBeginMousePointer(position); + pressPointer(mousePointer.Id); + mousePointer.Flags = (mousePointer.Flags & ~Pointer.FLAG_INCONTACT) | buttonFlags; break; case POINTER_INPUT_TYPE.PT_TOUCH: - winTouchToInternalId.Add(pointerId, internalBeginTouchPointer(position).Id); + winTouchToInternalId.Add(pointerId, internalAddTouchPointer(position, buttonFlags).Id); break; case POINTER_INPUT_TYPE.PT_PEN: - internalBeginPenPointer(position); + pressPointer(penPointer.Id); + penPointer.Flags = (penPointer.Flags & ~Pointer.FLAG_INCONTACT) | buttonFlags; break; } } @@ -149,33 +190,45 @@ private void decodeWin8Touches(uint msg, IntPtr wParam, IntPtr lParam) case WM_POINTERUP: { - var id = Pointer.INVALID_POINTER; switch (pointerInfo.pointerType) { case POINTER_INPUT_TYPE.PT_MOUSE: - id = mousePointer.Id; + var id = mousePointer.Id; + if ((pointerInfo.pointerFlags & POINTER_FLAG_CANCELLED) == POINTER_FLAG_CANCELLED) + { + cancelPointer(id); + mousePointer = null; + } + else releasePointer(id); break; case POINTER_INPUT_TYPE.PT_TOUCH: if (winTouchToInternalId.TryGetValue(pointerId, out existingId)) { winTouchToInternalId.Remove(pointerId); - id = existingId; + if ((pointerInfo.pointerFlags & POINTER_FLAG_CANCELLED) == POINTER_FLAG_CANCELLED) cancelPointer(existingId); + else + { + releasePointer(existingId); + removePointer(existingId); + } } break; case POINTER_INPUT_TYPE.PT_PEN: id = penPointer.Id; + if ((pointerInfo.pointerFlags & POINTER_FLAG_CANCELLED) == POINTER_FLAG_CANCELLED) + { + cancelPointer(id); + penPointer = null; + } + else releasePointer(id); break; } - if (id != Pointer.INVALID_POINTER) - { - if ((pointerInfo.pointerFlags & POINTER_FLAG_CANCELLED) == POINTER_FLAG_CANCELLED) cancelPointer(id); - else endPointer(id); - } } break; case WM_POINTERUPDATE: { var id = Pointer.INVALID_POINTER; + var position = new Vector2((p.X - offsetX) * scaleX, Screen.height - (p.Y - offsetY) * scaleY); switch (pointerInfo.pointerType) { case POINTER_INPUT_TYPE.PT_MOUSE: @@ -185,6 +238,7 @@ private void decodeWin8Touches(uint msg, IntPtr wParam, IntPtr lParam) if (winTouchToInternalId.TryGetValue(pointerId, out existingId)) id = existingId; break; case POINTER_INPUT_TYPE.PT_PEN: + if (penPointer == null) internalAddPenPointer(position); id = penPointer.Id; break; } @@ -197,7 +251,7 @@ private void decodeWin8Touches(uint msg, IntPtr wParam, IntPtr lParam) } else { - movePointer(id, new Vector2((p.X - offsetX) * scaleX, Screen.height - (p.Y - offsetY) * scaleY)); + movePointer(id, position); } } } @@ -205,34 +259,39 @@ private void decodeWin8Touches(uint msg, IntPtr wParam, IntPtr lParam) } } - private void internalBeginMousePointer(Vector2 position) + private MousePointer internalAddMousePointer(Vector2 position, uint flags = 0) { - beginPointer(mousePointer, position, true); - mousePointer.Flags |= Pointer.FLAG_FIRST_BUTTON; + var pointer = mousePool.Get(); + addPointer(pointer, position); + pointer.Flags |= flags; + return pointer; } private MousePointer internalReturnMousePointer(MousePointer pointer, Vector2 position) { var newPointer = mousePool.Get(); newPointer.CopyFrom(pointer); - beginPointer(newPointer, position, false); + addPointer(newPointer, position, false); + if ((newPointer.Flags & Pointer.FLAG_INCONTACT) != 0) pressPointer(newPointer.Id); return newPointer; } - private void internalBeginPenPointer(Vector2 position) + private PenPointer internalAddPenPointer(Vector2 position, uint flags = 0) { - beginPointer(penPointer, position, true); - penPointer.Flags |= Pointer.FLAG_FIRST_BUTTON; + var pointer = penPool.Get(); + addPointer(pointer, position); + pointer.Flags |= flags; + return pointer; } private PenPointer internalReturnPenPointer(PenPointer pointer, Vector2 position) { var newPointer = penPool.Get(); newPointer.CopyFrom(pointer); - beginPointer(newPointer, position, false); + addPointer(newPointer, position, false); + if ((newPointer.Flags & Pointer.FLAG_INCONTACT) != 0) pressPointer(newPointer.Id); return newPointer; } - } public class Windows7PointerHandler : WindowsPointerHandler @@ -240,7 +299,7 @@ public class Windows7PointerHandler : WindowsPointerHandler private int touchInputSize; /// - public Windows7PointerHandler(Action beginPointer, Action movePointer, Action endPointer, Action cancelPointer) : base(beginPointer, movePointer, endPointer, cancelPointer) + public Windows7PointerHandler(AddPointerDelegate addPointer, MovePointerDelegate movePointer, PressPointerDelegate pressPointer, ReleasePointerDelegate releasePointer, RemovePointerDelegate removePointer, CancelPointerDelegate cancelPointer) : base(addPointer, movePointer, pressPointer, releasePointer, removePointer, cancelPointer) { touchInputSize = Marshal.SizeOf(typeof (TOUCHINPUT)); RegisterTouchWindow(hMainWindow, 0); @@ -294,7 +353,7 @@ private void decodeWin7Touches(IntPtr wParam, IntPtr lParam) p.Y = touch.y / 100; ScreenToClient(hMainWindow, ref p); - winTouchToInternalId.Add(touch.dwID, internalBeginTouchPointer(new Vector2((p.X - offsetX) * scaleX, Screen.height - (p.Y - offsetY) * scaleY)).Id); + winTouchToInternalId.Add(touch.dwID, internalAddTouchPointer(new Vector2((p.X - offsetX) * scaleX, Screen.height - (p.Y - offsetY) * scaleY), Pointer.FLAG_FIRST_BUTTON).Id); } else if ((touch.dwFlags & (int) TOUCH_EVENT.TOUCHEVENTF_UP) != 0) { @@ -302,7 +361,8 @@ private void decodeWin7Touches(IntPtr wParam, IntPtr lParam) if (winTouchToInternalId.TryGetValue(touch.dwID, out existingId)) { winTouchToInternalId.Remove(touch.dwID); - endPointer(existingId); + releasePointer(existingId); + removePointer(existingId); } } else if ((touch.dwFlags & (int) TOUCH_EVENT.TOUCHEVENTF_MOVE) != 0) @@ -350,10 +410,12 @@ public enum PointerSource #region Protected variables - protected Action beginPointer; - protected Action movePointer; - protected Action endPointer; - protected Action cancelPointer; + protected AddPointerDelegate addPointer; + protected MovePointerDelegate movePointer; + protected PressPointerDelegate pressPointer; + protected ReleasePointerDelegate releasePointer; + protected RemovePointerDelegate removePointer; + protected CancelPointerDelegate cancelPointer; protected IntPtr hMainWindow; protected IntPtr oldWndProcPtr; @@ -373,15 +435,17 @@ public enum PointerSource /// /// Initializes a new instance of the class. /// - /// A function called when a new pointer is detected. As this function must accept a Vector2 position of the new pointer and return an instance of . + /// A function called when a new pointer is detected. As this function must accept a Vector2 position of the new pointer and return an instance of . /// A function called when a pointer is moved. As this function must accept an int id and a Vector2 position. - /// A function called when a pointer is lifted off. As this function must accept an int id. + /// A function called when a pointer is lifted off. As this function must accept an int id. /// A function called when a pointer is cancelled. As this function must accept an int id. - public WindowsPointerHandler(Action beginPointer, Action movePointer, Action endPointer, Action cancelPointer) + public WindowsPointerHandler(AddPointerDelegate addPointer, MovePointerDelegate movePointer, PressPointerDelegate pressPointer, ReleasePointerDelegate releasePointer, RemovePointerDelegate removePointer, CancelPointerDelegate cancelPointer) { - this.beginPointer = beginPointer; + this.addPointer = addPointer; this.movePointer = movePointer; - this.endPointer = endPointer; + this.pressPointer = pressPointer; + this.releasePointer = releasePointer; + this.removePointer = removePointer; this.cancelPointer = cancelPointer; touchPool = new ObjectPool(10, () => new TouchPointer(this), null, (t) => t.INTERNAL_Reset()); @@ -399,7 +463,7 @@ public WindowsPointerHandler(Action beginPointer, Action public void UpdateInput() {} /// - public virtual bool CancelPointer(Pointer pointer, bool @return) + public virtual bool CancelPointer(Pointer pointer, bool shouldReturn) { var touch = pointer as TouchPointer; if (touch == null) return false; @@ -416,7 +480,7 @@ public virtual bool CancelPointer(Pointer pointer, bool @return) if (internalTouchId > -1) { cancelPointer(touch.Id); - if (@return) winTouchToInternalId[internalTouchId] = internalReturnTouchPointer(touch, touch.Position).Id; + if (shouldReturn) winTouchToInternalId[internalTouchId] = internalReturnTouchPointer(touch, touch.Position).Id; return true; } return false; @@ -435,7 +499,7 @@ public virtual void Dispose() #region Internal methods - public virtual void INTERNAL_ReleasePointer(Pointer pointer) + public virtual void INTERNAL_DiscardPointer(Pointer pointer) { var p = pointer as TouchPointer; if (p == null) return; @@ -447,11 +511,12 @@ public virtual void INTERNAL_ReleasePointer(Pointer pointer) #region Protected methods - protected Pointer internalBeginTouchPointer(Vector2 position) + protected Pointer internalAddTouchPointer(Vector2 position, uint flags = 0) { var pointer = touchPool.Get(); - beginPointer(pointer, position, true); - pointer.Flags |= Pointer.FLAG_FIRST_BUTTON; + addPointer(pointer, position, true); + pressPointer(pointer.Id); + pointer.Flags |= flags; return pointer; } @@ -459,7 +524,8 @@ private TouchPointer internalReturnTouchPointer(TouchPointer pointer, Vector2 po { var newPointer = touchPool.Get(); newPointer.CopyFrom(pointer); - beginPointer(newPointer, position, false); + addPointer(newPointer, position, false); + pressPointer(newPointer.Id); return newPointer; } @@ -760,30 +826,10 @@ public static extern bool GetTouchInputInfo(IntPtr hTouchInput, int cInputs, [Ou [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam); - #endregion - } - - /// - /// A class which turns on mouse to WM_POINTER events redirection on Windows 8. - /// - public class Windows8MouseHandler : IDisposable - { - /// - /// Initializes a new instance of the class. - /// - public Windows8MouseHandler() - { - EnableMouseInPointer(true); - } - - /// - public void Dispose() - { - EnableMouseInPointer(false); - } - [DllImport("user32.dll")] - private static extern IntPtr EnableMouseInPointer(bool value); + public static extern IntPtr EnableMouseInPointer(bool value); + + #endregion } } From 66ae59c0920881ac69138084d021ffc4b8703a27 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 5 Jul 2016 07:48:52 +0300 Subject: [PATCH 041/211] Changed quality settings to lowest to get max fps. --- Source/ProjectSettings/ProjectSettings.asset | 2 +- Source/ProjectSettings/QualitySettings.asset | 37 ++++++++++++++++++-- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/Source/ProjectSettings/ProjectSettings.asset b/Source/ProjectSettings/ProjectSettings.asset index a1c719b32..592e3872c 100644 --- a/Source/ProjectSettings/ProjectSettings.asset +++ b/Source/ProjectSettings/ProjectSettings.asset @@ -323,7 +323,7 @@ PlayerSettings: psmSplashimage: {fileID: 0} spritePackerPolicy: scriptingDefineSymbols: - 1: TOUCHSCRIPT_DEBUG + 1: 4: metroPackageName: General Examples metroPackageLogo: diff --git a/Source/ProjectSettings/QualitySettings.asset b/Source/ProjectSettings/QualitySettings.asset index d814d61d4..82ccc2b31 100644 --- a/Source/ProjectSettings/QualitySettings.asset +++ b/Source/ProjectSettings/QualitySettings.asset @@ -4,7 +4,7 @@ QualitySettings: m_ObjectHideFlags: 0 serializedVersion: 5 - m_CurrentQuality: 5 + m_CurrentQuality: 0 m_QualitySettings: - serializedVersion: 2 name: Fastest @@ -14,12 +14,17 @@ QualitySettings: shadowProjection: 1 shadowCascades: 1 shadowDistance: 15 + shadowNearPlaneOffset: 2 + shadowCascade2Split: .333333343 + shadowCascade4Split: {x: .0666666701, y: .200000003, z: .466666669} blendWeights: 1 textureQuality: 1 anisotropicTextures: 0 antiAliasing: 0 softParticles: 0 softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 vSyncCount: 0 lodBias: .300000012 maximumLODLevel: 0 @@ -33,12 +38,17 @@ QualitySettings: shadowProjection: 1 shadowCascades: 1 shadowDistance: 20 + shadowNearPlaneOffset: 2 + shadowCascade2Split: .333333343 + shadowCascade4Split: {x: .0666666701, y: .200000003, z: .466666669} blendWeights: 2 textureQuality: 0 anisotropicTextures: 0 antiAliasing: 0 softParticles: 0 softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 vSyncCount: 0 lodBias: .400000006 maximumLODLevel: 0 @@ -52,12 +62,17 @@ QualitySettings: shadowProjection: 1 shadowCascades: 1 shadowDistance: 20 + shadowNearPlaneOffset: 2 + shadowCascade2Split: .333333343 + shadowCascade4Split: {x: .0666666701, y: .200000003, z: .466666669} blendWeights: 2 textureQuality: 0 anisotropicTextures: 1 antiAliasing: 0 softParticles: 0 softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 vSyncCount: 0 lodBias: .699999988 maximumLODLevel: 0 @@ -71,12 +86,17 @@ QualitySettings: shadowProjection: 1 shadowCascades: 2 shadowDistance: 40 + shadowNearPlaneOffset: 2 + shadowCascade2Split: .333333343 + shadowCascade4Split: {x: .0666666701, y: .200000003, z: .466666669} blendWeights: 2 textureQuality: 0 anisotropicTextures: 1 antiAliasing: 0 softParticles: 0 softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 vSyncCount: 1 lodBias: 1 maximumLODLevel: 0 @@ -90,12 +110,17 @@ QualitySettings: shadowProjection: 1 shadowCascades: 2 shadowDistance: 70 + shadowNearPlaneOffset: 2 + shadowCascade2Split: .333333343 + shadowCascade4Split: {x: .0666666701, y: .200000003, z: .466666669} blendWeights: 4 textureQuality: 0 anisotropicTextures: 2 antiAliasing: 2 softParticles: 1 softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 vSyncCount: 1 lodBias: 1.5 maximumLODLevel: 0 @@ -109,12 +134,17 @@ QualitySettings: shadowProjection: 1 shadowCascades: 4 shadowDistance: 40 + shadowNearPlaneOffset: 2 + shadowCascade2Split: .333333343 + shadowCascade4Split: {x: .0666666701, y: .199999988, z: .466666639} blendWeights: 4 textureQuality: 0 anisotropicTextures: 2 antiAliasing: 8 softParticles: 1 softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 vSyncCount: 0 lodBias: 2 maximumLODLevel: 0 @@ -123,8 +153,11 @@ QualitySettings: m_PerPlatformDefaultQuality: Android: 5 BlackBerry: 5 - Standalone: 5 + Samsung TV: 0 + Standalone: 0 + Tizen: 0 WP8: 5 Web: 5 + WebGL: 0 Windows Store Apps: 5 iPhone: 5 From 59c643e2b5a0998f8aa1b0ef4f38a4654a06beee Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 5 Jul 2016 08:10:12 +0300 Subject: [PATCH 042/211] Pointer visualizers are now refreshed when point flags change. --- .../Behaviors/Visualizer/PointerProxy.cs | 21 ++++++++++++++++--- .../Behaviors/Visualizer/PointerVisualizer.cs | 8 +++---- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs index 8c0ccf2a5..5511818cd 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs @@ -67,7 +67,7 @@ public class PointerProxyBase : MonoBehaviour /// Gets or sets cursor size. /// /// Cursor size in pixels. - public int Size + public uint Size { get { return size; } set @@ -101,7 +101,9 @@ public int Size /// /// Cursor size. /// - protected int size = 1; + protected uint size = 1; + + protected uint hash = uint.MaxValue; #endregion @@ -114,10 +116,11 @@ public int Size /// Pointer this cursor represents. public void Init(RectTransform parent, Pointer pointer) { + hash = uint.MaxValue; + show(); rect.SetParent(parent); rect.SetAsLastSibling(); - updateOnce(pointer); update(pointer); } @@ -188,6 +191,18 @@ protected virtual void updateOnce(Pointer 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 + + private uint getPointerHash(Pointer pointer) + { + return pointer.Flags; } #endregion diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs index a0586ec83..c22853fb3 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs @@ -94,7 +94,7 @@ public float PointerSize [SerializeField] private float pointerSize = 1f; - private int defaultSize = 64; + private uint defaultSize = 64; private RectTransform rect; private ObjectPool pool; private Dictionary proxies = new Dictionary(10); @@ -151,9 +151,9 @@ private void clearProxy(PointerProxyBase proxy) proxy.Hide(); } - private int getPointerSize() + private uint getPointerSize() { - if (useDPI) return (int) (pointerSize * TouchManager.Instance.DotsPerCentimeter); + if (useDPI) return (uint) (pointerSize * TouchManager.Instance.DotsPerCentimeter); return defaultSize; } @@ -162,7 +162,7 @@ private void updateDefaultSize() if (pointerProxy != null) { var rt = pointerProxy.GetComponent(); - if (rt) defaultSize = (int) rt.sizeDelta.x; + if (rt) defaultSize = (uint) rt.sizeDelta.x; } } From dacc02b5bb712a37cd7bc4d502424b6320258d80 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 5 Jul 2016 08:10:56 +0300 Subject: [PATCH 043/211] Fixed Windows input handler issues. --- .../InputHandlers/WindowsPointerHandlers.cs | 2 +- .../TouchScript/Scripts/InputSources/StandardInput.cs | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs index 4d2ba7322..3d7f63c9b 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs @@ -170,7 +170,7 @@ private void decodeWin8Touches(uint msg, IntPtr wParam, IntPtr lParam) { if ((pointerInfo.pointerFlags & POINTER_FLAG_CANCELLED) == POINTER_FLAG_CANCELLED) break; var position = new Vector2((p.X - offsetX) * scaleX, Screen.height - (p.Y - offsetY) * scaleY); - var buttonFlags = (pointerInfo.pointerFlags << 3) & Pointer.FLAG_INCONTACT; + var buttonFlags = (pointerInfo.pointerFlags >> 3) & Pointer.FLAG_INCONTACT; switch (pointerInfo.pointerType) { case POINTER_INPUT_TYPE.PT_MOUSE: diff --git a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs index 5b30de720..357dcdf4a 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs @@ -184,7 +184,6 @@ public bool EmulateSecondMousePointer private MouseHandler mouseHandler; private TouchHandler touchHandler; #if UNITY_STANDALONE_WIN && !UNITY_EDITOR - private Windows8MouseHandler windows8MouseHandler; private Windows8PointerHandler windows8PointerHandler; private Windows7PointerHandler windows7PointerHandler; #endif @@ -245,7 +244,6 @@ protected override void OnEnable() { case Windows8APIType.Windows8: enableWindows8Touch(); - if (Windows8Mouse) enableWindows8Mouse(); break; case Windows8APIType.Windows7: enableWindows7Touch(); @@ -312,7 +310,6 @@ protected override void OnDisable() disableMouse(); disableTouch(); #if UNITY_STANDALONE_WIN && !UNITY_EDITOR - disableWindows8Mouse(); disableWindows7Touch(); disableWindows8Touch(); #endif @@ -358,7 +355,7 @@ private void disableTouch() #if UNITY_STANDALONE_WIN && !UNITY_EDITOR private void enableWindows7Touch() { - windows7PointerHandler = new Windows7PointerHandler(pressPointer, movePointer, releasePointer, cancelPointer); + windows7PointerHandler = new Windows7PointerHandler(addPointer, movePointer, pressPointer, releasePointer, removePointer, cancelPointer); Debug.Log("[TouchScript] Initialized Windows 7 pointer input."); } @@ -373,7 +370,8 @@ private void disableWindows7Touch() private void enableWindows8Touch() { - windows8PointerHandler = new Windows8PointerHandler(pressPointer, movePointer, releasePointer, cancelPointer); + windows8PointerHandler = new Windows8PointerHandler(addPointer, movePointer, pressPointer, releasePointer, removePointer, cancelPointer); + windows8PointerHandler.MouseInPointer = windows8Mouse; Debug.Log("[TouchScript] Initialized Windows 8 pointer input."); } @@ -387,6 +385,6 @@ private void disableWindows8Touch() } #endif -#endregion + #endregion } } \ No newline at end of file From 6fdc1937901b18b29426306c1d7b61d572d9c36c Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 5 Jul 2016 09:07:58 +0300 Subject: [PATCH 044/211] Fixed debug elements for Transform* gestures not clearing if gesture hasn't started. --- .../Gestures/Base/TransformGestureBase.cs | 4 ---- .../Scripts/Gestures/PinnedTransformGesture.cs | 6 +++--- .../Scripts/Gestures/ScreenTransformGesture.cs | 18 ++++++++++++++++++ .../Scripts/Gestures/TransformGesture.cs | 12 ++++++++++++ 4 files changed, 33 insertions(+), 7 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs index 7b1be94e3..6260737ea 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs @@ -443,10 +443,6 @@ protected override void pointersReleased(IList pointers) break; } } - -#if TOUCHSCRIPT_DEBUG - else drawDebugDelayed(getNumPoints()); -#endif } /// diff --git a/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs index 385f3916b..c68c3a824 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs @@ -258,13 +258,13 @@ protected override void pointersMoved(IList pointers) } #if TOUCHSCRIPT_DEBUG - /// + /// protected override void pointersReleased(IList pointers) { base.pointersReleased(pointers); - if (NumPointers == 0) return; - drawDebug(activePointers[0].ProjectionParams.ProjectFrom(cachedTransform.position), activePointers[0].Position); + if (NumPointers == 0) clearDebug(); + else drawDebug(activePointers[0].ProjectionParams.ProjectFrom(cachedTransform.position), activePointers[0].Position); } #endif diff --git a/Source/Assets/TouchScript/Scripts/Gestures/ScreenTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/ScreenTransformGesture.cs index 22e88023a..43692d8a0 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/ScreenTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/ScreenTransformGesture.cs @@ -2,8 +2,10 @@ * @author Valentin Simonov / http://va.lent.in/ */ +using System.Collections.Generic; using TouchScript.Gestures.Base; using TouchScript.Layers; +using TouchScript.Pointers; using TouchScript.Utils.Geom; using UnityEngine; @@ -29,6 +31,22 @@ public void ApplyTransform(Transform target) #endregion + #region Gesture callbacks + +#if TOUCHSCRIPT_DEBUG + + /// + protected override void pointersReleased(IList pointers) + { + base.pointersReleased(pointers); + + if (getNumPoints() == 0) clearDebug(); + else drawDebugDelayed(getNumPoints()); + } +#endif + + #endregion + #region Protected methods /// diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs index 9e88a1b91..9209cbe10 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs @@ -170,6 +170,18 @@ protected override void pointersPressed(IList pointers) } } +#if TOUCHSCRIPT_DEBUG + + /// + protected override void pointersReleased(IList pointers) + { + base.pointersReleased(pointers); + + if (getNumPoints() == 0) clearDebug(); + else drawDebugDelayed(getNumPoints()); + } +#endif + #endregion #region Protected methods From 49151857609d34d403c98cc42043eed73fa300ef Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 5 Jul 2016 10:00:08 +0300 Subject: [PATCH 045/211] Renamed ActivePointers to Pointers, NumberOfPointers to PointersCount. Added PressedPointers and PressedPointersCount since (Active)Pointers now contain hovering pointers and need to be differentiated from pressed pointers. --- .../TouchScript/Scripts/ITouchManager.cs | 8 ++++-- .../Scripts/TouchManagerInstance.cs | 25 ++++++++++++++++--- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/ITouchManager.cs b/Source/Assets/TouchScript/Scripts/ITouchManager.cs index 54392ea19..4a636179b 100644 --- a/Source/Assets/TouchScript/Scripts/ITouchManager.cs +++ b/Source/Assets/TouchScript/Scripts/ITouchManager.cs @@ -127,13 +127,17 @@ public interface ITouchManager /// /// Gets number of active pointers. /// - int NumberOfPointers { get; } + int PointersCount { get; } + + int PressedPointersCount { get; } /// /// Gets the list of active pointers. /// /// An unsorted list of all pointers which began but have not ended yet. - IList ActivePointers { get; } + IList Pointers { get; } + + IList PressedPointers { get; } /// /// Adds a layer in a specific position. diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs index a44d2c54a..6b282c4dd 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs @@ -178,17 +178,29 @@ public float DotsPerCentimeter } /// - public int NumberOfPointers + public int PointersCount { get { return pointers.Count; } } /// - public IList ActivePointers + public IList Pointers { get { return new List(pointers); } } + /// + public int PressedPointersCount + { + get { return pressedPointers.Count; } + } + + /// + public IList PressedPointers + { + get { return new List(pressedPointers); } + } + #endregion #region Private variables @@ -200,7 +212,7 @@ public IList ActivePointers 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; @@ -208,6 +220,7 @@ public IList ActivePointers private int inputCount = 0; private List pointers = new List(30); + private HashSet pressedPointers = new HashSet(); private Dictionary idToPointer = new Dictionary(30); // Upcoming changes @@ -578,7 +591,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 @@ -705,6 +718,7 @@ private void updatePressed(List pointers) continue; } list.Add(pointer); + pressedPointers.Add(pointer); for (var j = 0; j < layerCount; j++) { var touchLayer = layers[j]; @@ -738,6 +752,7 @@ private void updateReleased(List pointers) continue; } list.Add(pointer); + pressedPointers.Remove(pointer); if (pointer.Layer != null) pointer.Layer.INTERNAL_ReleasePointer(pointer); pointer.Layer = null; @@ -768,6 +783,7 @@ private void updateRemoved(List pointers) } idToPointer.Remove(id); this.pointers.Remove(pointer); + pressedPointers.Remove(pointer); list.Add(pointer); #if TOUCHSCRIPT_DEBUG @@ -804,6 +820,7 @@ private void updateCancelled(List pointers) } idToPointer.Remove(id); this.pointers.Remove(pointer); + pressedPointers.Remove(pointer); list.Add(pointer); if (pointer.Layer != null) pointer.Layer.INTERNAL_CancelPointer(pointer); From 6ac010a8cb02142cabac960bdc7e92295bf5ecfd Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 10 Jul 2016 18:46:58 +0300 Subject: [PATCH 046/211] - Renamed *moved* events to *updated*. - Removed IRemapableInputSource, added CoordinatesRemapper property back to IInputSource. - Changed all *PointerDelegate just to PointerDelegate: addPointer, updatePointer and others now accept just a Pointer. This means that all input sources must update relevant touch parameters themselves before calling updatePointer. - releasePointer now clears Pointer.IN_CONTACT flags of the pointer. - MouseHandler, TouchHandler, Win*TouchHandler now have CoordinatesRemapper property and do remapping themselves via the remapper passed from StandardInput. - MouseHandler sends Update if another mouse button is pressed in addition to a pressed pointer. - All pointers now are being reset even if no points were updated. --- .../TouchScript/Examples/Cube/Cube.unity | 4 +- .../Examples/Cube/Scripts/RedirectInput.cs | 45 +++-- .../TUIO/Scripts/InputSources/TuioInput.cs | 58 +++--- .../Prefabs/Pointer Visualizer.prefab | 2 +- .../Behaviors/TouchScriptInputModule.cs | 6 +- .../Behaviors/Visualizer/PointerVisualizer.cs | 6 +- .../Scripts/GestureManagerInstance.cs | 16 +- .../Gestures/Base/TransformGestureBase.cs | 4 +- .../ClusteredScreenTransformGesture.cs | 4 +- .../Clustered/ClusteredTransformGesture.cs | 4 +- .../Scripts/Gestures/FlickGesture.cs | 4 +- .../TouchScript/Scripts/Gestures/Gesture.cs | 6 +- .../Scripts/Gestures/LongPressGesture.cs | 4 +- .../Scripts/Gestures/MetaGesture.cs | 16 +- .../Gestures/PinnedTransformGesture.cs | 4 +- .../Scripts/Gestures/TapGesture.cs | 4 +- .../Scripts/Gestures/UI/UIGesture.cs | 4 +- .../TouchScript/Scripts/ITouchManager.cs | 4 +- .../Scripts/InputSources/IInputSource.cs | 16 +- .../InputHandlers/MouseHandler.cs | 70 ++++--- .../InputHandlers/TouchHandler.cs | 90 +++++---- .../InputHandlers/WindowsPointerHandlers.cs | 185 ++++++++++-------- .../Scripts/InputSources/InputSource.cs | 63 +++--- .../Scripts/InputSources/StandardInput.cs | 26 ++- .../Scripts/Pointers/MousePointer.cs | 9 + .../Scripts/Pointers/ObjectPointer.cs | 13 ++ .../Scripts/Pointers/PenPointer.cs | 9 + .../TouchScript/Scripts/Pointers/Pointer.cs | 49 +++-- .../Scripts/Pointers/TouchPointer.cs | 9 + .../TouchScript/Scripts/TouchManager.cs | 16 +- .../Scripts/TouchManagerInstance.cs | 46 +++-- 31 files changed, 467 insertions(+), 329 deletions(-) diff --git a/Source/Assets/TouchScript/Examples/Cube/Cube.unity b/Source/Assets/TouchScript/Examples/Cube/Cube.unity index 2f7cbe01e..e08d43dd5 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Cube.unity +++ b/Source/Assets/TouchScript/Examples/Cube/Cube.unity @@ -670,7 +670,7 @@ GameObject: - 114: {fileID: 963048129} - 114: {fileID: 963048128} m_Layer: 0 - m_Name: Cube + m_Name: Image m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -753,7 +753,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1270,7 +1269,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 3fd90a8856e1a49eba25728d5aaac9f2, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs index 8954bcaaa..0c7a907fe 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs @@ -14,7 +14,7 @@ public class RedirectInput : InputSource public int Height = 512; private MetaGesture gesture; - private Dictionary map = new Dictionary(); + private Dictionary map = new Dictionary(); public override bool CancelPointer(Pointer pointer, bool shouldReturn) { @@ -28,9 +28,10 @@ public override bool CancelPointer(Pointer pointer, bool shouldReturn) { var newPointer = PointerFactory.Create(pointer.Type, this); newPointer.CopyFrom(pointer); - addPointer(newPointer, processCoords(pointer.Hit.RaycastHit.textureCoord)); - pressPointer(newPointer.Id); - map.Add(pointer.Id, newPointer.Id); + newPointer.Position = processCoords(pointer.Hit.RaycastHit.textureCoord); + addPointer(newPointer); + pressPointer(newPointer); + map.Add(pointer.Id, newPointer); } } return true; @@ -43,7 +44,7 @@ protected override void OnEnable() if (gesture) { gesture.PointerPressed += pointerPressedHandler; - gesture.PointerMoved += pointerMovedhandler; + gesture.PointerUpdated += pointerUpdatedHandler; gesture.PointerCancelled += pointerCancelledhandler; gesture.PointerReleased += pointerReleasedHandler; } @@ -56,7 +57,7 @@ protected override void OnDisable() if (gesture) { gesture.PointerPressed -= pointerPressedHandler; - gesture.PointerMoved -= pointerMovedhandler; + gesture.PointerUpdated -= pointerUpdatedHandler; gesture.PointerCancelled -= pointerCancelledhandler; gesture.PointerReleased -= pointerReleasedHandler; } @@ -74,44 +75,48 @@ private void pointerPressedHandler(object sender, MetaGestureEventArgs metaGestu var newPointer = PointerFactory.Create(pointer.Type, this); newPointer.CopyFrom(pointer); - addPointer(newPointer, processCoords(pointer.Hit.RaycastHit.textureCoord)); - pressPointer(newPointer.Id); - map.Add(pointer.Id, newPointer.Id); + newPointer.Position = processCoords(pointer.Hit.RaycastHit.textureCoord); + newPointer.Flags = pointer.Flags | Pointer.FLAG_ARTIFICIAL; + addPointer(newPointer); + pressPointer(newPointer); + map.Add(pointer.Id, newPointer); } - private void pointerMovedhandler(object sender, MetaGestureEventArgs metaGestureEventArgs) + private void pointerUpdatedHandler(object sender, MetaGestureEventArgs metaGestureEventArgs) { - int id; TouchHit hit; var pointer = metaGestureEventArgs.Pointer; if (pointer.InputSource == this) return; - if (!map.TryGetValue(pointer.Id, out id)) return; + Pointer newPointer; + if (!map.TryGetValue(pointer.Id, out newPointer)) return; if (!gesture.GetTargetHitResult(pointer.Position, out hit)) return; - movePointer(id, processCoords(hit.RaycastHit.textureCoord)); + newPointer.Position = processCoords(hit.RaycastHit.textureCoord); + newPointer.Flags = pointer.Flags | Pointer.FLAG_ARTIFICIAL; + updatePointer(newPointer); } private void pointerReleasedHandler(object sender, MetaGestureEventArgs metaGestureEventArgs) { - int id; var pointer = metaGestureEventArgs.Pointer; if (pointer.InputSource == this) return; - if (!map.TryGetValue(pointer.Id, out id)) return; + Pointer newPointer; + if (!map.TryGetValue(pointer.Id, out newPointer)) return; map.Remove(pointer.Id); - releasePointer(id); - removePointer(id); + releasePointer(newPointer); + removePointer(newPointer); } private void pointerCancelledhandler(object sender, MetaGestureEventArgs metaGestureEventArgs) { - int id; var pointer = metaGestureEventArgs.Pointer; if (pointer.InputSource == this) return; - if (!map.TryGetValue(pointer.Id, out id)) return; + Pointer newPointer; + if (!map.TryGetValue(pointer.Id, out newPointer)) return; map.Remove(pointer.Id); - cancelPointer(id); + cancelPointer(newPointer); } } diff --git a/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs b/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs index 11667920f..848601efa 100644 --- a/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs +++ b/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs @@ -143,10 +143,10 @@ public override bool CancelPointer(Pointer pointer, bool shouldReturn) } if (cursor != null) { - cancelPointer(pointer.Id); + cancelPointer(pointer); if (shouldReturn) { - cursorToInternalId[cursor] = internalReturnTouch(pointer as TouchPointer, pointer.Position); + cursorToInternalId[cursor] = internalReturnTouch(pointer as TouchPointer); } else { @@ -168,7 +168,7 @@ public override bool CancelPointer(Pointer pointer, bool shouldReturn) } if (obj != null) { - cancelPointer(pointer.Id); + cancelPointer(pointer); if (shouldReturn) { objectToInternalId[obj] = internalReturnObject(pointer as ObjectPointer, pointer.Position); @@ -191,7 +191,7 @@ public override bool CancelPointer(Pointer pointer, bool shouldReturn) } if (blob != null) { - cancelPointer(pointer.Id); + cancelPointer(pointer); if (shouldReturn) { blobToInternalId[blob] = internalReturnObject(pointer as ObjectPointer, pointer.Position); @@ -266,26 +266,28 @@ protected override void OnDisable() private TouchPointer internalAddTouch(Vector2 position, uint flags = 0) { var pointer = touchPool.Get(); - addPointer(pointer, position, true); - pressPointer(pointer.Id); + pointer.Position = remapCoordinates(position); + addPointer(pointer); + pressPointer(pointer); pointer.Flags |= flags; return pointer; } - private TouchPointer internalReturnTouch(TouchPointer pointer, Vector2 position) + private TouchPointer internalReturnTouch(TouchPointer pointer) { var newPointer = touchPool.Get(); newPointer.CopyFrom(pointer); - addPointer(newPointer, position, false); - pressPointer(newPointer.Id); + addPointer(newPointer); + pressPointer(newPointer); return newPointer; } private ObjectPointer internalAddObject(Vector2 position, uint flags = 0) { var pointer = objectPool.Get(); - addPointer(pointer, position, true); - pressPointer(pointer.Id); + pointer.Position = remapCoordinates(position); + addPointer(pointer); + pressPointer(pointer); pointer.Flags |= flags; return pointer; } @@ -294,8 +296,8 @@ private ObjectPointer internalReturnObject(ObjectPointer pointer, Vector2 positi { var newPointer = objectPool.Get(); newPointer.CopyFrom(pointer); - addPointer(newPointer, position, false); - pressPointer(newPointer.Id); + addPointer(newPointer); + pressPointer(newPointer); return newPointer; } @@ -318,9 +320,12 @@ private void disconnect() server = null; } - foreach (var i in cursorToInternalId) cancelPointer(i.Value.Id); - foreach (var i in blobToInternalId) cancelPointer(i.Value.Id); - foreach (var i in objectToInternalId) cancelPointer(i.Value.Id); + foreach (var i in cursorToInternalId) cancelPointer(i.Value); + foreach (var i in blobToInternalId) cancelPointer(i.Value); + foreach (var i in objectToInternalId) cancelPointer(i.Value); + cursorToInternalId.Clear(); + blobToInternalId.Clear(); + objectToInternalId.Clear(); } private void updateInputs() @@ -374,7 +379,8 @@ private void OnCursorUpdated(object sender, TuioCursorEventArgs e) var x = entity.X * screenWidth; var y = (1 - entity.Y) * screenHeight; - movePointer(touch.Id, new Vector2(x, y)); + touch.Position = remapCoordinates(new Vector2(x, y)); + updatePointer(touch); } } @@ -387,8 +393,8 @@ private void OnCursorRemoved(object sender, TuioCursorEventArgs e) if (!cursorToInternalId.TryGetValue(entity, out touch)) return; cursorToInternalId.Remove(entity); - releasePointer(touch.Id); - removePointer(touch.Id); + releasePointer(touch); + removePointer(touch); } } @@ -416,8 +422,9 @@ private void OnBlobUpdated(object sender, TuioBlobEventArgs e) var x = entity.X * screenWidth; var y = (1 - entity.Y) * screenHeight; - movePointer(touch.Id, new Vector2(x, y)); + touch.Position = remapCoordinates(new Vector2(x, y)); updateBlobProperties(touch, entity); + updatePointer(touch); } } @@ -430,8 +437,8 @@ private void OnBlobRemoved(object sender, TuioBlobEventArgs e) if (!blobToInternalId.TryGetValue(entity, out touch)) return; blobToInternalId.Remove(entity); - releasePointer(touch.Id); - removePointer(touch.Id); + releasePointer(touch); + removePointer(touch); } } @@ -459,8 +466,9 @@ private void OnObjectUpdated(object sender, TuioObjectEventArgs e) var x = entity.X * screenWidth; var y = (1 - entity.Y) * screenHeight; - movePointer(touch.Id, new Vector2(x, y)); + touch.Position = remapCoordinates(new Vector2(x, y)); updateObjectProperties(touch, entity); + updatePointer(touch); } } @@ -473,8 +481,8 @@ private void OnObjectRemoved(object sender, TuioObjectEventArgs e) if (!objectToInternalId.TryGetValue(entity, out touch)) return; objectToInternalId.Remove(entity); - releasePointer(touch.Id); - removePointer(touch.Id); + releasePointer(touch); + removePointer(touch); } } diff --git a/Source/Assets/TouchScript/Prefabs/Pointer Visualizer.prefab b/Source/Assets/TouchScript/Prefabs/Pointer Visualizer.prefab index 11630fb79..c3060008e 100644 --- a/Source/Assets/TouchScript/Prefabs/Pointer Visualizer.prefab +++ b/Source/Assets/TouchScript/Prefabs/Pointer Visualizer.prefab @@ -45,7 +45,7 @@ MonoBehaviour: m_EditorClassIdentifier: pointerProxy: {fileID: 11468960, guid: 4230502e1973f4c9e9ef6767dcc8c602, type: 2} showPointerId: 1 - showTags: 1 + showFlags: 1 useDPI: 1 pointerSize: 1 --- !u!1002 &11400001 diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/TouchScriptInputModule.cs b/Source/Assets/TouchScript/Scripts/Behaviors/TouchScriptInputModule.cs index f6ff61ab4..f8e1bb4c8 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/TouchScriptInputModule.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/TouchScriptInputModule.cs @@ -134,7 +134,7 @@ public override void ActivateModule() if (touchManager != null) { touchManager.PointersPressed += pointersPressedHandler; - touchManager.PointersMoved += pointersMovedHandler; + touchManager.PointersUpdated += PointersUpdatedHandler; touchManager.PointersReleased += pointersReleasedHandler; touchManager.PointersCancelled += pointersCancelledHandler; } @@ -155,7 +155,7 @@ public override void DeactivateModule() if (touchManager != null) { touchManager.PointersPressed -= pointersPressedHandler; - touchManager.PointersMoved -= pointersMovedHandler; + touchManager.PointersUpdated -= PointersUpdatedHandler; touchManager.PointersReleased -= pointersReleasedHandler; touchManager.PointersCancelled -= pointersCancelledHandler; } @@ -568,7 +568,7 @@ private void pointersPressedHandler(object sender, PointerEventArgs pointerEvent for (var i = 0; i < pointers.Count; i++) processPressed(pointers[i]); } - private void pointersMovedHandler(object sender, PointerEventArgs pointerEventArgs) + private void PointersUpdatedHandler(object sender, PointerEventArgs pointerEventArgs) { var pointers = pointerEventArgs.Pointers; for (var i = 0; i < pointers.Count; i++) processMoved(pointers[i]); diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs index c22853fb3..1e1680eea 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs @@ -121,7 +121,7 @@ private void OnEnable() { TouchManager.Instance.PointersPressed += pointersPressedHandler; TouchManager.Instance.PointersReleased += pointersReleasedHandler; - TouchManager.Instance.PointersMoved += pointersMovedHandler; + TouchManager.Instance.PointersUpdated += PointersUpdatedHandler; TouchManager.Instance.PointersCancelled += pointersCancelledHandler; } } @@ -132,7 +132,7 @@ private void OnDisable() { TouchManager.Instance.PointersPressed -= pointersPressedHandler; TouchManager.Instance.PointersReleased -= pointersReleasedHandler; - TouchManager.Instance.PointersMoved -= pointersMovedHandler; + TouchManager.Instance.PointersUpdated -= PointersUpdatedHandler; TouchManager.Instance.PointersCancelled -= pointersCancelledHandler; } } @@ -187,7 +187,7 @@ private void pointersPressedHandler(object sender, PointerEventArgs e) } } - private void pointersMovedHandler(object sender, PointerEventArgs e) + private void PointersUpdatedHandler(object sender, PointerEventArgs e) { var count = e.Pointers.Count; for (var i = 0; i < count; i++) diff --git a/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs b/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs index f5f690dcb..65fd45762 100644 --- a/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs @@ -53,7 +53,7 @@ public static IGestureManager Instance // Upcoming changes private List gesturesToReset = new List(20); - private Action> _updatePressed, _updateMoved, _updateReleased, _updateCancelled; + private Action> _updatePressed, _updateUpdated, _updateReleased, _updateCancelled; private Action _processTarget, _processTargetBegan; #endregion @@ -98,7 +98,7 @@ private void Awake() _processTarget = processTarget; _processTargetBegan = processTargetBegan; _updatePressed = doUpdatePressed; - _updateMoved = doUpdateMoved; + _updateUpdated = doUpdateUpdated; _updateReleased = doUpdateReleased; _updateCancelled = doUpdateCancelled; @@ -114,7 +114,7 @@ private void OnEnable() { touchManager.FrameStarted += frameStartedHandler; touchManager.FrameFinished += frameFinishedHandler; - touchManager.PointersMoved += pointersMovedHandler; + touchManager.PointersUpdated += PointersUpdatedHandler; touchManager.PointersPressed += pointersPressedHandler; touchManager.PointersReleased += pointersReleasedHandler; touchManager.PointersCancelled += pointersCancelledHandler; @@ -128,7 +128,7 @@ private void OnDisable() { touchManager.FrameStarted -= frameStartedHandler; touchManager.FrameFinished -= frameFinishedHandler; - touchManager.PointersMoved -= pointersMovedHandler; + touchManager.PointersUpdated -= PointersUpdatedHandler; touchManager.PointersPressed -= pointersPressedHandler; touchManager.PointersReleased -= pointersReleasedHandler; touchManager.PointersCancelled -= pointersCancelledHandler; @@ -220,9 +220,9 @@ private void doUpdatePressed(Gesture gesture, IList pointers) gesture.INTERNAL_PointersPressed(pointers); } - private void doUpdateMoved(Gesture gesture, IList pointers) + private void doUpdateUpdated(Gesture gesture, IList pointers) { - gesture.INTERNAL_PointersMoved(pointers); + gesture.INTERNAL_PointersUpdated(pointers); } private void doUpdateReleased(Gesture gesture, IList pointers) @@ -568,9 +568,9 @@ private void pointersPressedHandler(object sender, PointerEventArgs pointerEvent update(pointerEventArgs.Pointers, _processTargetBegan, _updatePressed); } - private void pointersMovedHandler(object sender, PointerEventArgs pointerEventArgs) + private void PointersUpdatedHandler(object sender, PointerEventArgs pointerEventArgs) { - update(pointerEventArgs.Pointers, _processTarget, _updateMoved); + update(pointerEventArgs.Pointers, _processTarget, _updateUpdated); } private void pointersReleasedHandler(object sender, PointerEventArgs pointerEventArgs) diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs index 6260737ea..f432dd7bd 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs @@ -307,9 +307,9 @@ protected override void pointersPressed(IList pointers) } /// - protected override void pointersMoved(IList pointers) + protected override void pointersUpdated(IList pointers) { - base.pointersMoved(pointers); + base.pointersUpdated(pointers); var projectionParams = activePointers[0].ProjectionParams; var dP = deltaPosition = Vector3.zero; diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredScreenTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredScreenTransformGesture.cs index 0824a77da..c8b6682ae 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredScreenTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredScreenTransformGesture.cs @@ -34,11 +34,11 @@ protected override void pointersPressed(IList pointers) } /// - protected override void pointersMoved(IList pointers) + protected override void pointersUpdated(IList pointers) { clusters.Invalidate(); - base.pointersMoved(pointers); + base.pointersUpdated(pointers); } /// diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredTransformGesture.cs index cfb163f4d..4c45ec921 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredTransformGesture.cs @@ -34,11 +34,11 @@ protected override void pointersPressed(IList pointers) } /// - protected override void pointersMoved(IList pointers) + protected override void pointersUpdated(IList pointers) { clusters.Invalidate(); - base.pointersMoved(pointers); + base.pointersUpdated(pointers); } /// diff --git a/Source/Assets/TouchScript/Scripts/Gestures/FlickGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/FlickGesture.cs index 4b4e85fb2..40cae9a69 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/FlickGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/FlickGesture.cs @@ -172,9 +172,9 @@ protected override void pointersPressed(IList pointers) } /// - protected override void pointersMoved(IList pointers) + protected override void pointersUpdated(IList pointers) { - base.pointersMoved(pointers); + base.pointersUpdated(pointers); if (isActive || !moving) { diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs index 403cffc6b..e3853487e 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs @@ -767,12 +767,12 @@ internal void INTERNAL_PointersPressed(IList pointers) pointersPressed(pointers); } - internal void INTERNAL_PointersMoved(IList pointers) + internal void INTERNAL_PointersUpdated(IList pointers) { pointersNumState = PointersNumState.InRange; if (minPointers > 0 && numPointers < minPointers) pointersNumState = PointersNumState.TooFew; if (maxPointers > 0 && pointersNumState == PointersNumState.InRange && numPointers > maxPointers) pointersNumState = PointersNumState.TooMany; - pointersMoved(pointers); + pointersUpdated(pointers); } internal void INTERNAL_PointersReleased(IList pointers) @@ -963,7 +963,7 @@ protected virtual void pointersPressed(IList pointers) {} /// Called for moved pointers. /// /// The pointers. - protected virtual void pointersMoved(IList pointers) {} + protected virtual void pointersUpdated(IList pointers) {} /// /// Called if pointers are removed. diff --git a/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs index e7e073bd5..5801daa66 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs @@ -118,9 +118,9 @@ protected override void pointersPressed(IList pointers) } /// - protected override void pointersMoved(IList pointers) + protected override void pointersUpdated(IList pointers) { - base.pointersMoved(pointers); + base.pointersUpdated(pointers); if (distanceLimit < float.PositiveInfinity) { diff --git a/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs index 51ce8fff0..56a233d32 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs @@ -55,10 +55,10 @@ public event EventHandler PointerPressed /// /// Occurs when a pointer is updated. /// - public event EventHandler PointerMoved + public event EventHandler PointerUpdated { - add { pointerMovedInvoker += value; } - remove { pointerMovedInvoker -= value; } + add { pointerUpdatedInvoker += value; } + remove { pointerUpdatedInvoker -= value; } } /// @@ -81,7 +81,7 @@ public event EventHandler PointerCancelled // Needed to overcome iOS AOT limitations private EventHandler pointerPressedInvoker, - pointerMovedInvoker, + pointerUpdatedInvoker, pointerReleasedInvoker, pointerCancelledInvoker; @@ -109,17 +109,17 @@ protected override void pointersPressed(IList pointers) } /// - protected override void pointersMoved(IList pointers) + protected override void pointersUpdated(IList pointers) { - base.pointersMoved(pointers); + base.pointersUpdated(pointers); if (State == GestureState.Began || State == GestureState.Changed) setState(GestureState.Changed); var length = pointers.Count; - if (pointerMovedInvoker != null) + if (pointerUpdatedInvoker != null) { for (var i = 0; i < length; i++) - pointerMovedInvoker.InvokeHandleExceptions(this, new MetaGestureEventArgs(pointers[i])); + pointerUpdatedInvoker.InvokeHandleExceptions(this, new MetaGestureEventArgs(pointers[i])); } if (UseSendMessage && SendMessageTarget != null) { diff --git a/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs index c68c3a824..5714e936b 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs @@ -167,9 +167,9 @@ protected override void pointersPressed(IList pointers) } /// - protected override void pointersMoved(IList pointers) + protected override void pointersUpdated(IList pointers) { - base.pointersMoved(pointers); + base.pointersUpdated(pointers); var projectionParams = activePointers[0].ProjectionParams; var dR = deltaRotation = 0; diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs index cbd9b6bea..fc6b4214e 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs @@ -172,9 +172,9 @@ protected override void pointersPressed(IList pointers) } /// - protected override void pointersMoved(IList pointers) + protected override void pointersUpdated(IList pointers) { - base.pointersMoved(pointers); + base.pointersUpdated(pointers); if (distanceLimit < float.PositiveInfinity) { diff --git a/Source/Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs index 8313317df..a07b76a6d 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs @@ -60,9 +60,9 @@ protected override void pointersPressed(IList pointers) } /// - protected override void pointersMoved(IList pointers) + protected override void pointersUpdated(IList pointers) { - base.pointersMoved(pointers); + base.pointersUpdated(pointers); for (var i = 0; i < pointers.Count; i++) { diff --git a/Source/Assets/TouchScript/Scripts/ITouchManager.cs b/Source/Assets/TouchScript/Scripts/ITouchManager.cs index 4a636179b..3c4b37aec 100644 --- a/Source/Assets/TouchScript/Scripts/ITouchManager.cs +++ b/Source/Assets/TouchScript/Scripts/ITouchManager.cs @@ -21,7 +21,7 @@ namespace TouchScript /// /// FrameStarted /// PointersPressed - /// PointersMoved + /// PointersUpdated /// PointersReleased /// PointersCancelled /// FrameFinished @@ -59,7 +59,7 @@ public interface ITouchManager /// /// Occurs when pointers are updated. /// - event EventHandler PointersMoved; + event EventHandler PointersUpdated; /// /// Occurs when pointers touch the surface. diff --git a/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs b/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs index 66887a63a..734c9685b 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs @@ -15,6 +15,13 @@ namespace TouchScript.InputSources /// public interface IInputSource : INTERNAL_IInputSource { + + /// + /// Gets or sets current coordinates remapper. + /// + /// An object used to change coordinates of pointer points coming from this input source. + ICoordinatesRemapper CoordinatesRemapper { get; set; } + /// /// This method is called by to synchronously update the input. /// @@ -29,15 +36,6 @@ public interface IInputSource : INTERNAL_IInputSource bool CancelPointer(Pointer pointer, bool shouldReturn); } - public interface IRemapableInputSource - { - /// - /// Gets or sets current coordinates remapper. - /// - /// An object used to change coordinates of pointer points coming from this input source. - ICoordinatesRemapper CoordinatesRemapper { get; set; } - } - public interface INTERNAL_IInputSource { void INTERNAL_DiscardPointer(Pointer pointer); diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs index f9e4cf3ef..58245a3d3 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs @@ -16,6 +16,8 @@ public class MouseHandler : IInputSource, IDisposable { #region Public properties + public ICoordinatesRemapper CoordinatesRemapper { get; set; } + public bool EmulateSecondMousePointer { get { return emulateSecondMousePointer; } @@ -32,12 +34,12 @@ public bool EmulateSecondMousePointer private bool emulateSecondMousePointer = true; - private AddPointerDelegate addPointer; - private MovePointerDelegate movePointer; - private PressPointerDelegate pressPointer; - private ReleasePointerDelegate releasePointer; - private RemovePointerDelegate removePointer; - private CancelPointerDelegate cancelPointer; + private PointerDelegate addPointer; + private PointerDelegate updatePointer; + private PointerDelegate pressPointer; + private PointerDelegate releasePointer; + private PointerDelegate removePointer; + private PointerDelegate cancelPointer; private ObjectPool mousePool; private MousePointer mousePointer, fakeMousePointer; @@ -49,13 +51,13 @@ public bool EmulateSecondMousePointer /// Initializes a new instance of the class. /// /// A function called when a new pointer is detected. As this function must accept a Vector2 position of the new pointer and return an instance of . - /// A function called when a pointer is moved. As this function must accept an int id and a Vector2 position. + /// A function called when a pointer is moved. As this function must accept an int id and a Vector2 position. /// A function called when a pointer is lifted off. As this function must accept an int id. /// A function called when a pointer is cancelled. As this function must accept an int id. - public MouseHandler(AddPointerDelegate addPointer, MovePointerDelegate movePointer, PressPointerDelegate pressPointer, ReleasePointerDelegate releasePointer, RemovePointerDelegate removePointer, CancelPointerDelegate cancelPointer) + public MouseHandler(PointerDelegate addPointer, PointerDelegate updatePointer, PointerDelegate pressPointer, PointerDelegate releasePointer, PointerDelegate removePointer, PointerDelegate cancelPointer) { this.addPointer = addPointer; - this.movePointer = movePointer; + this.updatePointer = updatePointer; this.pressPointer = pressPointer; this.releasePointer = releasePointer; this.removePointer = removePointer; @@ -77,9 +79,8 @@ public void UpdateInput() if (fakeMousePointer != null && !(Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt))) { - fakeMousePointer.Flags = fakeMousePointer.Flags & ~Pointer.FLAG_INCONTACT; - releasePointer(fakeMousePointer.Id); - removePointer(fakeMousePointer.Id); + releasePointer(fakeMousePointer); + removePointer(fakeMousePointer); fakeMousePointer = null; } @@ -87,7 +88,8 @@ public void UpdateInput() if (mousePointPos != pos) { mousePointPos = pos; - movePointer(mousePointer.Id, new Vector2(pos.x, pos.y)); + mousePointer.Position = remapCoordinates(new Vector2(pos.x, pos.y)); + updatePointer(mousePointer); } var flags = mousePointer.Flags; @@ -100,17 +102,17 @@ public void UpdateInput() // But there was a click this frame var newFlags = getMouseButtonFlags(); mousePointer.Flags = (flags & ~Pointer.FLAG_INCONTACT) | newFlags; - pressPointer(mousePointer.Id); + pressPointer(mousePointer); if (newFlags == 0) { // And release the same frame - releasePointer(mousePointer.Id); + releasePointer(mousePointer); if (emulateSecondMousePointer && (Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt)) && fakeMousePointer == null) { fakeMousePointer = internalAddPointer(mousePointPos, flags | Pointer.FLAG_ARTIFICIAL); - pressPointer(fakeMousePointer.Id); + pressPointer(fakeMousePointer); } } } @@ -118,18 +120,23 @@ public void UpdateInput() else { var newFlags = getMouseButtonFlags(); + var oldFlags = flags & Pointer.FLAG_INCONTACT; mousePointer.Flags = (flags & ~Pointer.FLAG_INCONTACT) | newFlags; if (newFlags == 0) { // Released this frame - releasePointer(mousePointer.Id); + releasePointer(mousePointer); if (emulateSecondMousePointer && (Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt)) && fakeMousePointer == null) { fakeMousePointer = internalAddPointer(mousePointPos, flags | Pointer.FLAG_ARTIFICIAL); - pressPointer(fakeMousePointer.Id); + pressPointer(fakeMousePointer); } + } else if (newFlags != oldFlags) + { + // Button state changed + updatePointer(mousePointer); } } } @@ -139,15 +146,15 @@ public bool CancelPointer(Pointer pointer, bool shouldReturn) { if (pointer.Equals(mousePointer)) { - cancelPointer(mousePointer.Id); - if (shouldReturn) mousePointer = internalReturnPointer(mousePointer, pointer.Position); + cancelPointer(mousePointer); + if (shouldReturn) mousePointer = internalReturnPointer(mousePointer); else mousePointer = internalAddPointer(mousePointPos); // can't totally cancell mouse pointer return true; } if (pointer.Equals(fakeMousePointer)) { - cancelPointer(fakeMousePointer.Id); - if (shouldReturn) fakeMousePointer = internalReturnPointer(fakeMousePointer, pointer.Position); + cancelPointer(fakeMousePointer); + if (shouldReturn) fakeMousePointer = internalReturnPointer(fakeMousePointer); else fakeMousePointer = null; return true; } @@ -159,12 +166,12 @@ public void Dispose() { if (mousePointer != null) { - cancelPointer(mousePointer.Id); + cancelPointer(mousePointer); mousePointer = null; } if (fakeMousePointer != null) { - cancelPointer(fakeMousePointer.Id); + cancelPointer(fakeMousePointer); fakeMousePointer = null; } } @@ -197,20 +204,27 @@ private uint getMouseButtonFlags() private MousePointer internalAddPointer(Vector2 position, uint flags = 0) { var pointer = mousePool.Get(); - addPointer(pointer, position); + pointer.Position = remapCoordinates(position); + addPointer(pointer); pointer.Flags |= flags; return pointer; } - private MousePointer internalReturnPointer(MousePointer pointer, Vector2 position) + private MousePointer internalReturnPointer(MousePointer pointer) { var newPointer = mousePool.Get(); newPointer.CopyFrom(pointer); - addPointer(newPointer, position, false); - if ((newPointer.Flags & Pointer.FLAG_INCONTACT) != 0) pressPointer(newPointer.Id); + addPointer(newPointer); + if ((newPointer.Flags & Pointer.FLAG_INCONTACT) != 0) pressPointer(newPointer); return newPointer; } + private Vector2 remapCoordinates(Vector2 position) + { + if (CoordinatesRemapper != null) return CoordinatesRemapper.Remap(position); + return position; + } + #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 0c61b106c..ff4978a21 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs @@ -18,6 +18,8 @@ public class TouchHandler : IInputSource, IDisposable { #region Public properties + public ICoordinatesRemapper CoordinatesRemapper { get; set; } + /// /// Gets a value indicating whether there any active pointers. /// @@ -31,14 +33,15 @@ public bool HasPointers #region Private variables - private AddPointerDelegate addPointer; - private MovePointerDelegate movePointer; - private PressPointerDelegate pressPointer; - private ReleasePointerDelegate releasePointer; - private RemovePointerDelegate removePointer; - private CancelPointerDelegate cancelPointer; + private PointerDelegate addPointer; + private PointerDelegate updatePointer; + private PointerDelegate pressPointer; + private PointerDelegate releasePointer; + private PointerDelegate removePointer; + private PointerDelegate cancelPointer; private ObjectPool touchPool; + // Unity fingerId -> TouchScript touch info private Dictionary systemToInternalId = new Dictionary(); private int pointersNum; @@ -48,13 +51,13 @@ public bool HasPointers /// Initializes a new instance of the class. /// /// A function called when a new pointer is detected. As this function must accept a Vector2 position of the new pointer and return an instance of . - /// A function called when a pointer is moved. As this function must accept an int id and a Vector2 position. + /// A function called when a pointer is moved. As this function must accept an int id and a Vector2 position. /// A function called when a pointer is lifted off. As this function must accept an int id. /// A function called when a pointer is cancelled. As this function must accept an int id. - public TouchHandler(AddPointerDelegate addPointer, MovePointerDelegate movePointer, PressPointerDelegate pressPointer, ReleasePointerDelegate releasePointer, RemovePointerDelegate removePointer, CancelPointerDelegate cancelPointer) + public TouchHandler(PointerDelegate addPointer, PointerDelegate updatePointer, PointerDelegate pressPointer, PointerDelegate releasePointer, PointerDelegate removePointer, PointerDelegate cancelPointer) { this.addPointer = addPointer; - this.movePointer = movePointer; + this.updatePointer = updatePointer; this.pressPointer = pressPointer; this.releasePointer = releasePointer; this.removePointer = removePointer; @@ -82,47 +85,53 @@ public void UpdateInput() if (systemToInternalId.TryGetValue(t.fingerId, out touchState) && touchState.Phase != TouchPhase.Canceled) { // Ending previous touch (missed a frame) - internalRemovePointer(touchState.Id); - systemToInternalId[t.fingerId] = new TouchState(internalAddPointer(t.position, Pointer.FLAG_FIRST_BUTTON).Id); + internalRemovePointer(touchState.Pointer); + systemToInternalId[t.fingerId] = new TouchState(internalAddPointer(t.position, Pointer.FLAG_FIRST_BUTTON)); } else { - systemToInternalId.Add(t.fingerId, new TouchState(internalAddPointer(t.position, Pointer.FLAG_FIRST_BUTTON).Id)); + systemToInternalId.Add(t.fingerId, new TouchState(internalAddPointer(t.position, Pointer.FLAG_FIRST_BUTTON))); } break; case TouchPhase.Moved: if (systemToInternalId.TryGetValue(t.fingerId, out touchState)) { - if (touchState.Phase != TouchPhase.Canceled) movePointer(touchState.Id, t.position); + 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, Pointer.FLAG_FIRST_BUTTON).Id)); + systemToInternalId.Add(t.fingerId, new TouchState(internalAddPointer(t.position, Pointer.FLAG_FIRST_BUTTON))); } break; case TouchPhase.Ended: if (systemToInternalId.TryGetValue(t.fingerId, out touchState)) { systemToInternalId.Remove(t.fingerId); - if (touchState.Phase != TouchPhase.Canceled) internalRemovePointer(touchState.Id); + if (touchState.Phase != TouchPhase.Canceled) internalRemovePointer(touchState.Pointer); } else { // Missed one finger begin-end transition - internalRemovePointer(internalAddPointer(t.position, Pointer.FLAG_FIRST_BUTTON).Id); + var pointer = internalAddPointer(t.position, Pointer.FLAG_FIRST_BUTTON); + internalRemovePointer(pointer); } break; case TouchPhase.Canceled: if (systemToInternalId.TryGetValue(t.fingerId, out touchState)) { systemToInternalId.Remove(t.fingerId); - if (touchState.Phase != TouchPhase.Canceled) internalCancelPointer(touchState.Id); + if (touchState.Phase != TouchPhase.Canceled) internalCancelPointer(touchState.Pointer); } else { // Missed one finger begin-end transition - internalCancelPointer(internalAddPointer(t.position, Pointer.FLAG_FIRST_BUTTON).Id); + var pointer = internalAddPointer(t.position, Pointer.FLAG_FIRST_BUTTON); + internalCancelPointer(pointer); } break; case TouchPhase.Stationary: @@ -130,7 +139,7 @@ public void UpdateInput() else { // Missed begin phase - systemToInternalId.Add(t.fingerId, new TouchState(internalAddPointer(t.position, Pointer.FLAG_FIRST_BUTTON).Id)); + systemToInternalId.Add(t.fingerId, new TouchState(internalAddPointer(t.position, Pointer.FLAG_FIRST_BUTTON))); } break; } @@ -146,7 +155,7 @@ public bool CancelPointer(Pointer pointer, bool shouldReturn) int fingerId = -1; foreach (var touchState in systemToInternalId) { - if (touchState.Value.Id == touch.Id && touchState.Value.Phase != TouchPhase.Canceled) + if (touchState.Value.Pointer == touch && touchState.Value.Phase != TouchPhase.Canceled) { fingerId = touchState.Key; break; @@ -154,9 +163,9 @@ public bool CancelPointer(Pointer pointer, bool shouldReturn) } if (fingerId > -1) { - internalCancelPointer(touch.Id); - if (shouldReturn) systemToInternalId[fingerId] = new TouchState(internalReturnPointer(touch, touch.Position).Id); - else systemToInternalId[fingerId] = new TouchState(touch.Id, TouchPhase.Canceled); + internalCancelPointer(touch); + if (shouldReturn) systemToInternalId[fingerId] = new TouchState(internalReturnPointer(touch)); + else systemToInternalId[fingerId] = new TouchState(touch, TouchPhase.Canceled); return true; } return false; @@ -167,7 +176,7 @@ public void Dispose() { foreach (var touchState in systemToInternalId) { - if (touchState.Value.Phase != TouchPhase.Canceled) internalCancelPointer(touchState.Value.Id); + if (touchState.Value.Phase != TouchPhase.Canceled) internalCancelPointer(touchState.Value.Pointer); } systemToInternalId.Clear(); } @@ -192,45 +201,52 @@ private Pointer internalAddPointer(Vector2 position, uint flags = 0) { pointersNum++; var pointer = touchPool.Get(); - addPointer(pointer, position, true); - pressPointer(pointer.Id); + pointer.Position = remapCoordinates(position); + addPointer(pointer); + pressPointer(pointer); pointer.Flags |= flags; return pointer; } - private TouchPointer internalReturnPointer(TouchPointer pointer, Vector2 position) + private TouchPointer internalReturnPointer(TouchPointer pointer) { pointersNum++; var newPointer = touchPool.Get(); newPointer.CopyFrom(pointer); - addPointer(newPointer, position, false); - pressPointer(newPointer.Id); + addPointer(newPointer); + pressPointer(newPointer); return newPointer; } - private void internalRemovePointer(int id) + private void internalRemovePointer(Pointer pointer) { pointersNum--; - releasePointer(id); - removePointer(id); + releasePointer(pointer); + removePointer(pointer); } - private void internalCancelPointer(int id) + private void internalCancelPointer(Pointer pointer) { pointersNum--; - cancelPointer(id); + cancelPointer(pointer); + } + + private Vector2 remapCoordinates(Vector2 position) + { + if (CoordinatesRemapper != null) return CoordinatesRemapper.Remap(position); + return position; } #endregion private struct TouchState { - public int Id; + public Pointer Pointer; public TouchPhase Phase; - public TouchState(int id, TouchPhase phase = TouchPhase.Began) + public TouchState(Pointer pointer, TouchPhase phase = TouchPhase.Began) { - Id = id; + Pointer = pointer; Phase = phase; } diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs index 3d7f63c9b..2483c28e3 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs @@ -4,6 +4,7 @@ * @author Andrew David Griffiths */ + #if UNITY_STANDALONE_WIN using System; @@ -37,8 +38,8 @@ public bool MouseInPointer { if (mousePointer != null) { - if ((mousePointer.Flags & Pointer.FLAG_INCONTACT) != 0) releasePointer(mousePointer.Id); - removePointer(mousePointer.Id); + if ((mousePointer.Flags & Pointer.FLAG_INCONTACT) != 0) releasePointer(mousePointer); + removePointer(mousePointer); } } } @@ -59,7 +60,7 @@ public bool MouseInPointer #region Constructor /// - public Windows8PointerHandler(AddPointerDelegate addPointer, MovePointerDelegate movePointer, PressPointerDelegate pressPointer, ReleasePointerDelegate releasePointer, RemovePointerDelegate removePointer, CancelPointerDelegate cancelPointer) : base(addPointer, movePointer, pressPointer, releasePointer, removePointer, cancelPointer) + 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()); @@ -78,15 +79,15 @@ public override bool CancelPointer(Pointer pointer, bool shouldReturn) { if (pointer.Equals(mousePointer)) { - cancelPointer(mousePointer.Id); - if (shouldReturn) mousePointer = internalReturnMousePointer(mousePointer, pointer.Position); + cancelPointer(mousePointer); + if (shouldReturn) mousePointer = internalReturnMousePointer(mousePointer); else mousePointer = internalAddMousePointer(pointer.Position); // can't totally cancell mouse pointer return true; } if (pointer.Equals(penPointer)) { - cancelPointer(penPointer.Id); - if (shouldReturn) penPointer = internalReturnPenPointer(penPointer, pointer.Position); + cancelPointer(penPointer); + if (shouldReturn) penPointer = internalReturnPenPointer(penPointer); else penPointer = internalAddPenPointer(pointer.Position); // can't totally cancell mouse pointer return true; } @@ -98,12 +99,12 @@ public override void Dispose() { if (mousePointer != null) { - cancelPointer(mousePointer.Id); + cancelPointer(mousePointer); mousePointer = null; } if (penPointer != null) { - cancelPointer(penPointer.Id); + cancelPointer(penPointer); penPointer = null; } @@ -162,27 +163,25 @@ private void decodeWin8Touches(uint msg, IntPtr wParam, IntPtr lParam) p.Y = pointerInfo.ptPixelLocation.Y; ScreenToClient(hMainWindow, ref p); - int existingId; - switch (msg) { case WM_POINTERDOWN: { if ((pointerInfo.pointerFlags & POINTER_FLAG_CANCELLED) == POINTER_FLAG_CANCELLED) break; - var position = new Vector2((p.X - offsetX) * scaleX, Screen.height - (p.Y - offsetY) * scaleY); + var position = new Vector2((p.X - offsetX)*scaleX, Screen.height - (p.Y - offsetY)*scaleY); var buttonFlags = (pointerInfo.pointerFlags >> 3) & Pointer.FLAG_INCONTACT; switch (pointerInfo.pointerType) { case POINTER_INPUT_TYPE.PT_MOUSE: - pressPointer(mousePointer.Id); mousePointer.Flags = (mousePointer.Flags & ~Pointer.FLAG_INCONTACT) | buttonFlags; + pressPointer(mousePointer); break; case POINTER_INPUT_TYPE.PT_TOUCH: - winTouchToInternalId.Add(pointerId, internalAddTouchPointer(position, buttonFlags).Id); + winTouchToInternalId.Add(pointerId, internalAddTouchPointer(position, buttonFlags)); break; case POINTER_INPUT_TYPE.PT_PEN: - pressPointer(penPointer.Id); penPointer.Flags = (penPointer.Flags & ~Pointer.FLAG_INCONTACT) | buttonFlags; + pressPointer(penPointer); break; } } @@ -193,65 +192,68 @@ private void decodeWin8Touches(uint msg, IntPtr wParam, IntPtr lParam) switch (pointerInfo.pointerType) { case POINTER_INPUT_TYPE.PT_MOUSE: - var id = mousePointer.Id; if ((pointerInfo.pointerFlags & POINTER_FLAG_CANCELLED) == POINTER_FLAG_CANCELLED) { - cancelPointer(id); - mousePointer = null; + cancelPointer(mousePointer); + mousePointer = internalAddMousePointer(mousePointer.Position); // can't totally cancell mouse pointer } - else releasePointer(id); + else releasePointer(mousePointer); break; case POINTER_INPUT_TYPE.PT_TOUCH: - if (winTouchToInternalId.TryGetValue(pointerId, out existingId)) + TouchPointer touchPointer; + if (winTouchToInternalId.TryGetValue(pointerId, out touchPointer)) { winTouchToInternalId.Remove(pointerId); - if ((pointerInfo.pointerFlags & POINTER_FLAG_CANCELLED) == POINTER_FLAG_CANCELLED) cancelPointer(existingId); + if ((pointerInfo.pointerFlags & POINTER_FLAG_CANCELLED) == POINTER_FLAG_CANCELLED) cancelPointer(touchPointer); else { - releasePointer(existingId); - removePointer(existingId); + releasePointer(touchPointer); + removePointer(touchPointer); } } break; case POINTER_INPUT_TYPE.PT_PEN: - id = penPointer.Id; if ((pointerInfo.pointerFlags & POINTER_FLAG_CANCELLED) == POINTER_FLAG_CANCELLED) { - cancelPointer(id); - penPointer = null; + cancelPointer(penPointer); + penPointer = internalAddPenPointer(penPointer.Position); // can't totally cancell mouse pointer; } - else releasePointer(id); + else releasePointer(penPointer); break; } } break; case WM_POINTERUPDATE: { - var id = Pointer.INVALID_POINTER; - var position = new Vector2((p.X - offsetX) * scaleX, Screen.height - (p.Y - offsetY) * scaleY); + Pointer pointer = null; + var position = remapCoordinates(new Vector2((p.X - offsetX)*scaleX, Screen.height - (p.Y - offsetY)*scaleY)); switch (pointerInfo.pointerType) { case POINTER_INPUT_TYPE.PT_MOUSE: - id = mousePointer.Id; + pointer = mousePointer; break; case POINTER_INPUT_TYPE.PT_TOUCH: - if (winTouchToInternalId.TryGetValue(pointerId, out existingId)) id = existingId; + TouchPointer touchPointer; + if (winTouchToInternalId.TryGetValue(pointerId, out touchPointer)) pointer = touchPointer; break; case POINTER_INPUT_TYPE.PT_PEN: if (penPointer == null) internalAddPenPointer(position); - id = penPointer.Id; + pointer = penPointer; break; } - if (id != Pointer.INVALID_POINTER) + if (pointer != null) { if ((pointerInfo.pointerFlags & POINTER_FLAG_CANCELLED) == POINTER_FLAG_CANCELLED) { if (pointerInfo.pointerType == POINTER_INPUT_TYPE.PT_TOUCH) winTouchToInternalId.Remove(pointerId); - cancelPointer(id); + cancelPointer(pointer); } else { - movePointer(id, position); + var buttonFlags = (pointerInfo.pointerFlags >> 3) & Pointer.FLAG_INCONTACT; + pointer.Flags = (pointer.Flags & ~Pointer.FLAG_INCONTACT) | buttonFlags; + pointer.Position = position; + updatePointer(pointer); } } } @@ -262,34 +264,36 @@ private void decodeWin8Touches(uint msg, IntPtr wParam, IntPtr lParam) private MousePointer internalAddMousePointer(Vector2 position, uint flags = 0) { var pointer = mousePool.Get(); - addPointer(pointer, position); + pointer.Position = remapCoordinates(position); + addPointer(pointer); pointer.Flags |= flags; return pointer; } - private MousePointer internalReturnMousePointer(MousePointer pointer, Vector2 position) + private MousePointer internalReturnMousePointer(MousePointer pointer) { var newPointer = mousePool.Get(); newPointer.CopyFrom(pointer); - addPointer(newPointer, position, false); - if ((newPointer.Flags & Pointer.FLAG_INCONTACT) != 0) pressPointer(newPointer.Id); + addPointer(newPointer); + if ((newPointer.Flags & Pointer.FLAG_INCONTACT) != 0) pressPointer(newPointer); return newPointer; } private PenPointer internalAddPenPointer(Vector2 position, uint flags = 0) { var pointer = penPool.Get(); - addPointer(pointer, position); + pointer.Position = remapCoordinates(position); + addPointer(pointer); pointer.Flags |= flags; return pointer; } - private PenPointer internalReturnPenPointer(PenPointer pointer, Vector2 position) + private PenPointer internalReturnPenPointer(PenPointer pointer) { var newPointer = penPool.Get(); newPointer.CopyFrom(pointer); - addPointer(newPointer, position, false); - if ((newPointer.Flags & Pointer.FLAG_INCONTACT) != 0) pressPointer(newPointer.Id); + addPointer(newPointer); + if ((newPointer.Flags & Pointer.FLAG_INCONTACT) != 0) pressPointer(newPointer); return newPointer; } } @@ -299,7 +303,7 @@ public class Windows7PointerHandler : WindowsPointerHandler private int touchInputSize; /// - public Windows7PointerHandler(AddPointerDelegate addPointer, MovePointerDelegate movePointer, PressPointerDelegate pressPointer, ReleasePointerDelegate releasePointer, RemovePointerDelegate removePointer, CancelPointerDelegate cancelPointer) : base(addPointer, movePointer, pressPointer, releasePointer, removePointer, cancelPointer) + public Windows7PointerHandler(PointerDelegate addPointer, PointerDelegate updatePointer, PointerDelegate pressPointer, PointerDelegate releasePointer, PointerDelegate removePointer, PointerDelegate cancelPointer) : base(addPointer, updatePointer, pressPointer, releasePointer, removePointer, cancelPointer) { touchInputSize = Marshal.SizeOf(typeof (TOUCHINPUT)); RegisterTouchWindow(hMainWindow, 0); @@ -349,34 +353,34 @@ private void decodeWin7Touches(IntPtr wParam, IntPtr lParam) if ((touch.dwFlags & (int) TOUCH_EVENT.TOUCHEVENTF_DOWN) != 0) { POINT p = new POINT(); - p.X = touch.x / 100; - p.Y = touch.y / 100; + p.X = touch.x/100; + p.Y = touch.y/100; ScreenToClient(hMainWindow, ref p); - winTouchToInternalId.Add(touch.dwID, internalAddTouchPointer(new Vector2((p.X - offsetX) * scaleX, Screen.height - (p.Y - offsetY) * scaleY), Pointer.FLAG_FIRST_BUTTON).Id); + winTouchToInternalId.Add(touch.dwID, internalAddTouchPointer(new Vector2((p.X - offsetX)*scaleX, Screen.height - (p.Y - offsetY)*scaleY), Pointer.FLAG_FIRST_BUTTON)); } else if ((touch.dwFlags & (int) TOUCH_EVENT.TOUCHEVENTF_UP) != 0) { - int existingId; - if (winTouchToInternalId.TryGetValue(touch.dwID, out existingId)) + TouchPointer touchPointer; + if (winTouchToInternalId.TryGetValue(touch.dwID, out touchPointer)) { winTouchToInternalId.Remove(touch.dwID); - releasePointer(existingId); - removePointer(existingId); + releasePointer(touchPointer); + removePointer(touchPointer); } } else if ((touch.dwFlags & (int) TOUCH_EVENT.TOUCHEVENTF_MOVE) != 0) { - int existingId; - if (winTouchToInternalId.TryGetValue(touch.dwID, out existingId)) + TouchPointer touchPointer; + if (winTouchToInternalId.TryGetValue(touch.dwID, out touchPointer)) { POINT p = new POINT(); - p.X = touch.x / 100; - p.Y = touch.y / 100; + p.X = touch.x/100; + p.Y = touch.y/100; ScreenToClient(hMainWindow, ref p); - movePointer(existingId, - new Vector2((p.X - offsetX) * scaleX, Screen.height - (p.Y - offsetY) * scaleY)); + touchPointer.Position = remapCoordinates(new Vector2((p.X - offsetX)*scaleX, Screen.height - (p.Y - offsetY)*scaleY)); + updatePointer(touchPointer); } } } @@ -408,21 +412,27 @@ public enum PointerSource #endregion + #region Public properties + + public ICoordinatesRemapper CoordinatesRemapper { get; set; } + + #endregion + #region Protected variables - protected AddPointerDelegate addPointer; - protected MovePointerDelegate movePointer; - protected PressPointerDelegate pressPointer; - protected ReleasePointerDelegate releasePointer; - protected RemovePointerDelegate removePointer; - protected CancelPointerDelegate cancelPointer; + protected PointerDelegate addPointer; + protected PointerDelegate updatePointer; + protected PointerDelegate pressPointer; + protected PointerDelegate releasePointer; + protected PointerDelegate removePointer; + protected PointerDelegate cancelPointer; protected IntPtr hMainWindow; protected IntPtr oldWndProcPtr; protected IntPtr newWndProcPtr; protected WndProcDelegate newWndProc; protected ushort pressAndHoldAtomID; - protected Dictionary winTouchToInternalId = new Dictionary(); + protected Dictionary winTouchToInternalId = new Dictionary(); protected float offsetX, offsetY, scaleX, scaleY; @@ -436,13 +446,13 @@ public enum PointerSource /// Initializes a new instance of the class. /// /// A function called when a new pointer is detected. As this function must accept a Vector2 position of the new pointer and return an instance of . - /// A function called when a pointer is moved. As this function must accept an int id and a Vector2 position. + /// A function called when a pointer is moved. As this function must accept an int id and a Vector2 position. /// A function called when a pointer is lifted off. As this function must accept an int id. /// A function called when a pointer is cancelled. As this function must accept an int id. - public WindowsPointerHandler(AddPointerDelegate addPointer, MovePointerDelegate movePointer, PressPointerDelegate pressPointer, ReleasePointerDelegate releasePointer, RemovePointerDelegate removePointer, CancelPointerDelegate cancelPointer) + public WindowsPointerHandler(PointerDelegate addPointer, PointerDelegate updatePointer, PointerDelegate pressPointer, PointerDelegate releasePointer, PointerDelegate removePointer, PointerDelegate cancelPointer) { this.addPointer = addPointer; - this.movePointer = movePointer; + this.updatePointer = updatePointer; this.pressPointer = pressPointer; this.releasePointer = releasePointer; this.removePointer = removePointer; @@ -460,7 +470,9 @@ public WindowsPointerHandler(AddPointerDelegate addPointer, MovePointerDelegate #region Public methods /// - public void UpdateInput() {} + public void UpdateInput() + { + } /// public virtual bool CancelPointer(Pointer pointer, bool shouldReturn) @@ -471,7 +483,7 @@ public virtual bool CancelPointer(Pointer pointer, bool shouldReturn) int internalTouchId = -1; foreach (var t in winTouchToInternalId) { - if (t.Value == touch.Id) + if (t.Value == touch) { internalTouchId = t.Key; break; @@ -479,8 +491,9 @@ public virtual bool CancelPointer(Pointer pointer, bool shouldReturn) } if (internalTouchId > -1) { - cancelPointer(touch.Id); - if (shouldReturn) winTouchToInternalId[internalTouchId] = internalReturnTouchPointer(touch, touch.Position).Id; + cancelPointer(touch); + winTouchToInternalId.Remove(internalTouchId); + if (shouldReturn) winTouchToInternalId[internalTouchId] = internalReturnTouchPointer(touch); return true; } return false; @@ -490,6 +503,7 @@ public virtual bool CancelPointer(Pointer pointer, bool shouldReturn) public virtual void Dispose() { foreach (var i in winTouchToInternalId) cancelPointer(i.Value); + winTouchToInternalId.Clear(); enablePressAndHold(); unregisterWindowProc(); @@ -511,21 +525,22 @@ public virtual void INTERNAL_DiscardPointer(Pointer pointer) #region Protected methods - protected Pointer internalAddTouchPointer(Vector2 position, uint flags = 0) + protected TouchPointer internalAddTouchPointer(Vector2 position, uint flags = 0) { var pointer = touchPool.Get(); - addPointer(pointer, position, true); - pressPointer(pointer.Id); + pointer.Position = remapCoordinates(position); + addPointer(pointer); + pressPointer(pointer); pointer.Flags |= flags; return pointer; } - private TouchPointer internalReturnTouchPointer(TouchPointer pointer, Vector2 position) + private TouchPointer internalReturnTouchPointer(TouchPointer pointer) { var newPointer = touchPool.Get(); newPointer.CopyFrom(pointer); - addPointer(newPointer, position, false); - pressPointer(newPointer.Id); + addPointer(newPointer); + pressPointer(newPointer); return newPointer; } @@ -578,13 +593,19 @@ protected void initScaling() int width, height; getNativeMonitorResolution(out width, out height); - float scale = Mathf.Max(Screen.width / ((float) width), Screen.height / ((float) height)); - offsetX = (width - Screen.width / scale) * .5f; - offsetY = (height - Screen.height / scale) * .5f; + float scale = Mathf.Max(Screen.width/((float) width), Screen.height/((float) height)); + offsetX = (width - Screen.width/scale)*.5f; + offsetY = (height - Screen.height/scale)*.5f; scaleX = scale; scaleY = scale; } + protected Vector2 remapCoordinates(Vector2 position) + { + if (CoordinatesRemapper != null) return CoordinatesRemapper.Remap(position); + return position; + } + #endregion #region Private functions @@ -785,7 +806,7 @@ public static IntPtr SetWindowLongPtr(IntPtr hWnd, int nIndex, IntPtr dwNewLong) [DllImport("user32.dll")] public static extern IntPtr CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, uint msg, IntPtr wParam, - IntPtr lParam); + IntPtr lParam); [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] @@ -798,7 +819,7 @@ public static extern IntPtr CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, ui [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool GetTouchInputInfo(IntPtr hTouchInput, int cInputs, [Out] TOUCHINPUT[] pInputs, - int cbSize); + int cbSize); [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs index 5fdc9b16c..8f88795cf 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs @@ -11,24 +11,14 @@ namespace TouchScript.InputSources #region Consts - public delegate void AddPointerDelegate(Pointer pointer, Vector2 position, bool remap = true); - - public delegate void MovePointerDelegate(int id, Vector2 position); - - public delegate void PressPointerDelegate(int id); - - public delegate void ReleasePointerDelegate(int id); - - public delegate void RemovePointerDelegate(int id); - - public delegate void CancelPointerDelegate(int id); + public delegate void PointerDelegate(Pointer pointer); #endregion /// /// Base class for all pointer input sources. /// - public abstract class InputSource : MonoBehaviour, IInputSource, IRemapableInputSource + public abstract class InputSource : MonoBehaviour, IInputSource { #region Public properties @@ -39,7 +29,12 @@ public abstract class InputSource : MonoBehaviour, IInputSource, IRemapableInput public ICoordinatesRemapper CoordinatesRemapper { get { return coordinatesRemapper; } - set { coordinatesRemapper = value; } + set + { + if (coordinatesRemapper == value) return; + coordinatesRemapper = value; + updateCoordinatesRemapper(value); + } } #endregion @@ -102,10 +97,9 @@ protected virtual void OnDisable() #region Protected methods - protected virtual void addPointer(Pointer pointer, Vector2 position, bool remap = true) + protected virtual void addPointer(Pointer pointer) { - if (coordinatesRemapper != null && remap) position = coordinatesRemapper.Remap(position); - manager.INTERNAL_AddPointer(pointer, position); + manager.INTERNAL_AddPointer(pointer); } /// @@ -113,10 +107,10 @@ protected virtual void addPointer(Pointer pointer, Vector2 position, bool remap /// /// Pointer id. /// Screen position. - protected virtual void movePointer(int id, Vector2 position) + protected virtual void updatePointer(Pointer pointer) { - if (coordinatesRemapper != null) position = coordinatesRemapper.Remap(position); - manager.INTERNAL_MovePointer(id, position); + if (pointer == null) return; + manager.INTERNAL_UpdatePointer(pointer.Id); } /// @@ -124,32 +118,47 @@ protected virtual void movePointer(int id, Vector2 position) /// /// Screen position. /// New pointer. - protected virtual void pressPointer(int id) + protected virtual void pressPointer(Pointer pointer) { - manager.INTERNAL_PressPointer(id); + if (pointer == null) return; + manager.INTERNAL_PressPointer(pointer.Id); } /// /// End pointer with id. /// /// Pointer id. - protected virtual void releasePointer(int id) + protected virtual void releasePointer(Pointer pointer) { - manager.INTERNAL_ReleasePointer(id); + if (pointer == null) return; + pointer.Flags = pointer.Flags & ~Pointer.FLAG_INCONTACT; + manager.INTERNAL_ReleasePointer(pointer.Id); } - protected virtual void removePointer(int id) + protected virtual void removePointer(Pointer pointer) { - manager.INTERNAL_RemovePointer(id); + if (pointer == null) return; + manager.INTERNAL_RemovePointer(pointer.Id); } /// /// Cancel pointer with id. /// /// Pointer id. - protected virtual void cancelPointer(int id) + protected virtual void cancelPointer(Pointer pointer) + { + if (pointer == null) return; + manager.INTERNAL_CancelPointer(pointer.Id); + } + + protected virtual void updateCoordinatesRemapper(ICoordinatesRemapper remapper) + { + } + + protected virtual Vector2 remapCoordinates(Vector2 position) { - manager.INTERNAL_CancelPointer(id); + if (coordinatesRemapper != null) return coordinatesRemapper.Remap(position); + return position; } #endregion diff --git a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs index 357dcdf4a..38f088ee8 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs @@ -302,6 +302,7 @@ protected override void OnEnable() enableTouch(); #endif #endif + if (CoordinatesRemapper != null) updateCoordinatesRemapper(CoordinatesRemapper); } /// @@ -319,11 +320,26 @@ protected override void OnDisable() #endregion + #region Protected methods + + protected override void updateCoordinatesRemapper(ICoordinatesRemapper remapper) + { + base.updateCoordinatesRemapper(remapper); + if (mouseHandler != null) mouseHandler.CoordinatesRemapper = remapper; + if (touchHandler != null) touchHandler.CoordinatesRemapper = remapper; +#if UNITY_STANDALONE_WIN && !UNITY_EDITOR + if (windows7PointerHandler != null) windows7PointerHandler.CoordinatesRemapper = remapper; + if (windows8PointerHandler != null) windows8PointerHandler.CoordinatesRemapper = remapper; +#endif + } + + #endregion + #region Private functions private void enableMouse() { - mouseHandler = new MouseHandler(addPointer, movePointer, pressPointer, releasePointer, removePointer, cancelPointer); + mouseHandler = new MouseHandler(addPointer, updatePointer, pressPointer, releasePointer, removePointer, cancelPointer); mouseHandler.EmulateSecondMousePointer = emulateSecondMousePointer; Debug.Log("[TouchScript] Initialized Unity mouse input."); } @@ -339,7 +355,7 @@ private void disableMouse() private void enableTouch() { - touchHandler = new TouchHandler(addPointer, movePointer, pressPointer, releasePointer, removePointer, cancelPointer); + touchHandler = new TouchHandler(addPointer, updatePointer, pressPointer, releasePointer, removePointer, cancelPointer); Debug.Log("[TouchScript] Initialized Unity touch input."); } @@ -355,7 +371,7 @@ private void disableTouch() #if UNITY_STANDALONE_WIN && !UNITY_EDITOR private void enableWindows7Touch() { - windows7PointerHandler = new Windows7PointerHandler(addPointer, movePointer, pressPointer, releasePointer, removePointer, cancelPointer); + windows7PointerHandler = new Windows7PointerHandler(addPointer, updatePointer, pressPointer, releasePointer, removePointer, cancelPointer); Debug.Log("[TouchScript] Initialized Windows 7 pointer input."); } @@ -370,7 +386,7 @@ private void disableWindows7Touch() private void enableWindows8Touch() { - windows8PointerHandler = new Windows8PointerHandler(addPointer, movePointer, pressPointer, releasePointer, removePointer, cancelPointer); + windows8PointerHandler = new Windows8PointerHandler(addPointer, updatePointer, pressPointer, releasePointer, removePointer, cancelPointer); windows8PointerHandler.MouseInPointer = windows8Mouse; Debug.Log("[TouchScript] Initialized Windows 8 pointer input."); } @@ -385,6 +401,6 @@ private void disableWindows8Touch() } #endif - #endregion +#endregion } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Pointers/MousePointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/MousePointer.cs index 95cc91de5..3f2f4fdc1 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/MousePointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/MousePointer.cs @@ -18,5 +18,14 @@ public MousePointer(IInputSource input) : base(input) #endregion + #region Internal functions + + //internal override void INTERNAL_Reset() + //{ + // base.INTERNAL_Reset(); + //} + + #endregion + } } diff --git a/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs index eaaf12be1..9d2ec8fe0 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs @@ -44,5 +44,18 @@ public override void CopyFrom(Pointer target) } #endregion + + #region Internal functions + + internal override void INTERNAL_Reset() + { + base.INTERNAL_Reset(); + ObjectId = 0; + Width = 0; + Height = 0; + Angle = 0; + } + + #endregion } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Pointers/PenPointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/PenPointer.cs index 87c978fac..cc19042b3 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/PenPointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/PenPointer.cs @@ -18,5 +18,14 @@ public PenPointer(IInputSource input) : base(input) #endregion + #region Internal functions + + //internal override void INTERNAL_Reset() + //{ + // base.INTERNAL_Reset(); + //} + + #endregion + } } diff --git a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs index 4c61a0541..5bf01f0ea 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs @@ -2,7 +2,6 @@ * @author Valentin Simonov / http://va.lent.in/ */ -using System; using TouchScript.Hit; using TouchScript.InputSources; using TouchScript.Layers; @@ -77,7 +76,13 @@ public enum PointerType public PointerType Type { get; protected set; } - public uint Flags { get; internal set; } + public uint Flags + { + get { return flags; } + set { newFlags = value; } + } + + public uint PreviousFlags { get; internal set; } /// /// Original hit target. @@ -90,6 +95,7 @@ public enum PointerType public Vector2 Position { get { return position; } + set { newPosition = value; } } /// @@ -129,8 +135,8 @@ public ProjectionParams ProjectionParams #region Private variables private int refCount = 0; - private Vector2 position = Vector2.zero; - private Vector2 newPosition = Vector2.zero; + private Vector2 position, newPosition; + private uint flags, newFlags; #endregion @@ -139,10 +145,12 @@ public ProjectionParams ProjectionParams public virtual void CopyFrom(Pointer target) { Type = target.Type; - Flags = target.Flags; + flags = target.flags; + newFlags = target.newFlags; + PreviousFlags = target.PreviousFlags; position = target.position; - PreviousPosition = target.PreviousPosition; newPosition = target.newPosition; + PreviousPosition = target.PreviousPosition; } /// @@ -184,31 +192,27 @@ public Pointer(IInputSource input) #region Internal methods - internal void INTERNAL_Init(int id, Vector2 position) + internal virtual void INTERNAL_Init(int id) { Id = id; - this.position = PreviousPosition = newPosition = position; + PreviousPosition = position = newPosition; + PreviousFlags = flags = newFlags; } - internal void INTERNAL_Reset() + internal virtual void INTERNAL_Reset() { Id = INVALID_POINTER; - refCount = 0; - Hit = default(TouchHit); - Target = null; - Layer = null; - Flags = 0; + INTERNAL_ClearTargetData(); + position = newPosition = PreviousPosition = Vector2.zero; + flags = newFlags = PreviousFlags = 0; } - internal void INTERNAL_ResetPosition() + internal virtual void INTERNAL_FrameStarted() { PreviousPosition = position; position = newPosition; - } - - internal void INTERNAL_SetPosition(Vector2 value) - { - newPosition = value; + PreviousFlags = flags; + flags = newFlags; } internal void INTERNAL_Retain() @@ -221,8 +225,11 @@ internal int INTERNAL_Release() return --refCount; } - internal void INTERNAL_ClearRefCount() + internal void INTERNAL_ClearTargetData() { + Hit = default(TouchHit); + Target = null; + Layer = null; refCount = 0; } diff --git a/Source/Assets/TouchScript/Scripts/Pointers/TouchPointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/TouchPointer.cs index eb26c90ec..8b42b47f8 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/TouchPointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/TouchPointer.cs @@ -18,5 +18,14 @@ public TouchPointer(IInputSource input) : base(input) #endregion + #region Internal functions + + //internal override void INTERNAL_Reset() + //{ + // base.INTERNAL_Reset(); + //} + + #endregion + } } diff --git a/Source/Assets/TouchScript/Scripts/TouchManager.cs b/Source/Assets/TouchScript/Scripts/TouchManager.cs index 15d563237..e51d1474c 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManager.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManager.cs @@ -64,7 +64,7 @@ public enum MessageType /// /// Some pointers have moved during the frame. /// - PointersMoved = 1 << 3, + PointersUpdated = 1 << 3, /// /// Some pointers have touched the surface during the frame. @@ -108,9 +108,9 @@ public enum MessageName OnPointersAdded = MessageType.PointersAdded, /// - /// Some pointers have moved during the frame. + /// Some pointers have updated during the frame. /// - OnPointersMoved = MessageType.PointersMoved, + OnPointersUpdated = MessageType.PointersUpdated, /// /// Some pointers have touched the surface during the frame. @@ -291,7 +291,7 @@ public static bool IsInvalidPosition(Vector2 position) [SerializeField] private MessageType sendMessageEvents = MessageType.PointersPressed | MessageType.PointersCancelled | - MessageType.PointersReleased | MessageType.PointersMoved; + MessageType.PointersReleased | MessageType.PointersUpdated; [SerializeField] private GameObject sendMessageTarget; @@ -344,7 +344,7 @@ private void updateSubscription() if ((SendMessageEvents & MessageType.FrameStarted) != 0) Instance.FrameStarted += frameStartedHandler; if ((SendMessageEvents & MessageType.FrameFinished) != 0) Instance.FrameFinished += frameFinishedHandler; if ((SendMessageEvents & MessageType.PointersAdded) != 0) Instance.PointersAdded += pointersAddedHandler; - if ((SendMessageEvents & MessageType.PointersMoved) != 0) Instance.PointersMoved += pointersMovedHandler; + if ((SendMessageEvents & MessageType.PointersUpdated) != 0) Instance.PointersUpdated += PointersUpdatedHandler; if ((SendMessageEvents & MessageType.PointersPressed) != 0) Instance.PointersPressed += pointersPressedHandler; if ((SendMessageEvents & MessageType.PointersReleased) != 0) Instance.PointersReleased += pointersReleasedHandler; if ((SendMessageEvents & MessageType.PointersRemoved) != 0) Instance.PointersRemoved += pointersRemovedHandler; @@ -359,7 +359,7 @@ private void removeSubscriptions() Instance.FrameStarted -= frameStartedHandler; Instance.FrameFinished -= frameFinishedHandler; Instance.PointersAdded -= pointersAddedHandler; - Instance.PointersMoved -= pointersMovedHandler; + Instance.PointersUpdated -= PointersUpdatedHandler; Instance.PointersPressed -= pointersPressedHandler; Instance.PointersReleased -= pointersReleasedHandler; Instance.PointersRemoved -= pointersRemovedHandler; @@ -372,9 +372,9 @@ private void pointersAddedHandler(object sender, PointerEventArgs e) SendMessageOptions.DontRequireReceiver); } - private void pointersMovedHandler(object sender, PointerEventArgs e) + private void PointersUpdatedHandler(object sender, PointerEventArgs e) { - sendMessageTarget.SendMessage(MessageName.OnPointersMoved.ToString(), e.Pointers, + sendMessageTarget.SendMessage(MessageName.OnPointersUpdated.ToString(), e.Pointers, SendMessageOptions.DontRequireReceiver); } diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs index 6b282c4dd..9f22f4a71 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs @@ -47,10 +47,10 @@ public event EventHandler PointersAdded } /// - public event EventHandler PointersMoved + public event EventHandler PointersUpdated { - add { pointersMovedInvoker += value; } - remove { pointersMovedInvoker -= value; } + add { pointersUpdatedInvoker += value; } + remove { pointersUpdatedInvoker -= value; } } /// @@ -82,7 +82,7 @@ public event EventHandler PointersCancelled } // Needed to overcome iOS AOT limitations - private EventHandler pointersAddedInvoker, pointersMovedInvoker, pointersPressedInvoker, pointersReleasedInvoker, pointersRemovedInvoker, pointersCancelledInvoker; + private EventHandler pointersAddedInvoker, pointersUpdatedInvoker, pointersPressedInvoker, pointersReleasedInvoker, pointersRemovedInvoker, pointersCancelledInvoker; private EventHandler frameStartedInvoker, frameFinishedInvoker; @@ -376,16 +376,16 @@ public void CancelPointer(int id) #region Internal methods - internal void INTERNAL_AddPointer(Pointer pointer, Vector2 position) + internal void INTERNAL_AddPointer(Pointer pointer) { lock (pointerLock) { - pointer.INTERNAL_Init(nextPointerId++, position); + pointer.INTERNAL_Init(nextPointerId++); pointersAdded.Add(pointer); } } - internal void INTERNAL_MovePointer(int id, Vector2 position) + internal void INTERNAL_UpdatePointer(int id) { lock (pointerLock) { @@ -398,14 +398,12 @@ internal void INTERNAL_MovePointer(int id, Vector2 position) if (pointer == null) { #if TOUCHSCRIPT_DEBUG - Debug.LogWarning("TouchScript > Pointer with id [" + id + "] is requested to MOVE to " + position + - " but no pointer with such id found."); + Debug.LogWarning("TouchScript > Pointer with id [" + id + "] is requested to MOVE to but no pointer with such id found."); #endif return; } } - pointer.INTERNAL_SetPosition(position); if (!pointersUpdated.Contains(id)) pointersUpdated.Add(id); } } @@ -464,7 +462,6 @@ internal void INTERNAL_ReleasePointer(int id) Debug.LogWarning("TouchScript > Pointer with id [" + id + "] is requested to END more than once this frame."); #endif - pointer.INTERNAL_ClearRefCount(); } } @@ -670,12 +667,6 @@ private void updateUpdated(List pointers) { var updatedCount = pointers.Count; var list = pointerListPool.Get(); - // Need to loop through all pointers to reset those which did not move - var count = this.pointers.Count; - for (var i = 0; i < count; i++) - { - this.pointers[i].INTERNAL_ResetPosition(); - } for (var i = 0; i < updatedCount; i++) { var id = pointers[i]; @@ -696,8 +687,8 @@ private void updateUpdated(List pointers) #endif } - if (pointersMovedInvoker != null) - pointersMovedInvoker.InvokeHandleExceptions(this, PointerEventArgs.GetCachedEventArgs(list)); + if (pointersUpdatedInvoker != null) + pointersUpdatedInvoker.InvokeHandleExceptions(this, PointerEventArgs.GetCachedEventArgs(list)); pointerListPool.Release(list); } @@ -754,7 +745,6 @@ private void updateReleased(List pointers) list.Add(pointer); pressedPointers.Remove(pointer); if (pointer.Layer != null) pointer.Layer.INTERNAL_ReleasePointer(pointer); - pointer.Layer = null; #if TOUCHSCRIPT_DEBUG addDebugFigureForPointer(pointer); @@ -763,6 +753,13 @@ private void updateReleased(List pointers) if (pointersReleasedInvoker != null) pointersReleasedInvoker.InvokeHandleExceptions(this, PointerEventArgs.GetCachedEventArgs(list)); + + releasedCount = list.Count; + for (var i = 0; i < releasedCount; i++) + { + var pointer = list[i]; + pointer.INTERNAL_ClearTargetData(); + } pointerListPool.Release(list); } @@ -794,6 +791,7 @@ private void updateRemoved(List pointers) if (pointersRemovedInvoker != null) pointersRemovedInvoker.InvokeHandleExceptions(this, PointerEventArgs.GetCachedEventArgs(list)); + removedCount = list.Count; for (var i = 0; i < removedCount; i++) { var pointer = list[i]; @@ -896,6 +894,14 @@ private void updatePointers() updateAdded(addedList); pointerListPool.Release(addedList); } + + // Need to loop through all pointers to update position/previousPosition. + var count = pointers.Count; + for (var i = 0; i < count; i++) + { + pointers[i].INTERNAL_FrameStarted(); + } + if (updatedList != null) { updateUpdated(updatedList); From 67a3e67db5c51679dd7c333a683c7139ba6949c1 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 10 Jul 2016 19:14:57 +0300 Subject: [PATCH 047/211] Added @author comment to example files. --- .../TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs | 6 +++++- Source/Assets/TouchScript/Examples/Cube/Scripts/Init.cs | 6 +++++- .../TouchScript/Examples/Cube/Scripts/LayerDelegate.cs | 6 +++++- .../TouchScript/Examples/Cube/Scripts/RedirectInput.cs | 6 +++++- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs index 41ba4fef6..8b62e7f8e 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs @@ -1,4 +1,8 @@ -using TouchScript.Pointers; +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using TouchScript.Pointers; namespace TouchScript.Examples.Cube { diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/Init.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/Init.cs index cc5b4d5b3..5ca85f0be 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/Init.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/Init.cs @@ -1,4 +1,8 @@ -using UnityEngine; +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using UnityEngine; using TouchScript.Layers; namespace TouchScript.Examples.Cube diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/LayerDelegate.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/LayerDelegate.cs index 552448fa8..56db76fa0 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/LayerDelegate.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/LayerDelegate.cs @@ -1,4 +1,8 @@ -using UnityEngine; +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using UnityEngine; using TouchScript.Layers; using TouchScript.Pointers; diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs index 0c7a907fe..9aac7aeb7 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs @@ -1,4 +1,8 @@ -using UnityEngine; +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using UnityEngine; using System.Collections.Generic; using TouchScript.Gestures; using TouchScript.Hit; From 5de6181bb2ae481d5c79ddbcc9ea82c331d8a727 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 10 Jul 2016 20:16:22 +0300 Subject: [PATCH 048/211] Updated some docs. --- .../Camera/Scripts/CameraController.cs | 3 + .../Examples/_misc/Scripts/Checker.cs | 9 +++ .../Examples/_misc/Scripts/KillMe.cs | 3 + .../Examples/_misc/Scripts/Runner.cs | 3 + .../TUIO/Scripts/InputSources/TuioInput.cs | 2 +- .../Behaviors/Visualizer/PointerProxy.cs | 2 +- .../Behaviors/Visualizer/PointerVisualizer.cs | 2 +- .../TouchScript/Scripts/ITouchManager.cs | 17 +++-- .../Scripts/InputSources/IInputSource.cs | 7 +- .../InputHandlers/MouseHandler.cs | 22 ++++-- .../InputHandlers/TouchHandler.cs | 16 +++-- .../InputHandlers/WindowsPointerHandlers.cs | 69 ++++++++++--------- .../Scripts/InputSources/InputSource.cs | 48 +++++++++---- .../Scripts/InputSources/StandardInput.cs | 1 + .../Scripts/Pointers/MousePointer.cs | 7 ++ .../Scripts/Pointers/ObjectPointer.cs | 21 ++++++ .../Scripts/Pointers/PenPointer.cs | 7 ++ .../TouchScript/Scripts/Pointers/Pointer.cs | 41 +++++++++-- .../Scripts/Pointers/PointerFactory.cs | 9 +++ .../Scripts/Pointers/TouchPointer.cs | 6 ++ .../TouchScript/Scripts/TouchManager.cs | 11 +-- 21 files changed, 223 insertions(+), 83 deletions(-) diff --git a/Source/Assets/TouchScript/Examples/Camera/Scripts/CameraController.cs b/Source/Assets/TouchScript/Examples/Camera/Scripts/CameraController.cs index 2e4b91aea..b7e234319 100644 --- a/Source/Assets/TouchScript/Examples/Camera/Scripts/CameraController.cs +++ b/Source/Assets/TouchScript/Examples/Camera/Scripts/CameraController.cs @@ -7,6 +7,9 @@ namespace TouchScript.Examples.CameraControl { + /// + /// This component controls camera movement. + /// public class CameraController : MonoBehaviour { public ScreenTransformGesture TwoFingerMoveGesture; diff --git a/Source/Assets/TouchScript/Examples/_misc/Scripts/Checker.cs b/Source/Assets/TouchScript/Examples/_misc/Scripts/Checker.cs index 11c7cdf92..8d309dc8a 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Scripts/Checker.cs +++ b/Source/Assets/TouchScript/Examples/_misc/Scripts/Checker.cs @@ -9,6 +9,9 @@ namespace TouchScript.Examples { + /// + /// This component controlls the movement of a Checker on the Board. + /// public class Checker : MonoBehaviour { private TransformGesture gesture; @@ -17,24 +20,30 @@ public class Checker : MonoBehaviour private void OnEnable() { + // The gesture gesture = GetComponent(); + // Transformer component actually MOVES the object transformer = GetComponent(); rb = GetComponent(); transformer.enabled = false; rb.isKinematic = false; + + // Subscribe to gesture events gesture.TransformStarted += transformStartedHandler; gesture.TransformCompleted += transformCompletedHandler; } private void OnDisable() { + // Unsubscribe from gesture events gesture.TransformStarted -= transformStartedHandler; gesture.TransformCompleted -= transformCompletedHandler; } private void transformStartedHandler(object sender, EventArgs e) { + // When movement starts we need to tell physics that now WE are moving this object manually rb.isKinematic = true; transformer.enabled = true; } diff --git a/Source/Assets/TouchScript/Examples/_misc/Scripts/KillMe.cs b/Source/Assets/TouchScript/Examples/_misc/Scripts/KillMe.cs index e88357af7..3f3754f17 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Scripts/KillMe.cs +++ b/Source/Assets/TouchScript/Examples/_misc/Scripts/KillMe.cs @@ -7,6 +7,9 @@ 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 b474f7084..7bd3c99cf 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs +++ b/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs @@ -10,6 +10,9 @@ 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/Modules/TUIO/Scripts/InputSources/TuioInput.cs b/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs index 848601efa..3716bdc27 100644 --- a/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs +++ b/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs @@ -108,7 +108,6 @@ public InputType SupportedInputs public TuioInput() { touchPool = new ObjectPool(20, () => new TouchPointer(this), null, (t) => t.INTERNAL_Reset()); - touchPool.Name = "TUIO"; objectPool = new ObjectPool(10, () => new ObjectPointer(this), null, (t) => t.INTERNAL_Reset()); } @@ -211,6 +210,7 @@ public override bool CancelPointer(Pointer pointer, bool shouldReturn) #region Internal methods + /// public override void INTERNAL_DiscardPointer(Pointer pointer) { if (pointer.Type == Pointer.PointerType.Touch) diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs index 5511818cd..fb769f058 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerProxy.cs @@ -12,7 +12,7 @@ namespace TouchScript.Behaviors.Visualizer /// /// Visual cursor implementation used by TouchScript. /// - [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Behaviors_TouchProxy.htm")] + [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Behaviors_Visualizer_TouchProxy.htm")] public class PointerProxy : PointerProxyBase { /// diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs index 1e1680eea..b1cc12fc2 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs @@ -13,7 +13,7 @@ namespace TouchScript.Behaviors.Visualizer /// 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_TouchVisualizer.htm")] + [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Behaviors_Visualizer_TouchVisualizer.htm")] public class PointerVisualizer : MonoBehaviour { #region Public properties diff --git a/Source/Assets/TouchScript/Scripts/ITouchManager.cs b/Source/Assets/TouchScript/Scripts/ITouchManager.cs index 3c4b37aec..20f1825c2 100644 --- a/Source/Assets/TouchScript/Scripts/ITouchManager.cs +++ b/Source/Assets/TouchScript/Scripts/ITouchManager.cs @@ -20,9 +20,11 @@ namespace TouchScript /// Every frame pointer events are dispatched in this order: /// /// FrameStarted - /// PointersPressed + /// PointersAdded /// PointersUpdated + /// PointersPressed /// PointersReleased + /// PointersRemoved /// PointersCancelled /// FrameFinished /// @@ -125,18 +127,25 @@ public interface ITouchManager float DotsPerCentimeter { get; } /// - /// Gets number of active pointers. + /// Gets number of pointers in the system. /// int PointersCount { get; } + /// + /// Gets the number of pressed pointer in the system. + /// int PressedPointersCount { get; } /// - /// Gets the list of active pointers. + /// Gets the list of pointers. /// - /// An unsorted list of all pointers which began but have not ended yet. + /// An unsorted list of all pointers. IList Pointers { get; } + /// + /// Gets the list of pressed pointers. + /// + /// An unsorted list of all pointers which were pressed but not released yet. IList PressedPointers { get; } /// diff --git a/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs b/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs index 734c9685b..6984bb2c5 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/IInputSource.cs @@ -31,13 +31,18 @@ public interface IInputSource : INTERNAL_IInputSource /// Cancels the pointer. /// /// The pointer. - /// if set to true returns the pointer back to the system with different id. + /// if set to true returns the pointer back to the system with different id. /// True if the pointer belongs to this Input and was successfully cancelled; false otherwise. bool CancelPointer(Pointer pointer, bool shouldReturn); } public interface INTERNAL_IInputSource { + /// + /// Used by to return a pointer to input source. + /// DO NOT CALL IT DIRECTLY FROM YOUR CODE! + /// + /// The pointer. void INTERNAL_DiscardPointer(Pointer pointer); } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs index 58245a3d3..407ea19e1 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs @@ -16,8 +16,15 @@ public class MouseHandler : IInputSource, IDisposable { #region Public properties + /// public ICoordinatesRemapper CoordinatesRemapper { get; set; } + /// + /// Gets or sets a value indicating whether second pointer emulation using ALT+CLICK should be enabled. + /// + /// + /// true if second pointer emulation is enabled; otherwise, false. + /// public bool EmulateSecondMousePointer { get { return emulateSecondMousePointer; } @@ -50,10 +57,12 @@ public bool EmulateSecondMousePointer /// /// Initializes a new instance of the class. /// - /// A function called when a new pointer is detected. As this function must accept a Vector2 position of the new pointer and return an instance of . - /// A function called when a pointer is moved. As this function must accept an int id and a Vector2 position. - /// A function called when a pointer is lifted off. As this function must accept an int id. - /// A function called when a pointer is cancelled. As this function must accept an int id. + /// A function called when a new pointer is detected. + /// A function called when a pointer is moved or its parameter is updated. + /// A function called when a pointer touches the surface. + /// A function called when a pointer is lifted off. + /// A function called when a pointer is removed. + /// A function called when a pointer is cancelled. public MouseHandler(PointerDelegate addPointer, PointerDelegate updatePointer, PointerDelegate pressPointer, PointerDelegate releasePointer, PointerDelegate removePointer, PointerDelegate cancelPointer) { this.addPointer = addPointer; @@ -71,9 +80,7 @@ public MouseHandler(PointerDelegate addPointer, PointerDelegate updatePointer, P #region Public methods - /// - /// Updates this instance. - /// + /// public void UpdateInput() { if (fakeMousePointer != null @@ -180,6 +187,7 @@ public void Dispose() #region Internal methods + /// public void INTERNAL_DiscardPointer(Pointer pointer) { var p = pointer as MousePointer; diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs index ff4978a21..8d77b0174 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs @@ -18,6 +18,7 @@ public class TouchHandler : IInputSource, IDisposable { #region Public properties + /// public ICoordinatesRemapper CoordinatesRemapper { get; set; } /// @@ -50,10 +51,12 @@ public bool HasPointers /// /// Initializes a new instance of the class. /// - /// A function called when a new pointer is detected. As this function must accept a Vector2 position of the new pointer and return an instance of . - /// A function called when a pointer is moved. As this function must accept an int id and a Vector2 position. - /// A function called when a pointer is lifted off. As this function must accept an int id. - /// A function called when a pointer is cancelled. As this function must accept an int id. + /// A function called when a new pointer is detected. + /// A function called when a pointer is moved or its parameter is updated. + /// A function called when a pointer touches the surface. + /// A function called when a pointer is lifted off. + /// A function called when a pointer is removed. + /// A function called when a pointer is cancelled. public TouchHandler(PointerDelegate addPointer, PointerDelegate updatePointer, PointerDelegate pressPointer, PointerDelegate releasePointer, PointerDelegate removePointer, PointerDelegate cancelPointer) { this.addPointer = addPointer; @@ -69,9 +72,7 @@ public TouchHandler(PointerDelegate addPointer, PointerDelegate updatePointer, P #region Public methods - /// - /// Updates this instance. - /// + /// public void UpdateInput() { for (var i = 0; i < Input.touchCount; ++i) @@ -185,6 +186,7 @@ public void Dispose() #region Internal methods + /// public void INTERNAL_DiscardPointer(Pointer pointer) { var p = pointer as TouchPointer; diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs index 2483c28e3..d34b79fcf 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs @@ -21,7 +21,7 @@ namespace TouchScript.InputSources.InputHandlers /// public class Windows8PointerHandler : WindowsPointerHandler { - #region Public properties +#region Public properties public bool MouseInPointer { @@ -45,9 +45,9 @@ public bool MouseInPointer } } - #endregion +#endregion - #region Private variables +#region Private variables private bool mouseInPointer = true; private ObjectPool mousePool; @@ -55,9 +55,9 @@ public bool MouseInPointer private MousePointer mousePointer; private PenPointer penPointer; - #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) @@ -70,9 +70,9 @@ public Windows8PointerHandler(PointerDelegate addPointer, PointerDelegate update registerWindowProc(wndProcWin8); } - #endregion +#endregion - #region Public methods +#region Public methods /// public override bool CancelPointer(Pointer pointer, bool shouldReturn) @@ -113,10 +113,11 @@ public override void Dispose() base.Dispose(); } - #endregion +#endregion - #region Internal methods +#region Internal methods + /// public override void INTERNAL_DiscardPointer(Pointer pointer) { if (pointer is MousePointer) mousePool.Release(pointer as MousePointer); @@ -124,7 +125,7 @@ public override void INTERNAL_DiscardPointer(Pointer pointer) else base.INTERNAL_DiscardPointer(pointer); } - #endregion +#endregion private IntPtr wndProcWin8(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam) { @@ -391,7 +392,7 @@ private void decodeWin7Touches(IntPtr wParam, IntPtr lParam) public abstract class WindowsPointerHandler : IInputSource, IDisposable { - #region Consts +#region Consts /// /// Source of pointer input. @@ -410,15 +411,16 @@ public enum PointerSource public delegate IntPtr WndProcDelegate(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam); - #endregion +#endregion - #region Public properties +#region Public properties + /// public ICoordinatesRemapper CoordinatesRemapper { get; set; } - #endregion +#endregion - #region Protected variables +#region Protected variables protected PointerDelegate addPointer; protected PointerDelegate updatePointer; @@ -438,17 +440,19 @@ public enum PointerSource protected ObjectPool touchPool; - #endregion +#endregion - #region Constructor +#region Constructor /// /// Initializes a new instance of the class. /// - /// A function called when a new pointer is detected. As this function must accept a Vector2 position of the new pointer and return an instance of . - /// A function called when a pointer is moved. As this function must accept an int id and a Vector2 position. - /// A function called when a pointer is lifted off. As this function must accept an int id. - /// A function called when a pointer is cancelled. As this function must accept an int id. + /// A function called when a new pointer is detected. + /// A function called when a pointer is moved or its parameter is updated. + /// A function called when a pointer touches the surface. + /// A function called when a pointer is lifted off. + /// A function called when a pointer is removed. + /// A function called when a pointer is cancelled. public WindowsPointerHandler(PointerDelegate addPointer, PointerDelegate updatePointer, PointerDelegate pressPointer, PointerDelegate releasePointer, PointerDelegate removePointer, PointerDelegate cancelPointer) { this.addPointer = addPointer; @@ -465,9 +469,9 @@ public WindowsPointerHandler(PointerDelegate addPointer, PointerDelegate updateP initScaling(); } - #endregion +#endregion - #region Public methods +#region Public methods /// public void UpdateInput() @@ -509,10 +513,11 @@ public virtual void Dispose() unregisterWindowProc(); } - #endregion +#endregion - #region Internal methods +#region Internal methods + /// public virtual void INTERNAL_DiscardPointer(Pointer pointer) { var p = pointer as TouchPointer; @@ -521,9 +526,9 @@ public virtual void INTERNAL_DiscardPointer(Pointer pointer) touchPool.Release(p); } - #endregion +#endregion - #region Protected methods +#region Protected methods protected TouchPointer internalAddTouchPointer(Vector2 position, uint flags = 0) { @@ -606,9 +611,9 @@ protected Vector2 remapCoordinates(Vector2 position) return position; } - #endregion +#endregion - #region Private functions +#region Private functions private void getNativeMonitorResolution(out int width, out int height) { @@ -627,9 +632,9 @@ private void getNativeMonitorResolution(out int width, out int height) } } - #endregion +#endregion - #region p/invoke +#region p/invoke public const int WM_CLOSE = 0x0010; public const int WM_TOUCH = 0x0240; @@ -850,7 +855,7 @@ public static extern bool GetTouchInputInfo(IntPtr hTouchInput, int cInputs, [Ou [DllImport("user32.dll")] public static extern IntPtr EnableMouseInPointer(bool value); - #endregion +#endregion } } diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs index 8f88795cf..f73189f99 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs @@ -41,9 +41,7 @@ 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; @@ -53,7 +51,9 @@ public ICoordinatesRemapper CoordinatesRemapper #region Public methods /// - public virtual void UpdateInput() {} + public virtual void UpdateInput() + { + } /// public virtual bool CancelPointer(Pointer pointer, bool shouldReturn) @@ -65,7 +65,10 @@ 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 @@ -97,16 +100,19 @@ protected virtual void OnDisable() #region Protected methods + /// + /// Adds the pointer to the system. + /// + /// The pointer to add. protected virtual void addPointer(Pointer pointer) { manager.INTERNAL_AddPointer(pointer); } /// - /// Mark pointer as moved. + /// Mark pointer as updated. /// - /// Pointer id. - /// Screen position. + /// The pointer to update. protected virtual void updatePointer(Pointer pointer) { if (pointer == null) return; @@ -114,10 +120,9 @@ protected virtual void updatePointer(Pointer pointer) } /// - /// Begin pointer in given screen position. + /// Mark the pointer as touching the surface. /// - /// Screen position. - /// New pointer. + /// The pointer. protected virtual void pressPointer(Pointer pointer) { if (pointer == null) return; @@ -125,9 +130,9 @@ protected virtual void pressPointer(Pointer pointer) } /// - /// End pointer with id. + /// Mark the pointer as no longer touching the surface. /// - /// Pointer id. + /// The pointer. protected virtual void releasePointer(Pointer pointer) { if (pointer == null) return; @@ -135,6 +140,10 @@ protected virtual void releasePointer(Pointer pointer) manager.INTERNAL_ReleasePointer(pointer.Id); } + /// + /// Removes the pointer. + /// + /// The pointer. protected virtual void removePointer(Pointer pointer) { if (pointer == null) return; @@ -142,19 +151,28 @@ protected virtual void removePointer(Pointer pointer) } /// - /// Cancel pointer with id. + /// Cancels the pointer. /// - /// Pointer id. + /// The pointer. protected virtual void cancelPointer(Pointer pointer) { if (pointer == null) return; manager.INTERNAL_CancelPointer(pointer.Id); } + /// + /// Called from setter to update touch handlers with the new value. + /// + /// The new remapper. protected virtual void updateCoordinatesRemapper(ICoordinatesRemapper remapper) { } + /// + /// Remaps the coordinates using the if it is set. + /// + /// The position. + /// Remapped position if is set; otherwise. protected virtual Vector2 remapCoordinates(Vector2 position) { if (coordinatesRemapper != null) return coordinatesRemapper.Remap(position); diff --git a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs index 38f088ee8..03c8db931 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs @@ -322,6 +322,7 @@ protected override void OnDisable() #region Protected methods + /// protected override void updateCoordinatesRemapper(ICoordinatesRemapper remapper) { base.updateCoordinatesRemapper(remapper); diff --git a/Source/Assets/TouchScript/Scripts/Pointers/MousePointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/MousePointer.cs index 3f2f4fdc1..d5438cc42 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/MousePointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/MousePointer.cs @@ -6,11 +6,18 @@ namespace TouchScript.Pointers { + + /// + /// A pointer of type . + /// public class MousePointer : Pointer { #region Constructor + /// + /// Initializes a new instance of the class. + /// public MousePointer(IInputSource input) : base(input) { Type = PointerType.Mouse; diff --git a/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs index 9d2ec8fe0..03cea48f7 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/ObjectPointer.cs @@ -6,22 +6,41 @@ namespace TouchScript.Pointers { + + /// + /// A pointer of type . + /// public class ObjectPointer : Pointer { #region Public properties + /// + /// The Id of the physical object this pointer represents. + /// public int ObjectId { get; internal set; } + /// + /// The Width of the physical object this pointer represents. + /// public float Width { get; internal set; } + /// + /// The height of the physical object this pointer represents. + /// public float Height { get; internal set; } + /// + /// The Rotation of the physical object this pointer represents. + /// public float Angle { get; internal set; } #endregion #region Constructor + /// + /// Initializes a new instance of the class. + /// public ObjectPointer(IInputSource input) : base(input) { Type = PointerType.Object; @@ -31,6 +50,7 @@ public ObjectPointer(IInputSource input) : base(input) #region Public methods + /// public override void CopyFrom(Pointer target) { base.CopyFrom(target); @@ -47,6 +67,7 @@ public override void CopyFrom(Pointer target) #region Internal functions + /// internal override void INTERNAL_Reset() { base.INTERNAL_Reset(); diff --git a/Source/Assets/TouchScript/Scripts/Pointers/PenPointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/PenPointer.cs index cc19042b3..14f8c8718 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/PenPointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/PenPointer.cs @@ -6,11 +6,18 @@ namespace TouchScript.Pointers { + + /// + /// A pointer of type . + /// public class PenPointer : Pointer { #region Constructor + /// + /// Initializes a new instance of the class. + /// public PenPointer(IInputSource input) : base(input) { Type = PointerType.Pen; diff --git a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs index 5bf01f0ea..d31b13b9c 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs @@ -57,11 +57,29 @@ public class Pointer /// public const uint FLAG_INCONTACT = FLAG_FIRST_BUTTON | FLAG_SECOND_BUTTON | FLAG_THIRD_BUTTON; + /// + /// Pointer type. + /// public enum PointerType { + /// + /// Touch. + /// Touch, + + /// + /// Mouse. + /// Mouse, + + /// + /// Pen. + /// Pen, + + /// + /// Object. + /// Object } @@ -74,15 +92,25 @@ public enum PointerType /// public int Id { get; private set; } + /// + /// Pointer type. See . + /// public PointerType Type { get; protected 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 { return flags; } set { newFlags = value; } } - public uint PreviousFlags { get; internal set; } + /// + /// Gets the previous value of . + /// + public uint PreviousFlags { get; private set; } /// /// Original hit target. @@ -90,7 +118,8 @@ public uint Flags public Transform Target { get; internal set; } /// - /// Current position in screen coordinates. + /// 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 { @@ -99,7 +128,7 @@ public Vector2 Position } /// - /// Previous position (during last frame) in screen coordinates. + /// Previous (during last frame) in screen coordinates. /// public Vector2 PreviousPosition { get; private set; } @@ -142,6 +171,10 @@ public ProjectionParams ProjectionParams #region Public methods + /// + /// Copies values from . + /// + /// The target pointer to copy values from. public virtual void CopyFrom(Pointer target) { Type = target.Type; @@ -204,7 +237,7 @@ internal virtual void INTERNAL_Reset() Id = INVALID_POINTER; INTERNAL_ClearTargetData(); position = newPosition = PreviousPosition = Vector2.zero; - flags = newFlags = PreviousFlags = 0; + flags = newFlags = PreviousFlags = 0; } internal virtual void INTERNAL_FrameStarted() diff --git a/Source/Assets/TouchScript/Scripts/Pointers/PointerFactory.cs b/Source/Assets/TouchScript/Scripts/Pointers/PointerFactory.cs index 817311843..e7a500145 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/PointerFactory.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/PointerFactory.cs @@ -6,9 +6,18 @@ namespace TouchScript.Pointers { + /// + /// Static factory to create pointers. + /// public static class PointerFactory { + /// + /// Creates a pointer of type attached to input source. + /// + /// Pointer type to create. + /// Input source to attach the pointer to. + /// public static Pointer Create(Pointer.PointerType type, IInputSource input) { switch (type) diff --git a/Source/Assets/TouchScript/Scripts/Pointers/TouchPointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/TouchPointer.cs index 8b42b47f8..b5e4be8c6 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/TouchPointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/TouchPointer.cs @@ -6,11 +6,17 @@ namespace TouchScript.Pointers { + /// + /// A pointer of type . + /// public class TouchPointer : Pointer { #region Constructor + /// + /// Initializes a new instance of the class. + /// public TouchPointer(IInputSource input) : base(input) { Type = PointerType.Touch; diff --git a/Source/Assets/TouchScript/Scripts/TouchManager.cs b/Source/Assets/TouchScript/Scripts/TouchManager.cs index e51d1474c..798c38716 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManager.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManager.cs @@ -20,15 +20,6 @@ namespace TouchScript /// An instance of may be added to a Unity scene to hold (i.e. serialize them to the scene) parameters needed to configure an instance of used in application. Which can be accessed via static property. /// Though it's not required it is a convenient way to configure TouchScript for your scene. You can use different configuration options for different scenes. /// - /// - /// This sample shows how to get Pointer Manager instance and subscribe to events. - /// - /// TouchManager.Instance.PointersPressed += - /// (sender, args) => { foreach (var pointer in args.Pointers) Debug.Log("Pressed: " + pointer.Id); }; - /// TouchManager.Instance.PointersReleased += - /// (sender, args) => { foreach (var pointer in args.Pointers) Debug.Log("Released: " + pointer.Id); }; - /// - /// [AddComponentMenu("TouchScript/Pointer Manager")] [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_TouchManager.htm")] public sealed class TouchManager : MonoBehaviour @@ -62,7 +53,7 @@ public enum MessageType PointersAdded = 1 << 2, /// - /// Some pointers have moved during the frame. + /// Some pointers were updated during the frame. /// PointersUpdated = 1 << 3, From c78145279001f09b0e6bfe97d2ce373c295d5c39 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Mon, 11 Jul 2016 00:56:07 +0300 Subject: [PATCH 049/211] Renamed TouchHit.Transform to Target, added layer to TouchHit, rearranged properties at Pointer. --- .../TouchScript/Scripts/Gestures/Gesture.cs | 2 +- .../TouchScript/Scripts/Hit/TouchHit.cs | 34 +++++++++------ .../TouchScript/Scripts/Layers/TouchLayer.cs | 2 +- .../TouchScript/Scripts/Pointers/Pointer.cs | 42 +++++++++---------- .../Scripts/TouchManagerInstance.cs | 2 +- .../TouchScript/Scripts/Utils/PointerUtils.cs | 2 +- 6 files changed, 46 insertions(+), 38 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs index e3853487e..66bf1f432 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs @@ -552,7 +552,7 @@ public virtual bool GetTargetHitResult(Vector2 position, out TouchHit hit) if (!touchManager.GetHitTarget(position, out hit, out l)) return false; } - if (cachedTransform == hit.Transform || hit.Transform.IsChildOf(cachedTransform)) return true; + if (cachedTransform == hit.Target || hit.Target.IsChildOf(cachedTransform)) return true; return false; } diff --git a/Source/Assets/TouchScript/Scripts/Hit/TouchHit.cs b/Source/Assets/TouchScript/Scripts/Hit/TouchHit.cs index 84546bdb0..2c4e0999b 100644 --- a/Source/Assets/TouchScript/Scripts/Hit/TouchHit.cs +++ b/Source/Assets/TouchScript/Scripts/Hit/TouchHit.cs @@ -2,6 +2,7 @@ * @author Valentin Simonov / http://va.lent.in/ */ +using TouchScript.Layers; using UnityEngine; using UnityEngine.EventSystems; @@ -49,12 +50,17 @@ public PointerHitType Type } /// - /// Gets target transform the hit. + /// Gets target Target the hit. /// - /// Hit transform. - public Transform Transform + /// Hit Target. + public Transform Target { - get { return transform; } + get { return target; } + } + + public TouchLayer Layer + { + get { return layer; } } /// @@ -131,7 +137,8 @@ public Vector3 Normal #region Private variables private PointerHitType type; - private Transform transform; + private Transform target; + private TouchLayer layer; private RaycastHit raycastHit; private RaycastHit2D raycastHit2D; private RaycastResult raycastResult; @@ -143,10 +150,11 @@ public Vector3 Normal /// /// Initializes a new instance of the struct. /// - /// Target transform. - public TouchHit(Transform transform) + /// Target Target. + public TouchHit(Transform target, TouchLayer layer = null) { - this.transform = transform; + this.target = target; + this.layer = layer; raycastHit = default(RaycastHit); raycastHit2D = default(RaycastHit2D); raycastResult = default(RaycastResult); @@ -157,7 +165,7 @@ public TouchHit(Transform transform) /// Initializes a new instance of the struct from a 3D raycast. /// /// 3D raycast value. - public TouchHit(RaycastHit value) : this(value.collider.transform) + public TouchHit(RaycastHit value, TouchLayer layer = null) : this(value.collider.transform, layer) { raycastHit = value; type = PointerHitType.Hit3D; @@ -167,8 +175,8 @@ public TouchHit(RaycastHit value) : this(value.collider.transform) /// Initializes a new instance of the struct from a 2D raycast. /// /// 2D raycast value. - public TouchHit(RaycastHit2D value) : - this(value.collider.transform) + public TouchHit(RaycastHit2D value, TouchLayer layer = null) : + this(value.collider.transform, layer) { raycastHit2D = value; type = PointerHitType.Hit2D; @@ -178,8 +186,8 @@ public TouchHit(RaycastHit2D value) : /// Initializes a new instance of the struct from a UI raycast. /// /// UI raycast value. - public TouchHit(RaycastResult value) : - this(value.gameObject.transform) + public TouchHit(RaycastResult value, TouchLayer layer = null) : + this(value.gameObject.transform, layer) { raycastResult = value; type = PointerHitType.HitUI; diff --git a/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs index cf0a75010..e831628f4 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs @@ -180,7 +180,7 @@ internal bool INTERNAL_PressPointer(Pointer pointer) { pointer.Layer = this; pointer.Hit = hit; - if (hit.Transform != null) pointer.Target = hit.Transform; + if (hit.Target != null) pointer.Target = hit.Target; if (pointerBeganInvoker != null) pointerBeganInvoker.InvokeHandleExceptions(this, new TouchLayerEventArgs(pointer)); return true; diff --git a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs index d31b13b9c..b41cb31d8 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs @@ -97,6 +97,27 @@ public enum PointerType /// public PointerType Type { get; protected 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. @@ -117,21 +138,6 @@ public uint Flags /// public Transform Target { get; internal 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; } - /// /// Original hit information. /// @@ -145,12 +151,6 @@ public Vector2 Position /// public TouchLayer Layer { get; internal set; } - /// - /// Original input source which created this pointer. - /// - /// - public IInputSource InputSource { get; private set; } - /// /// Projection parameters for the layer which created this pointer. /// diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs index 9f22f4a71..8e96d8c65 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs @@ -323,7 +323,7 @@ public Transform GetHitTarget(Vector2 position) { TouchHit hit; TouchLayer layer; - if (GetHitTarget(position, out hit, out layer)) return hit.Transform; + if (GetHitTarget(position, out hit, out layer)) return hit.Target; return null; } diff --git a/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs b/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs index a08a28d1a..e33a1e7b0 100644 --- a/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs +++ b/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs @@ -25,7 +25,7 @@ public static bool IsPointerOnTarget(Pointer pointer, Transform target) if (pointer == null || pointer.Layer == null || target == null) return false; TouchHit hit; if ((pointer.Layer.Hit(pointer.Position, out hit) == TouchLayer.LayerHitResult.Hit) && - (target == hit.Transform || hit.Transform.IsChildOf(target))) + (target == hit.Target || hit.Target.IsChildOf(target))) return true; return false; } From 3c17849996073b653ef02ece9c4fbf3a73402393 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Mon, 11 Jul 2016 02:06:57 +0300 Subject: [PATCH 050/211] TouchLayers create TouchHit instances with references to themselves. --- Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs | 2 +- Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs | 2 +- Source/Assets/TouchScript/Scripts/Layers/FullscreenLayer.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs index 2bf7bc0c2..c3619934e 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs @@ -82,7 +82,7 @@ protected override LayerHitResult castRay(Ray ray, out TouchHit hit) private HitTest.ObjectHitResult doHit(RaycastHit raycastHit, out TouchHit hit) { - hit = new TouchHit(raycastHit); + hit = new TouchHit(raycastHit, this); raycastHit.transform.GetComponents(tmpHitTestList); var count = tmpHitTestList.Count; if (count == 0) return HitTest.ObjectHitResult.Hit; diff --git a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs b/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs index 94e3de755..60d3ee2fe 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs @@ -93,7 +93,7 @@ protected override LayerHitResult castRay(Ray ray, out TouchHit hit) private HitTest.ObjectHitResult doHit(RaycastHit2D raycastHit, out TouchHit hit) { - hit = new TouchHit(raycastHit); + hit = new TouchHit(raycastHit, this); raycastHit.transform.GetComponents(tmpHitTestList); var count = tmpHitTestList.Count; if (count == 0) return HitTest.ObjectHitResult.Hit; diff --git a/Source/Assets/TouchScript/Scripts/Layers/FullscreenLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/FullscreenLayer.cs index d1d4d11b3..7148d48cc 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/FullscreenLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/FullscreenLayer.cs @@ -110,7 +110,7 @@ public override LayerHitResult Hit(Vector2 position, out TouchHit hit) if (!_camera.pixelRect.Contains(position)) return LayerHitResult.Miss; } - hit = new TouchHit(transform); + hit = new TouchHit(transform, this); transform.GetComponents(tmpHitTestList); var count = tmpHitTestList.Count; if (count == 0) return LayerHitResult.Hit; From f1139d92571f956045b1aa94a11b373327ba58f0 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Mon, 11 Jul 2016 03:28:12 +0300 Subject: [PATCH 051/211] Adding fake pointer in MouseHandler next frame not to trigger unintended pointer cancellations which can happen when a [1, 1] gesture gets fake touch BEFORE real touch is released due to update loop order. --- .../InputHandlers/MouseHandler.cs | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs index 407ea19e1..4ff423c38 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs @@ -51,6 +51,7 @@ public bool EmulateSecondMousePointer private ObjectPool mousePool; private MousePointer mousePointer, fakeMousePointer; private Vector3 mousePointPos = Vector3.zero; + private DelayedFakePointer addFakePointer; #endregion @@ -74,6 +75,7 @@ public MouseHandler(PointerDelegate addPointer, PointerDelegate updatePointer, P mousePool = new ObjectPool(4, () => new MousePointer(this), null, (t) => t.INTERNAL_Reset()); + addFakePointer.ShouldAdd = false; mousePointPos = Input.mousePosition; mousePointer = internalAddPointer(mousePointPos); } @@ -83,6 +85,13 @@ public MouseHandler(PointerDelegate addPointer, PointerDelegate updatePointer, P /// public void UpdateInput() { + if (addFakePointer.ShouldAdd) + { + addFakePointer.ShouldAdd = false; + fakeMousePointer = internalAddPointer(addFakePointer.Position, addFakePointer.Flags); + pressPointer(fakeMousePointer); + } + if (fakeMousePointer != null && !(Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt))) { @@ -118,8 +127,9 @@ public void UpdateInput() && (Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt)) && fakeMousePointer == null) { - fakeMousePointer = internalAddPointer(mousePointPos, flags | Pointer.FLAG_ARTIFICIAL); - pressPointer(fakeMousePointer); + addFakePointer.ShouldAdd = true; + addFakePointer.Flags = flags | Pointer.FLAG_ARTIFICIAL; + addFakePointer.Position = mousePointPos; } } } @@ -137,8 +147,9 @@ public void UpdateInput() && (Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt)) && fakeMousePointer == null) { - fakeMousePointer = internalAddPointer(mousePointPos, flags | Pointer.FLAG_ARTIFICIAL); - pressPointer(fakeMousePointer); + addFakePointer.ShouldAdd = true; + addFakePointer.Flags = flags | Pointer.FLAG_ARTIFICIAL; + addFakePointer.Position = mousePointPos; } } else if (newFlags != oldFlags) { @@ -213,8 +224,8 @@ private MousePointer internalAddPointer(Vector2 position, uint flags = 0) { var pointer = mousePool.Get(); pointer.Position = remapCoordinates(position); + pointer.Flags |= flags; addPointer(pointer); - pointer.Flags |= flags; return pointer; } @@ -234,5 +245,13 @@ private Vector2 remapCoordinates(Vector2 position) } #endregion + + private struct DelayedFakePointer + { + public bool ShouldAdd; + public uint Flags; + public Vector2 Position; + } + } } \ No newline at end of file From 66da94890ec95b78d4618bc4fe763a9717f9969d Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Mon, 11 Jul 2016 03:52:48 +0300 Subject: [PATCH 052/211] - Removed Gesture.GetTargetHitResult, added Gesture.ScreenPositionHit property. - Removed one overload of ITouchManager.GetHitTarget. - Moved Pointer Target, Hit, Level to TouchHit structure obtainable through GetPressData(). - Added Pointer.GetOverData() which returns TouchHit for whatever is under the pointer. - Added Layer info to TouchHit. - Updated PointerUtils.IsPointerOnTarget(). - Moved setting pointer.Flags before sending press event in inputs since flags are not set correctly otherwise. --- .../Examples/Cube/Scripts/RedirectInput.cs | 11 ++-- .../Examples/Taps/Scripts/Spawn.cs | 3 +- .../TUIO/Scripts/InputSources/TuioInput.cs | 4 +- .../Scripts/GestureManagerInstance.cs | 9 +-- .../TouchScript/Scripts/Gestures/Gesture.cs | 65 ++++--------------- .../Scripts/Gestures/LongPressGesture.cs | 2 +- .../Gestures/PinnedTransformGesture.cs | 2 +- .../Scripts/Gestures/PressGesture.cs | 2 +- .../Scripts/Gestures/ReleaseGesture.cs | 2 +- .../Scripts/Gestures/TapGesture.cs | 2 +- .../Scripts/Gestures/TransformGesture.cs | 2 +- .../Scripts/Gestures/UI/UIGesture.cs | 4 +- .../TouchScript/Scripts/ITouchManager.cs | 11 ---- .../InputHandlers/TouchHandler.cs | 2 +- .../InputHandlers/WindowsPointerHandlers.cs | 6 +- .../TouchScript/Scripts/Layers/TouchLayer.cs | 4 +- .../TouchScript/Scripts/Layers/UILayer.cs | 2 +- .../TouchScript/Scripts/Pointers/Pointer.cs | 52 ++++++++------- .../Scripts/TouchManagerInstance.cs | 18 ++--- .../TouchScript/Scripts/Utils/PointerUtils.cs | 35 ++++++---- 20 files changed, 96 insertions(+), 142 deletions(-) diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs index 9aac7aeb7..8bfc93821 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs @@ -8,6 +8,7 @@ using TouchScript.Hit; using TouchScript.InputSources; using TouchScript.Pointers; +using TouchScript.Utils; namespace TouchScript.Examples.Cube { @@ -28,11 +29,11 @@ public override bool CancelPointer(Pointer pointer, bool shouldReturn) if (shouldReturn) { TouchHit hit; - if (gesture.GetTargetHitResult(pointer.Position, out hit)) + if (PointerUtils.IsPointerOnTarget(pointer, transform, out hit)) { var newPointer = PointerFactory.Create(pointer.Type, this); newPointer.CopyFrom(pointer); - newPointer.Position = processCoords(pointer.Hit.RaycastHit.textureCoord); + newPointer.Position = processCoords(hit.RaycastHit.textureCoord); addPointer(newPointer); pressPointer(newPointer); map.Add(pointer.Id, newPointer); @@ -79,7 +80,7 @@ private void pointerPressedHandler(object sender, MetaGestureEventArgs metaGestu var newPointer = PointerFactory.Create(pointer.Type, this); newPointer.CopyFrom(pointer); - newPointer.Position = processCoords(pointer.Hit.RaycastHit.textureCoord); + newPointer.Position = processCoords(pointer.GetPressData().RaycastHit.textureCoord); newPointer.Flags = pointer.Flags | Pointer.FLAG_ARTIFICIAL; addPointer(newPointer); pressPointer(newPointer); @@ -88,13 +89,13 @@ private void pointerPressedHandler(object sender, MetaGestureEventArgs metaGestu private void pointerUpdatedHandler(object sender, MetaGestureEventArgs metaGestureEventArgs) { - TouchHit hit; var pointer = metaGestureEventArgs.Pointer; if (pointer.InputSource == this) return; Pointer newPointer; if (!map.TryGetValue(pointer.Id, out newPointer)) return; - if (!gesture.GetTargetHitResult(pointer.Position, out hit)) return; + TouchHit hit; + if (!PointerUtils.IsPointerOnTarget(pointer, transform, out hit)) return; newPointer.Position = processCoords(hit.RaycastHit.textureCoord); newPointer.Flags = pointer.Flags | Pointer.FLAG_ARTIFICIAL; updatePointer(newPointer); diff --git a/Source/Assets/TouchScript/Examples/Taps/Scripts/Spawn.cs b/Source/Assets/TouchScript/Examples/Taps/Scripts/Spawn.cs index 4aea36434..da501e985 100644 --- a/Source/Assets/TouchScript/Examples/Taps/Scripts/Spawn.cs +++ b/Source/Assets/TouchScript/Examples/Taps/Scripts/Spawn.cs @@ -28,8 +28,7 @@ private void OnDisable() private void tappedHandler(object sender, EventArgs e) { var gesture = sender as TapGesture; - TouchHit hit; - gesture.GetTargetHitResult(out hit); + TouchHit hit = gesture.ScreenPositionHit; var cube = Instantiate(CubePrefab) as Transform; cube.parent = Container; diff --git a/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs b/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs index 3716bdc27..80e052baa 100644 --- a/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs +++ b/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs @@ -267,9 +267,9 @@ private TouchPointer internalAddTouch(Vector2 position, uint flags = 0) { var pointer = touchPool.Get(); pointer.Position = remapCoordinates(position); + pointer.Flags |= flags; addPointer(pointer); pressPointer(pointer); - pointer.Flags |= flags; return pointer; } @@ -286,9 +286,9 @@ private ObjectPointer internalAddObject(Vector2 position, uint flags = 0) { var pointer = objectPool.Get(); pointer.Position = remapCoordinates(position); + pointer.Flags |= flags; addPointer(pointer); pressPointer(pointer); - pointer.Flags |= flags; return pointer; } diff --git a/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs b/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs index 65fd45762..87f8bec64 100644 --- a/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs @@ -249,14 +249,15 @@ private void update(IList pointers, Action process, for (var i = 0; i < count; i++) { var pointer = pointers[i]; - if (pointer.Target != null) + var target = pointer.GetPressData().Target; + if (target != null) { List list; - if (!targetPointers.TryGetValue(pointer.Target, out list)) + if (!targetPointers.TryGetValue(target, out list)) { list = pointerListPool.Get(); - targetPointers.Add(pointer.Target, list); - targets.Add(pointer.Target); + targetPointers.Add(target, list); + targets.Add(target); } list.Add(pointer); } diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs index 66bf1f432..56f39c5e5 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs @@ -359,6 +359,16 @@ public Vector2 PreviousNormalizedScreenPosition } } + public TouchHit ScreenPositionHit + { + get + { + TouchHit hit; + touchManager.GetHitTarget(ScreenPosition, out hit); + return hit; + } + } + /// /// Gets list of gesture's active pointers. /// @@ -503,59 +513,6 @@ public bool IsFriendly(Gesture gesture) return friendlyGestures.Contains(gesture); } - /// - /// Gets result of casting a ray from gesture pointers centroid screen position. - /// - /// true if ray hits gesture's target; false otherwise. - public bool GetTargetHitResult() - { - TouchHit hit; - return GetTargetHitResult(ScreenPosition, out hit); - } - - /// - /// Gets result of casting a ray from gesture pointers centroid screen position. - /// - /// Raycast result - /// true if ray hits gesture's target; false otherwise. - public virtual bool GetTargetHitResult(out TouchHit hit) - { - return GetTargetHitResult(ScreenPosition, out hit); - } - - /// - /// Gets result of casting a ray from specific screen position. - /// - /// The position. - /// true if ray hits gesture's target; false otherwise. - public bool GetTargetHitResult(Vector2 position) - { - TouchHit hit; - return GetTargetHitResult(position, out hit); - } - - /// - /// Gets result of casting a ray from specific screen position. - /// - /// The position. - /// Raycast result. - /// true if ray hits gesture's target; false otherwise. - public virtual bool GetTargetHitResult(Vector2 position, out TouchHit hit) - { - if (layer != null) - { - if (layer.Hit(position, out hit) != TouchLayer.LayerHitResult.Hit) return false; - } - else - { - TouchLayer l = null; - if (!touchManager.GetHitTarget(position, out hit, out l)) return false; - } - - if (cachedTransform == hit.Target || hit.Target.IsChildOf(cachedTransform)) return true; - return false; - } - /// /// Determines whether gesture controls a pointer. /// @@ -720,7 +677,7 @@ internal void INTERNAL_Reset() internal void INTERNAL_PointersPressed(IList pointers) { - if (numPointers == 0) layer = pointers[0].Layer; + if (numPointers == 0) layer = pointers[0].GetPressData().Layer; var count = pointers.Count; var total = numPointers + count; diff --git a/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs index 5801daa66..d4ef71ffd 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs @@ -169,7 +169,7 @@ private IEnumerator wait() if (State == GestureState.Possible) { - if (base.GetTargetHitResult()) + if (ScreenPositionHit.Target.IsChildOf(cachedTransform)) { setState(GestureState.Recognized); } diff --git a/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs index 5714e936b..8d47dd1e1 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs @@ -157,7 +157,7 @@ protected override void pointersPressed(IList pointers) if (State != GestureState.Possible) return; if (NumPointers == pointers.Count) { - projectionLayer = activePointers[0].Layer; + projectionLayer = activePointers[0].GetPressData().Layer; updateProjectionPlane(); #if TOUCHSCRIPT_DEBUG diff --git a/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs index ccbf5c4ac..2e8d82bec 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs @@ -74,7 +74,7 @@ public override bool ShouldReceivePointer(Pointer pointer) if (!IgnoreChildren) return base.ShouldReceivePointer(pointer); if (!base.ShouldReceivePointer(pointer)) return false; - if (pointer.Target != cachedTransform) return false; + if (pointer.GetPressData().Target != cachedTransform) return false; return true; } diff --git a/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs index 9b55bc09b..6a8e0c90b 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs @@ -74,7 +74,7 @@ public override bool ShouldReceivePointer(Pointer pointer) if (!IgnoreChildren) return base.ShouldReceivePointer(pointer); if (!base.ShouldReceivePointer(pointer)) return false; - if (pointer.Target != cachedTransform) return false; + if (pointer.GetPressData().Target != cachedTransform) return false; return true; } diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs index fc6b4214e..27eb6ae8a 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs @@ -236,7 +236,7 @@ protected override void reset() protected override bool shouldCachePointerPosition(Pointer value) { // Points must be over target when released - return GetTargetHitResult(value.Position); + return PointerUtils.IsPointerOnTarget(value, cachedTransform); } #endregion diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs index 9209cbe10..5affef262 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs @@ -165,7 +165,7 @@ protected override void pointersPressed(IList pointers) if (State != GestureState.Possible) return; if (NumPointers == pointers.Count) { - projectionLayer = activePointers[0].Layer; + projectionLayer = activePointers[0].GetPressData().Layer; updateProjectionPlane(); } } diff --git a/Source/Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs index a07b76a6d..be0786cbc 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs @@ -153,8 +153,8 @@ protected virtual PointerData getPointerData(Pointer pointer) useDragThreshold = true, position = pointer.Position, pressPosition = pointer.Position, - pointerPressRaycast = pointer.Hit.RaycastResult, - pointerCurrentRaycast = pointer.Hit.RaycastResult + pointerPressRaycast = pointer.GetPressData().RaycastResult, + pointerCurrentRaycast = pointer.GetPressData().RaycastResult } }; pointerData.Add(pointer.Id, data); diff --git a/Source/Assets/TouchScript/Scripts/ITouchManager.cs b/Source/Assets/TouchScript/Scripts/ITouchManager.cs index 20f1825c2..14490f8c7 100644 --- a/Source/Assets/TouchScript/Scripts/ITouchManager.cs +++ b/Source/Assets/TouchScript/Scripts/ITouchManager.cs @@ -203,17 +203,6 @@ public interface ITouchManager /// True if the pointer hits any Transform. bool GetHitTarget(Vector2 position, out TouchHit hit); - /// - /// Checks if a pointer hits anything. - /// - /// - /// - /// Screen position of the pointer. - /// An object which represents hit information. - /// A layer which was hit. - /// True if the pointer hits any Transform. - bool GetHitTarget(Vector2 position, out TouchHit hit, out TouchLayer layer); - /// /// Cancels a pointer and returns it to the system of need. /// diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs index 8d77b0174..4e154a8ab 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs @@ -204,9 +204,9 @@ private Pointer internalAddPointer(Vector2 position, uint flags = 0) pointersNum++; var pointer = touchPool.Get(); pointer.Position = remapCoordinates(position); + pointer.Flags |= flags; addPointer(pointer); pressPointer(pointer); - pointer.Flags |= flags; return pointer; } diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs index d34b79fcf..b2e34396c 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs @@ -266,8 +266,8 @@ private MousePointer internalAddMousePointer(Vector2 position, uint flags = 0) { var pointer = mousePool.Get(); pointer.Position = remapCoordinates(position); - addPointer(pointer); pointer.Flags |= flags; + addPointer(pointer); return pointer; } @@ -284,8 +284,8 @@ private PenPointer internalAddPenPointer(Vector2 position, uint flags = 0) { var pointer = penPool.Get(); pointer.Position = remapCoordinates(position); - addPointer(pointer); pointer.Flags |= flags; + addPointer(pointer); return pointer; } @@ -534,9 +534,9 @@ protected TouchPointer internalAddTouchPointer(Vector2 position, uint flags = 0) { var pointer = touchPool.Get(); pointer.Position = remapCoordinates(position); + pointer.Flags |= flags; addPointer(pointer); pressPointer(pointer); - pointer.Flags |= flags; return pointer; } diff --git a/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs index e831628f4..c0a3c28f9 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs @@ -178,9 +178,7 @@ internal bool INTERNAL_PressPointer(Pointer pointer) var result = beginPointer(pointer, out hit); if (result == LayerHitResult.Hit) { - pointer.Layer = this; - pointer.Hit = hit; - if (hit.Target != null) pointer.Target = hit.Target; + pointer.INTERNAL_SetTargetData(hit); if (pointerBeganInvoker != null) pointerBeganInvoker.InvokeHandleExceptions(this, new TouchLayerEventArgs(pointer)); return true; diff --git a/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs b/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs index f3c902dfc..4f19f7d75 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs @@ -86,7 +86,7 @@ public override LayerHitResult Hit(Vector2 position, out TouchHit hit) /// public override ProjectionParams GetProjectionParams(Pointer pointer) { - var graphic = pointer.Target.GetComponent(); + var graphic = pointer.GetPressData().Target.GetComponent(); if (graphic == null) return layerProjectionParams; var canvas = graphic.canvas; if (canvas == null) return layerProjectionParams; diff --git a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs index b41cb31d8..f40445e6d 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs @@ -133,30 +133,16 @@ public uint Flags /// public uint PreviousFlags { get; private set; } - /// - /// Original hit target. - /// - public Transform Target { get; internal set; } - - /// - /// Original hit information. - /// - public TouchHit Hit { get; internal set; } - - /// - /// Original layer which registered this pointer. - /// - /// - /// - /// - public TouchLayer Layer { get; internal set; } - /// /// Projection parameters for the layer which created this pointer. /// public ProjectionParams ProjectionParams { - get { return Layer.GetProjectionParams(this); } + get + { + if (pressData.Layer == null) return default(ProjectionParams); + return pressData.Layer.GetProjectionParams(this); + } } #endregion @@ -166,11 +152,28 @@ public ProjectionParams ProjectionParams private int refCount = 0; private Vector2 position, newPosition; private uint flags, newFlags; + private TouchHit pressData, overData; + private bool overDataIsDirty = true; #endregion #region Public methods + public TouchHit GetOverData(bool forceRecalculate = false) + { + if (overDataIsDirty || forceRecalculate) + { + TouchManager.Instance.GetHitTarget(position, out overData); + overDataIsDirty = false; + } + return overData; + } + + public TouchHit GetPressData() + { + return pressData; + } + /// /// Copies values from . /// @@ -246,6 +249,8 @@ internal virtual void INTERNAL_FrameStarted() position = newPosition; PreviousFlags = flags; flags = newFlags; + + overDataIsDirty = true; } internal void INTERNAL_Retain() @@ -258,11 +263,14 @@ internal int INTERNAL_Release() return --refCount; } + internal void INTERNAL_SetTargetData(TouchHit data) + { + pressData = data; + } + internal void INTERNAL_ClearTargetData() { - Hit = default(TouchHit); - Target = null; - Layer = null; + pressData = default(TouchHit); refCount = 0; } diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs index 8e96d8c65..ce1ca1c0c 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs @@ -322,23 +322,14 @@ public bool RemoveInput(IInputSource input) public Transform GetHitTarget(Vector2 position) { TouchHit hit; - TouchLayer layer; - if (GetHitTarget(position, out hit, out layer)) return hit.Target; + if (GetHitTarget(position, out hit)) return hit.Target; return null; } /// public bool GetHitTarget(Vector2 position, out TouchHit hit) - { - TouchLayer layer; - return GetHitTarget(position, out hit, out layer); - } - - /// - public bool GetHitTarget(Vector2 position, out TouchHit hit, out TouchLayer layer) { hit = default(TouchHit); - layer = null; for (var i = 0; i < layerCount; i++) { @@ -348,7 +339,6 @@ public bool GetHitTarget(Vector2 position, out TouchHit hit, out TouchLayer laye if (touchLayer.Hit(position, out _hit) == TouchLayer.LayerHitResult.Hit) { hit = _hit; - layer = touchLayer; return true; } } @@ -680,7 +670,7 @@ private void updateUpdated(List pointers) continue; } list.Add(pointer); - if (pointer.Layer != null) pointer.Layer.INTERNAL_UpdatePointer(pointer); + if (pointer.GetPressData().Layer != null) pointer.GetPressData().Layer.INTERNAL_UpdatePointer(pointer); #if TOUCHSCRIPT_DEBUG addDebugFigureForPointer(pointer); @@ -744,7 +734,7 @@ private void updateReleased(List pointers) } list.Add(pointer); pressedPointers.Remove(pointer); - if (pointer.Layer != null) pointer.Layer.INTERNAL_ReleasePointer(pointer); + if (pointer.GetPressData().Layer != null) pointer.GetPressData().Layer.INTERNAL_ReleasePointer(pointer); #if TOUCHSCRIPT_DEBUG addDebugFigureForPointer(pointer); @@ -820,7 +810,7 @@ private void updateCancelled(List pointers) this.pointers.Remove(pointer); pressedPointers.Remove(pointer); list.Add(pointer); - if (pointer.Layer != null) pointer.Layer.INTERNAL_CancelPointer(pointer); + if (pointer.GetPressData().Layer != null) pointer.GetPressData().Layer.INTERNAL_CancelPointer(pointer); #if TOUCHSCRIPT_DEBUG removeDebugFigureForPointer(pointer); diff --git a/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs b/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs index e33a1e7b0..4366e975a 100644 --- a/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs +++ b/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs @@ -3,7 +3,6 @@ */ using TouchScript.Hit; -using TouchScript.Layers; using TouchScript.Pointers; using UnityEngine; @@ -14,6 +13,17 @@ namespace TouchScript.Utils /// public static class PointerUtils { + /// + /// Determines whether the pointer is over its target GameObject. + /// + /// The pointer. + /// true if the pointer is over the GameObject; false otherwise. + public static bool IsPointerOnTarget(Pointer pointer) + { + if (pointer == null) return false; + return IsPointerOnTarget(pointer, pointer.GetPressData().Target); + } + /// /// Determines whether the pointer is over a specific GameObject. /// @@ -22,23 +32,24 @@ public static class PointerUtils /// true if the pointer is over the GameObject; false otherwise. public static bool IsPointerOnTarget(Pointer pointer, Transform target) { - if (pointer == null || pointer.Layer == null || target == null) return false; TouchHit hit; - if ((pointer.Layer.Hit(pointer.Position, out hit) == TouchLayer.LayerHitResult.Hit) && - (target == hit.Target || hit.Target.IsChildOf(target))) - return true; - return false; + return IsPointerOnTarget(pointer, target, out hit); } /// - /// Determines whether the pointer is over its target GameObject. + /// Determines whether the pointer is over a specific GameObject. /// - /// The pointer. - /// true if the pointer is over the GameObject; false otherwise. - public static bool IsPointerOnTarget(Pointer pointer) + /// The pointer. + /// The target. + /// The hit. + /// true if the pointer is over the GameObject; false otherwise. + public static bool IsPointerOnTarget(Pointer pointer, Transform target, out TouchHit hit) { - if (pointer == null) return false; - return IsPointerOnTarget(pointer, pointer.Target); + hit = default(TouchHit); + if (pointer == null || target == null) return false; + hit = pointer.GetOverData(); + if (hit.Target == null) return false; + return hit.Target.IsChildOf(target); } } } \ No newline at end of file From f337ecd28d536a98e6e3beb3ea5b1ee7688c1a07 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Mon, 11 Jul 2016 03:54:24 +0300 Subject: [PATCH 053/211] Renamed TouchHit.PointerHitType to HitType. --- .../TouchScript/Scripts/Hit/TouchHit.cs | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Hit/TouchHit.cs b/Source/Assets/TouchScript/Scripts/Hit/TouchHit.cs index 2c4e0999b..8a8902d9e 100644 --- a/Source/Assets/TouchScript/Scripts/Hit/TouchHit.cs +++ b/Source/Assets/TouchScript/Scripts/Hit/TouchHit.cs @@ -18,7 +18,7 @@ public struct TouchHit /// /// Type of hit /// - public enum PointerHitType + public enum HitType { /// /// 3D hit. @@ -44,7 +44,7 @@ public enum PointerHitType /// Gets the type of the hit. /// /// The type. - public PointerHitType Type + public HitType Type { get { return type; } } @@ -100,11 +100,11 @@ public Vector3 Point { switch (type) { - case PointerHitType.Hit3D: + case HitType.Hit3D: return RaycastHit.point; - case PointerHitType.Hit2D: + case HitType.Hit2D: return RaycastHit2D.point; - case PointerHitType.HitUI: + case HitType.HitUI: return RaycastResult.worldPosition; } return Vector3.zero; @@ -121,11 +121,11 @@ public Vector3 Normal { switch (type) { - case PointerHitType.Hit3D: + case HitType.Hit3D: return RaycastHit.normal; - case PointerHitType.Hit2D: + case HitType.Hit2D: return RaycastHit2D.normal; - case PointerHitType.HitUI: + case HitType.HitUI: return RaycastResult.worldNormal; } return Vector3.forward; @@ -136,7 +136,7 @@ public Vector3 Normal #region Private variables - private PointerHitType type; + private HitType type; private Transform target; private TouchLayer layer; private RaycastHit raycastHit; @@ -158,7 +158,7 @@ public TouchHit(Transform target, TouchLayer layer = null) raycastHit = default(RaycastHit); raycastHit2D = default(RaycastHit2D); raycastResult = default(RaycastResult); - type = PointerHitType.Hit3D; + type = HitType.Hit3D; } /// @@ -168,7 +168,7 @@ public TouchHit(Transform target, TouchLayer layer = null) public TouchHit(RaycastHit value, TouchLayer layer = null) : this(value.collider.transform, layer) { raycastHit = value; - type = PointerHitType.Hit3D; + type = HitType.Hit3D; } /// @@ -179,7 +179,7 @@ public TouchHit(RaycastHit2D value, TouchLayer layer = null) : this(value.collider.transform, layer) { raycastHit2D = value; - type = PointerHitType.Hit2D; + type = HitType.Hit2D; } /// @@ -190,7 +190,7 @@ public TouchHit(RaycastResult value, TouchLayer layer = null) : this(value.gameObject.transform, layer) { raycastResult = value; - type = PointerHitType.HitUI; + type = HitType.HitUI; } #endregion From df1a87fa63ae70e9eb7c7bc58a2b407a4bcb4196 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Mon, 11 Jul 2016 03:58:45 +0300 Subject: [PATCH 054/211] - Renamed TouchHit to HitData. - Renamed Gesture.ScreenPosition to ScreenPositionHit. --- .../Examples/Cube/Scripts/RedirectInput.cs | 4 ++-- .../Examples/Taps/Scripts/Spawn.cs | 2 +- .../TouchScript/Scripts/Gestures/Gesture.cs | 4 ++-- .../Scripts/Gestures/LongPressGesture.cs | 2 +- .../Scripts/Hit/{TouchHit.cs => HitData.cs} | 22 +++++++++++-------- .../Hit/{TouchHit.cs.meta => HitData.cs.meta} | 0 .../Assets/TouchScript/Scripts/Hit/HitTest.cs | 2 +- .../TouchScript/Scripts/Hit/Untouchable.cs | 2 +- .../TouchScript/Scripts/ITouchManager.cs | 4 ++-- .../TouchScript/Scripts/Layers/CameraLayer.cs | 8 +++---- .../Scripts/Layers/CameraLayer2D.cs | 8 +++---- .../Scripts/Layers/CameraLayerBase.cs | 4 ++-- .../Scripts/Layers/FullscreenLayer.cs | 4 ++-- .../TouchScript/Scripts/Layers/TouchLayer.cs | 10 ++++----- .../TouchScript/Scripts/Layers/UILayer.cs | 6 ++--- .../TouchScript/Scripts/Pointers/Pointer.cs | 10 ++++----- .../Scripts/TouchManagerInstance.cs | 8 +++---- .../TouchScript/Scripts/Utils/PointerUtils.cs | 6 ++--- 18 files changed, 55 insertions(+), 51 deletions(-) rename Source/Assets/TouchScript/Scripts/Hit/{TouchHit.cs => HitData.cs} (85%) rename Source/Assets/TouchScript/Scripts/Hit/{TouchHit.cs.meta => HitData.cs.meta} (100%) diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs index 8bfc93821..1da2d0961 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs @@ -28,7 +28,7 @@ public override bool CancelPointer(Pointer pointer, bool shouldReturn) map.Remove(pointer.Id); if (shouldReturn) { - TouchHit hit; + HitData hit; if (PointerUtils.IsPointerOnTarget(pointer, transform, out hit)) { var newPointer = PointerFactory.Create(pointer.Type, this); @@ -94,7 +94,7 @@ private void pointerUpdatedHandler(object sender, MetaGestureEventArgs metaGestu Pointer newPointer; if (!map.TryGetValue(pointer.Id, out newPointer)) return; - TouchHit hit; + HitData hit; if (!PointerUtils.IsPointerOnTarget(pointer, transform, out hit)) return; newPointer.Position = processCoords(hit.RaycastHit.textureCoord); newPointer.Flags = pointer.Flags | Pointer.FLAG_ARTIFICIAL; diff --git a/Source/Assets/TouchScript/Examples/Taps/Scripts/Spawn.cs b/Source/Assets/TouchScript/Examples/Taps/Scripts/Spawn.cs index da501e985..6ec1124fe 100644 --- a/Source/Assets/TouchScript/Examples/Taps/Scripts/Spawn.cs +++ b/Source/Assets/TouchScript/Examples/Taps/Scripts/Spawn.cs @@ -28,7 +28,7 @@ private void OnDisable() private void tappedHandler(object sender, EventArgs e) { var gesture = sender as TapGesture; - TouchHit hit = gesture.ScreenPositionHit; + HitData hit = gesture.ScreenPositionHitData; var cube = Instantiate(CubePrefab) as Transform; cube.parent = Container; diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs index 56f39c5e5..503a3d22e 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs @@ -359,11 +359,11 @@ public Vector2 PreviousNormalizedScreenPosition } } - public TouchHit ScreenPositionHit + public HitData ScreenPositionHitData { get { - TouchHit hit; + HitData hit; touchManager.GetHitTarget(ScreenPosition, out hit); return hit; } diff --git a/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs index d4ef71ffd..56c087ec9 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs @@ -169,7 +169,7 @@ private IEnumerator wait() if (State == GestureState.Possible) { - if (ScreenPositionHit.Target.IsChildOf(cachedTransform)) + if (ScreenPositionHitData.Target.IsChildOf(cachedTransform)) { setState(GestureState.Recognized); } diff --git a/Source/Assets/TouchScript/Scripts/Hit/TouchHit.cs b/Source/Assets/TouchScript/Scripts/Hit/HitData.cs similarity index 85% rename from Source/Assets/TouchScript/Scripts/Hit/TouchHit.cs rename to Source/Assets/TouchScript/Scripts/Hit/HitData.cs index 8a8902d9e..8764982cf 100644 --- a/Source/Assets/TouchScript/Scripts/Hit/TouchHit.cs +++ b/Source/Assets/TouchScript/Scripts/Hit/HitData.cs @@ -11,7 +11,7 @@ namespace TouchScript.Hit /// /// An object representing a point hit by a pointer in 3D, 2D or UI space. /// - public struct TouchHit + public struct HitData { #region Consts @@ -58,6 +58,10 @@ public Transform Target get { return target; } } + /// + /// Gets the layer which detected the hit. + /// + /// Hit layer. public TouchLayer Layer { get { return layer; } @@ -148,10 +152,10 @@ public Vector3 Normal #region Constructors /// - /// Initializes a new instance of the struct. + /// Initializes a new instance of the struct. /// /// Target Target. - public TouchHit(Transform target, TouchLayer layer = null) + public HitData(Transform target, TouchLayer layer = null) { this.target = target; this.layer = layer; @@ -162,20 +166,20 @@ public TouchHit(Transform target, TouchLayer layer = null) } /// - /// Initializes a new instance of the struct from a 3D raycast. + /// Initializes a new instance of the struct from a 3D raycast. /// /// 3D raycast value. - public TouchHit(RaycastHit value, TouchLayer layer = null) : this(value.collider.transform, layer) + public HitData(RaycastHit value, TouchLayer layer = null) : this(value.collider.transform, layer) { raycastHit = value; type = HitType.Hit3D; } /// - /// Initializes a new instance of the struct from a 2D raycast. + /// Initializes a new instance of the struct from a 2D raycast. /// /// 2D raycast value. - public TouchHit(RaycastHit2D value, TouchLayer layer = null) : + public HitData(RaycastHit2D value, TouchLayer layer = null) : this(value.collider.transform, layer) { raycastHit2D = value; @@ -183,10 +187,10 @@ public TouchHit(RaycastHit2D value, TouchLayer layer = null) : } /// - /// Initializes a new instance of the struct from a UI raycast. + /// Initializes a new instance of the struct from a UI raycast. /// /// UI raycast value. - public TouchHit(RaycastResult value, TouchLayer layer = null) : + public HitData(RaycastResult value, TouchLayer layer = null) : this(value.gameObject.transform, layer) { raycastResult = value; diff --git a/Source/Assets/TouchScript/Scripts/Hit/TouchHit.cs.meta b/Source/Assets/TouchScript/Scripts/Hit/HitData.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/Hit/TouchHit.cs.meta rename to Source/Assets/TouchScript/Scripts/Hit/HitData.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/Hit/HitTest.cs b/Source/Assets/TouchScript/Scripts/Hit/HitTest.cs index ffc3accdc..a2c508972 100644 --- a/Source/Assets/TouchScript/Scripts/Hit/HitTest.cs +++ b/Source/Assets/TouchScript/Scripts/Hit/HitTest.cs @@ -48,7 +48,7 @@ public enum ObjectHitResult /// /// 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 ObjectHitResult IsHit(TouchHit hit) + public virtual ObjectHitResult IsHit(HitData hit) { return ObjectHitResult.Hit; } diff --git a/Source/Assets/TouchScript/Scripts/Hit/Untouchable.cs b/Source/Assets/TouchScript/Scripts/Hit/Untouchable.cs index 6ebb990ed..eab4b1e78 100644 --- a/Source/Assets/TouchScript/Scripts/Hit/Untouchable.cs +++ b/Source/Assets/TouchScript/Scripts/Hit/Untouchable.cs @@ -26,7 +26,7 @@ public class Untouchable : HitTest #region Public methods /// - public override ObjectHitResult IsHit(TouchHit hit) + public override ObjectHitResult IsHit(HitData hit) { return DiscardPointer ? ObjectHitResult.Discard : ObjectHitResult.Miss; } diff --git a/Source/Assets/TouchScript/Scripts/ITouchManager.cs b/Source/Assets/TouchScript/Scripts/ITouchManager.cs index 14490f8c7..2b6c72f5a 100644 --- a/Source/Assets/TouchScript/Scripts/ITouchManager.cs +++ b/Source/Assets/TouchScript/Scripts/ITouchManager.cs @@ -196,12 +196,12 @@ public interface ITouchManager /// /// Checks if a pointer hits anything. - /// + /// /// /// Screen position of the pointer. /// An object which represents hit information. /// True if the pointer hits any Transform. - bool GetHitTarget(Vector2 position, out TouchHit hit); + bool GetHitTarget(Vector2 position, out HitData hit); /// /// Cancels a pointer and returns it to the system of need. diff --git a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs index c3619934e..f069424b6 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs @@ -39,9 +39,9 @@ protected override void Awake() #region Protected functions /// - protected override LayerHitResult castRay(Ray ray, out TouchHit hit) + protected override LayerHitResult castRay(Ray ray, out HitData hit) { - hit = default(TouchHit); + hit = default(HitData); var raycastHits = Physics.RaycastAll(ray, float.PositiveInfinity, LayerMask); if (raycastHits.Length == 0) return LayerHitResult.Miss; @@ -80,9 +80,9 @@ protected override LayerHitResult castRay(Ray ray, out TouchHit hit) return LayerHitResult.Miss; } - private HitTest.ObjectHitResult doHit(RaycastHit raycastHit, out TouchHit hit) + private HitTest.ObjectHitResult doHit(RaycastHit raycastHit, out HitData hit) { - hit = new TouchHit(raycastHit, this); + hit = new HitData(raycastHit, this); raycastHit.transform.GetComponents(tmpHitTestList); var count = tmpHitTestList.Count; if (count == 0) return HitTest.ObjectHitResult.Hit; diff --git a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs b/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs index 60d3ee2fe..5d5d05551 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs @@ -50,9 +50,9 @@ protected virtual void OnEnable() #region Protected functions /// - protected override LayerHitResult castRay(Ray ray, out TouchHit hit) + protected override LayerHitResult castRay(Ray ray, out HitData hit) { - hit = default(TouchHit); + hit = default(HitData); var raycastHits = Physics2D.GetRayIntersectionAll(ray, float.PositiveInfinity, LayerMask); if (raycastHits.Length == 0) return LayerHitResult.Miss; @@ -91,9 +91,9 @@ protected override LayerHitResult castRay(Ray ray, out TouchHit hit) return LayerHitResult.Miss; } - private HitTest.ObjectHitResult doHit(RaycastHit2D raycastHit, out TouchHit hit) + private HitTest.ObjectHitResult doHit(RaycastHit2D raycastHit, out HitData hit) { - hit = new TouchHit(raycastHit, this); + hit = new HitData(raycastHit, this); raycastHit.transform.GetComponents(tmpHitTestList); var count = tmpHitTestList.Count; if (count == 0) return HitTest.ObjectHitResult.Hit; diff --git a/Source/Assets/TouchScript/Scripts/Layers/CameraLayerBase.cs b/Source/Assets/TouchScript/Scripts/Layers/CameraLayerBase.cs index 23aca7cab..d63541080 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/CameraLayerBase.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/CameraLayerBase.cs @@ -52,7 +52,7 @@ public override Vector3 WorldProjectionNormal #region Public methods /// - public override LayerHitResult Hit(Vector2 position, out TouchHit hit) + public override LayerHitResult Hit(Vector2 position, out HitData hit) { if (base.Hit(position, out hit) == LayerHitResult.Miss) return LayerHitResult.Miss; @@ -109,7 +109,7 @@ protected virtual void updateCamera() /// The ray. /// Hit information if the ray has hit something. /// Hit result. - protected abstract LayerHitResult castRay(Ray ray, out TouchHit hit); + protected abstract LayerHitResult castRay(Ray ray, out HitData hit); #endregion } diff --git a/Source/Assets/TouchScript/Scripts/Layers/FullscreenLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/FullscreenLayer.cs index 7148d48cc..33d497521 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/FullscreenLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/FullscreenLayer.cs @@ -101,7 +101,7 @@ public override Vector3 WorldProjectionNormal #region Public methods /// - public override LayerHitResult Hit(Vector2 position, out TouchHit hit) + public override LayerHitResult Hit(Vector2 position, out HitData hit) { if (base.Hit(position, out hit) == LayerHitResult.Miss) return LayerHitResult.Miss; @@ -110,7 +110,7 @@ public override LayerHitResult Hit(Vector2 position, out TouchHit hit) if (!_camera.pixelRect.Contains(position)) return LayerHitResult.Miss; } - hit = new TouchHit(transform, this); + hit = new HitData(transform, this); transform.GetComponents(tmpHitTestList); var count = tmpHitTestList.Count; if (count == 0) return LayerHitResult.Hit; diff --git a/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs index c0a3c28f9..4afb34ab2 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs @@ -14,7 +14,7 @@ namespace TouchScript.Layers /// /// Base class for all pointer layers. Used to check if some object is hit by a pointer. /// - /// + /// /// /// /// @@ -108,9 +108,9 @@ public virtual ProjectionParams GetProjectionParams(Pointer pointer) /// Position in screen coordinates. /// Hit result. /// , if an object is hit, or otherwise. - public virtual LayerHitResult Hit(Vector2 position, out TouchHit hit) + public virtual LayerHitResult Hit(Vector2 position, out HitData hit) { - hit = default(TouchHit); + hit = default(HitData); if (enabled == false || gameObject.activeInHierarchy == false) return LayerHitResult.Miss; return LayerHitResult.Error; } @@ -173,7 +173,7 @@ internal void INTERNAL_UpdatePointer(Pointer pointer) internal bool INTERNAL_PressPointer(Pointer pointer) { - TouchHit hit; + HitData hit; if (Delegate != null && Delegate.ShouldReceivePointer(this, pointer) == false) return false; var result = beginPointer(pointer, out hit); if (result == LayerHitResult.Hit) @@ -215,7 +215,7 @@ protected virtual void setName() /// Hit result. /// , if an object is hit, or otherwise. /// This method may also be used to update some internal state or resend this event somewhere. - protected virtual LayerHitResult beginPointer(Pointer pointer, out TouchHit hit) + protected virtual LayerHitResult beginPointer(Pointer pointer, out HitData hit) { var result = Hit(pointer.Position, out hit); return result; diff --git a/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs b/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs index 4f19f7d75..dbe742c31 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs @@ -42,7 +42,7 @@ public class UILayer : TouchLayer #region Public methods /// - public override LayerHitResult Hit(Vector2 position, out TouchHit hit) + public override LayerHitResult Hit(Vector2 position, out HitData hit) { if (base.Hit(position, out hit) == LayerHitResult.Miss) return LayerHitResult.Miss; if (eventSystem == null) return LayerHitResult.Error; @@ -151,9 +151,9 @@ protected override void setName() #region Private functions - private HitTest.ObjectHitResult doHit(RaycastResult raycastHit, out TouchHit hit) + private HitTest.ObjectHitResult doHit(RaycastResult raycastHit, out HitData hit) { - hit = new TouchHit(raycastHit); + hit = new HitData(raycastHit); if (!(raycastHit.module is GraphicRaycaster)) return HitTest.ObjectHitResult.Miss; var go = raycastHit.gameObject; diff --git a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs index f40445e6d..cfeaa19be 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs @@ -152,14 +152,14 @@ public ProjectionParams ProjectionParams private int refCount = 0; private Vector2 position, newPosition; private uint flags, newFlags; - private TouchHit pressData, overData; + private HitData pressData, overData; private bool overDataIsDirty = true; #endregion #region Public methods - public TouchHit GetOverData(bool forceRecalculate = false) + public HitData GetOverData(bool forceRecalculate = false) { if (overDataIsDirty || forceRecalculate) { @@ -169,7 +169,7 @@ public TouchHit GetOverData(bool forceRecalculate = false) return overData; } - public TouchHit GetPressData() + public HitData GetPressData() { return pressData; } @@ -263,14 +263,14 @@ internal int INTERNAL_Release() return --refCount; } - internal void INTERNAL_SetTargetData(TouchHit data) + internal void INTERNAL_SetTargetData(HitData data) { pressData = data; } internal void INTERNAL_ClearTargetData() { - pressData = default(TouchHit); + pressData = default(HitData); refCount = 0; } diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs index ce1ca1c0c..d9e647389 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs @@ -321,21 +321,21 @@ public bool RemoveInput(IInputSource input) /// public Transform GetHitTarget(Vector2 position) { - TouchHit hit; + HitData hit; if (GetHitTarget(position, out hit)) return hit.Target; return null; } /// - public bool GetHitTarget(Vector2 position, out TouchHit hit) + public bool GetHitTarget(Vector2 position, out HitData hit) { - hit = default(TouchHit); + hit = default(HitData); for (var i = 0; i < layerCount; i++) { var touchLayer = layers[i]; if (touchLayer == null) continue; - TouchHit _hit; + HitData _hit; if (touchLayer.Hit(position, out _hit) == TouchLayer.LayerHitResult.Hit) { hit = _hit; diff --git a/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs b/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs index 4366e975a..98255f297 100644 --- a/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs +++ b/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs @@ -32,7 +32,7 @@ public static bool IsPointerOnTarget(Pointer pointer) /// true if the pointer is over the GameObject; false otherwise. public static bool IsPointerOnTarget(Pointer pointer, Transform target) { - TouchHit hit; + HitData hit; return IsPointerOnTarget(pointer, target, out hit); } @@ -43,9 +43,9 @@ public static bool IsPointerOnTarget(Pointer pointer, Transform target) /// The target. /// The hit. /// true if the pointer is over the GameObject; false otherwise. - public static bool IsPointerOnTarget(Pointer pointer, Transform target, out TouchHit hit) + public static bool IsPointerOnTarget(Pointer pointer, Transform target, out HitData hit) { - hit = default(TouchHit); + hit = default(HitData); if (pointer == null || target == null) return false; hit = pointer.GetOverData(); if (hit.Target == null) return false; From d243088b009a9471daecbfa5af4bbaf97d9fa7a9 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Mon, 11 Jul 2016 04:03:48 +0300 Subject: [PATCH 055/211] Added docs for Pointer, renamed a couple of internal functions. --- .../Assets/TouchScript/Scripts/Layers/TouchLayer.cs | 2 +- .../Assets/TouchScript/Scripts/Pointers/Pointer.cs | 13 ++++++++++--- .../TouchScript/Scripts/TouchManagerInstance.cs | 2 +- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs index 4afb34ab2..b13d93967 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs @@ -178,7 +178,7 @@ internal bool INTERNAL_PressPointer(Pointer pointer) var result = beginPointer(pointer, out hit); if (result == LayerHitResult.Hit) { - pointer.INTERNAL_SetTargetData(hit); + pointer.INTERNAL_SetPressData(hit); if (pointerBeganInvoker != null) pointerBeganInvoker.InvokeHandleExceptions(this, new TouchLayerEventArgs(pointer)); return true; diff --git a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs index cfeaa19be..4aa75b520 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs @@ -159,6 +159,10 @@ public ProjectionParams ProjectionParams #region Public methods + /// + /// Returns for current pointer position, i.e. what is right beneath it. Caches the result for the entire frame. + /// + /// if set to true forces to recalculate the value. public HitData GetOverData(bool forceRecalculate = false) { if (overDataIsDirty || forceRecalculate) @@ -169,6 +173,9 @@ public HitData GetOverData(bool forceRecalculate = false) return overData; } + /// + /// Returns when the pointer was pressed. If the pointer is not pressed uninitialized is returned. + /// public HitData GetPressData() { return pressData; @@ -238,7 +245,7 @@ internal virtual void INTERNAL_Init(int id) internal virtual void INTERNAL_Reset() { Id = INVALID_POINTER; - INTERNAL_ClearTargetData(); + INTERNAL_ClearPressData(); position = newPosition = PreviousPosition = Vector2.zero; flags = newFlags = PreviousFlags = 0; } @@ -263,12 +270,12 @@ internal int INTERNAL_Release() return --refCount; } - internal void INTERNAL_SetTargetData(HitData data) + internal void INTERNAL_SetPressData(HitData data) { pressData = data; } - internal void INTERNAL_ClearTargetData() + internal void INTERNAL_ClearPressData() { pressData = default(HitData); refCount = 0; diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs index d9e647389..7842b4a3c 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs @@ -748,7 +748,7 @@ private void updateReleased(List pointers) for (var i = 0; i < releasedCount; i++) { var pointer = list[i]; - pointer.INTERNAL_ClearTargetData(); + pointer.INTERNAL_ClearPressData(); } pointerListPool.Release(list); } From 26d4854fb8a2568fd5bec845b38e644b03133ae3 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Mon, 11 Jul 2016 04:13:46 +0300 Subject: [PATCH 056/211] Optimized some usage of GetPressData(). --- .../Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs | 5 +++-- .../Assets/TouchScript/Scripts/TouchManagerInstance.cs | 9 ++++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs index be0786cbc..93343b60e 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs @@ -139,6 +139,7 @@ protected virtual PointerData getPointerData(Pointer pointer) PointerData data; if (!pointerData.TryGetValue(pointer.Id, out data)) { + var raycast = pointer.GetPressData().RaycastResult; data = new PointerData { OnTarget = true, @@ -153,8 +154,8 @@ protected virtual PointerData getPointerData(Pointer pointer) useDragThreshold = true, position = pointer.Position, pressPosition = pointer.Position, - pointerPressRaycast = pointer.GetPressData().RaycastResult, - pointerCurrentRaycast = pointer.GetPressData().RaycastResult + pointerPressRaycast = raycast, + pointerCurrentRaycast = raycast } }; pointerData.Add(pointer.Id, data); diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs index 7842b4a3c..b0d3a8aaa 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs @@ -670,7 +670,8 @@ private void updateUpdated(List pointers) continue; } list.Add(pointer); - if (pointer.GetPressData().Layer != null) pointer.GetPressData().Layer.INTERNAL_UpdatePointer(pointer); + var layer = pointer.GetPressData().Layer; + if (layer != null) layer.INTERNAL_UpdatePointer(pointer); #if TOUCHSCRIPT_DEBUG addDebugFigureForPointer(pointer); @@ -734,7 +735,8 @@ private void updateReleased(List pointers) } list.Add(pointer); pressedPointers.Remove(pointer); - if (pointer.GetPressData().Layer != null) pointer.GetPressData().Layer.INTERNAL_ReleasePointer(pointer); + var layer = pointer.GetPressData().Layer; + if (layer != null) layer.INTERNAL_ReleasePointer(pointer); #if TOUCHSCRIPT_DEBUG addDebugFigureForPointer(pointer); @@ -810,7 +812,8 @@ private void updateCancelled(List pointers) this.pointers.Remove(pointer); pressedPointers.Remove(pointer); list.Add(pointer); - if (pointer.GetPressData().Layer != null) pointer.GetPressData().Layer.INTERNAL_CancelPointer(pointer); + var layer = pointer.GetPressData().Layer; + if (layer != null) layer.INTERNAL_CancelPointer(pointer); #if TOUCHSCRIPT_DEBUG removeDebugFigureForPointer(pointer); From 081a570e2daad662079d7cf0da932380c5c4ecda Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Mon, 11 Jul 2016 04:16:28 +0300 Subject: [PATCH 057/211] Removed layer var from Gesture. --- Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs index 503a3d22e..9495bdd61 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs @@ -467,7 +467,6 @@ protected IGestureManager gestureManager private List friendlyGestures = new List(); private int numPointers; - private TouchLayer layer; private ReadOnlyCollection readonlyActivePointers; private TimedSequence pointerSequence = new TimedSequence(); private GestureManagerInstance gestureManagerInstance; @@ -677,8 +676,6 @@ internal void INTERNAL_Reset() internal void INTERNAL_PointersPressed(IList pointers) { - if (numPointers == 0) layer = pointers[0].GetPressData().Layer; - var count = pointers.Count; var total = numPointers + count; pointersNumState = PointersNumState.InRange; @@ -953,7 +950,6 @@ protected virtual void pointersCancelled(IList pointers) /// protected virtual void reset() { - layer = null; cachedScreenPosition = TouchManager.INVALID_POSITION; cachedPreviousScreenPosition = TouchManager.INVALID_POSITION; } From 4da025b810994af851167bfc9becc29fdc5cb2f1 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Mon, 11 Jul 2016 04:21:59 +0300 Subject: [PATCH 058/211] Fixed quality settings, added shadows. --- Source/ProjectSettings/QualitySettings.asset | 142 ++----------------- 1 file changed, 11 insertions(+), 131 deletions(-) diff --git a/Source/ProjectSettings/QualitySettings.asset b/Source/ProjectSettings/QualitySettings.asset index 82ccc2b31..189338d6c 100644 --- a/Source/ProjectSettings/QualitySettings.asset +++ b/Source/ProjectSettings/QualitySettings.asset @@ -7,65 +7,17 @@ QualitySettings: m_CurrentQuality: 0 m_QualitySettings: - serializedVersion: 2 - name: Fastest - pixelLightCount: 0 - shadows: 0 - shadowResolution: 0 - shadowProjection: 1 - shadowCascades: 1 - shadowDistance: 15 - shadowNearPlaneOffset: 2 - shadowCascade2Split: .333333343 - shadowCascade4Split: {x: .0666666701, y: .200000003, z: .466666669} - blendWeights: 1 - textureQuality: 1 - anisotropicTextures: 0 - antiAliasing: 0 - softParticles: 0 - softVegetation: 0 - realtimeReflectionProbes: 0 - billboardsFaceCameraPosition: 0 - vSyncCount: 0 - lodBias: .300000012 - maximumLODLevel: 0 - particleRaycastBudget: 4 - excludedTargetPlatforms: [] - - serializedVersion: 2 - name: Fast - pixelLightCount: 0 - shadows: 0 - shadowResolution: 0 - shadowProjection: 1 - shadowCascades: 1 - shadowDistance: 20 - shadowNearPlaneOffset: 2 - shadowCascade2Split: .333333343 - shadowCascade4Split: {x: .0666666701, y: .200000003, z: .466666669} - blendWeights: 2 - textureQuality: 0 - anisotropicTextures: 0 - antiAliasing: 0 - softParticles: 0 - softVegetation: 0 - realtimeReflectionProbes: 0 - billboardsFaceCameraPosition: 0 - vSyncCount: 0 - lodBias: .400000006 - maximumLODLevel: 0 - particleRaycastBudget: 4 - excludedTargetPlatforms: [] - - serializedVersion: 2 - name: Simple + name: Default pixelLightCount: 1 shadows: 1 - shadowResolution: 0 + shadowResolution: 1 shadowProjection: 1 shadowCascades: 1 - shadowDistance: 20 + shadowDistance: 50 shadowNearPlaneOffset: 2 shadowCascade2Split: .333333343 shadowCascade4Split: {x: .0666666701, y: .200000003, z: .466666669} - blendWeights: 2 + blendWeights: 1 textureQuality: 0 anisotropicTextures: 1 antiAliasing: 0 @@ -74,90 +26,18 @@ QualitySettings: realtimeReflectionProbes: 0 billboardsFaceCameraPosition: 0 vSyncCount: 0 - lodBias: .699999988 - maximumLODLevel: 0 - particleRaycastBudget: 4 - excludedTargetPlatforms: [] - - serializedVersion: 2 - name: Good - pixelLightCount: 2 - shadows: 2 - shadowResolution: 1 - shadowProjection: 1 - shadowCascades: 2 - shadowDistance: 40 - shadowNearPlaneOffset: 2 - shadowCascade2Split: .333333343 - shadowCascade4Split: {x: .0666666701, y: .200000003, z: .466666669} - blendWeights: 2 - textureQuality: 0 - anisotropicTextures: 1 - antiAliasing: 0 - softParticles: 0 - softVegetation: 1 - realtimeReflectionProbes: 1 - billboardsFaceCameraPosition: 1 - vSyncCount: 1 - lodBias: 1 - maximumLODLevel: 0 - particleRaycastBudget: 4 - excludedTargetPlatforms: [] - - serializedVersion: 2 - name: Beautiful - pixelLightCount: 3 - shadows: 2 - shadowResolution: 2 - shadowProjection: 1 - shadowCascades: 2 - shadowDistance: 70 - shadowNearPlaneOffset: 2 - shadowCascade2Split: .333333343 - shadowCascade4Split: {x: .0666666701, y: .200000003, z: .466666669} - blendWeights: 4 - textureQuality: 0 - anisotropicTextures: 2 - antiAliasing: 2 - softParticles: 1 - softVegetation: 1 - realtimeReflectionProbes: 1 - billboardsFaceCameraPosition: 1 - vSyncCount: 1 - lodBias: 1.5 - maximumLODLevel: 0 - particleRaycastBudget: 4 - excludedTargetPlatforms: [] - - serializedVersion: 2 - name: Fantastic - pixelLightCount: 4 - shadows: 2 - shadowResolution: 2 - shadowProjection: 1 - shadowCascades: 4 - shadowDistance: 40 - shadowNearPlaneOffset: 2 - shadowCascade2Split: .333333343 - shadowCascade4Split: {x: .0666666701, y: .199999988, z: .466666639} - blendWeights: 4 - textureQuality: 0 - anisotropicTextures: 2 - antiAliasing: 8 - softParticles: 1 - softVegetation: 1 - realtimeReflectionProbes: 1 - billboardsFaceCameraPosition: 1 - vSyncCount: 0 - lodBias: 2 + lodBias: .300000012 maximumLODLevel: 0 particleRaycastBudget: 4 excludedTargetPlatforms: [] m_PerPlatformDefaultQuality: - Android: 5 - BlackBerry: 5 + Android: 0 + BlackBerry: 0 Samsung TV: 0 Standalone: 0 Tizen: 0 - WP8: 5 - Web: 5 + WP8: 0 + Web: 0 WebGL: 0 - Windows Store Apps: 5 - iPhone: 5 + Windows Store Apps: 0 + iPhone: 0 From d49f0f8977cd5104d1fa544e2d49a14c465084f0 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Mon, 11 Jul 2016 04:32:28 +0300 Subject: [PATCH 059/211] Fixed an issue with UILayer. --- Source/Assets/TouchScript/Scripts/Hit/HitData.cs | 8 ++++---- Source/Assets/TouchScript/Scripts/Layers/UILayer.cs | 2 +- Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Hit/HitData.cs b/Source/Assets/TouchScript/Scripts/Hit/HitData.cs index 8764982cf..bad0add42 100644 --- a/Source/Assets/TouchScript/Scripts/Hit/HitData.cs +++ b/Source/Assets/TouchScript/Scripts/Hit/HitData.cs @@ -155,7 +155,7 @@ public Vector3 Normal /// Initializes a new instance of the struct. /// /// Target Target. - public HitData(Transform target, TouchLayer layer = null) + public HitData(Transform target, TouchLayer layer) { this.target = target; this.layer = layer; @@ -169,7 +169,7 @@ public HitData(Transform target, TouchLayer layer = null) /// Initializes a new instance of the struct from a 3D raycast. /// /// 3D raycast value. - public HitData(RaycastHit value, TouchLayer layer = null) : this(value.collider.transform, layer) + public HitData(RaycastHit value, TouchLayer layer) : this(value.collider.transform, layer) { raycastHit = value; type = HitType.Hit3D; @@ -179,7 +179,7 @@ public HitData(RaycastHit value, TouchLayer layer = null) : this(value.collider. /// Initializes a new instance of the struct from a 2D raycast. /// /// 2D raycast value. - public HitData(RaycastHit2D value, TouchLayer layer = null) : + public HitData(RaycastHit2D value, TouchLayer layer) : this(value.collider.transform, layer) { raycastHit2D = value; @@ -190,7 +190,7 @@ public HitData(RaycastHit2D value, TouchLayer layer = null) : /// Initializes a new instance of the struct from a UI raycast. /// /// UI raycast value. - public HitData(RaycastResult value, TouchLayer layer = null) : + public HitData(RaycastResult value, TouchLayer layer) : this(value.gameObject.transform, layer) { raycastResult = value; diff --git a/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs b/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs index dbe742c31..79a5049f0 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs @@ -153,7 +153,7 @@ protected override void setName() private HitTest.ObjectHitResult doHit(RaycastResult raycastHit, out HitData hit) { - hit = new HitData(raycastHit); + hit = new HitData(raycastHit, this); if (!(raycastHit.module is GraphicRaycaster)) return HitTest.ObjectHitResult.Miss; var go = raycastHit.gameObject; diff --git a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs index 4aa75b520..6e7fb01ab 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs @@ -140,7 +140,7 @@ public ProjectionParams ProjectionParams { get { - if (pressData.Layer == null) return default(ProjectionParams); + if (pressData.Layer == null) return null; return pressData.Layer.GetProjectionParams(this); } } From 55b5a0a400b1d74e0794a97c048e76027384eac4 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Mon, 11 Jul 2016 06:26:50 +0300 Subject: [PATCH 060/211] OverHelper component and example. --- .../Examples/Checkers/Checkers.unity | 445 +++++++++++++++++- .../Examples/_misc/Scripts/Highlight.cs | 44 ++ .../Examples/_misc/Scripts/Highlight.cs.meta | 12 + .../Scripts/Behaviors/OverHelper.cs | 145 ++++++ .../Scripts/Behaviors/OverHelper.cs.meta | 12 + 5 files changed, 657 insertions(+), 1 deletion(-) create mode 100644 Source/Assets/TouchScript/Examples/_misc/Scripts/Highlight.cs create mode 100644 Source/Assets/TouchScript/Examples/_misc/Scripts/Highlight.cs.meta create mode 100644 Source/Assets/TouchScript/Scripts/Behaviors/OverHelper.cs create mode 100644 Source/Assets/TouchScript/Scripts/Behaviors/OverHelper.cs.meta diff --git a/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity b/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity index 3389c7e3b..e249d9a95 100644 --- a/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity +++ b/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity @@ -85,6 +85,60 @@ NavMeshSettings: cellSize: .166666657 manualCellSize: 0 m_NavMeshData: {fileID: 0} +--- !u!1 &12619638 stripped +GameObject: + m_PrefabParentObject: {fileID: 137898, guid: b4fd857376bb94265b47bcf5b50f67fa, type: 2} + m_PrefabInternal: {fileID: 1766364327} +--- !u!114 &12619639 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 12619638} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 66f406de0e0ca42828041209d7c5f611, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &12619640 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 12619638} + 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!1 &42889166 stripped +GameObject: + m_PrefabParentObject: {fileID: 191238, guid: bb0a05fd2c374477cba1d93212b4600c, type: 2} + m_PrefabInternal: {fileID: 1404673428} +--- !u!114 &42889167 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 42889166} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 66f406de0e0ca42828041209d7c5f611, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &42889168 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 42889166} + 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!1 &62216951 GameObject: m_ObjectHideFlags: 0 @@ -314,6 +368,60 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: .5, y: .5} +--- !u!1 &292077922 stripped +GameObject: + m_PrefabParentObject: {fileID: 191238, guid: bb0a05fd2c374477cba1d93212b4600c, type: 2} + m_PrefabInternal: {fileID: 1492764721} +--- !u!114 &292077923 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 292077922} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 66f406de0e0ca42828041209d7c5f611, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &292077924 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 292077922} + 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!1 &362054473 stripped +GameObject: + m_PrefabParentObject: {fileID: 137898, guid: b4fd857376bb94265b47bcf5b50f67fa, type: 2} + m_PrefabInternal: {fileID: 746500663} +--- !u!114 &362054474 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 362054473} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 66f406de0e0ca42828041209d7c5f611, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &362054475 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 362054473} + 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 &496670577 stripped MonoBehaviour: m_PrefabParentObject: {fileID: 11490626, guid: b4fd857376bb94265b47bcf5b50f67fa, @@ -440,10 +548,64 @@ Prefab: m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: b4fd857376bb94265b47bcf5b50f67fa, type: 2} m_IsPrefabParent: 0 +--- !u!1 &575047064 stripped +GameObject: + m_PrefabParentObject: {fileID: 191238, guid: bb0a05fd2c374477cba1d93212b4600c, type: 2} + m_PrefabInternal: {fileID: 1065738468} +--- !u!114 &575047065 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 575047064} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 66f406de0e0ca42828041209d7c5f611, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &575047066 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 575047064} + 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!4 &584553677 stripped Transform: m_PrefabParentObject: {fileID: 400004, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} m_PrefabInternal: {fileID: 599866430} +--- !u!1 &588072016 stripped +GameObject: + m_PrefabParentObject: {fileID: 137898, guid: b4fd857376bb94265b47bcf5b50f67fa, type: 2} + m_PrefabInternal: {fileID: 1973376682} +--- !u!114 &588072017 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 588072016} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 66f406de0e0ca42828041209d7c5f611, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &588072018 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 588072016} + 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!1001 &599866430 Prefab: m_ObjectHideFlags: 0 @@ -499,6 +661,60 @@ Prefab: - {fileID: 9500000, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} m_ParentPrefab: {fileID: 100100000, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} m_IsPrefabParent: 0 +--- !u!1 &644314094 stripped +GameObject: + m_PrefabParentObject: {fileID: 137898, guid: b4fd857376bb94265b47bcf5b50f67fa, type: 2} + m_PrefabInternal: {fileID: 1726854358} +--- !u!114 &644314095 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 644314094} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 66f406de0e0ca42828041209d7c5f611, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &644314096 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 644314094} + 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!1 &653642804 stripped +GameObject: + m_PrefabParentObject: {fileID: 191238, guid: bb0a05fd2c374477cba1d93212b4600c, type: 2} + m_PrefabInternal: {fileID: 912356309} +--- !u!114 &653642805 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 653642804} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 66f406de0e0ca42828041209d7c5f611, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &653642806 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 653642804} + 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!1001 &690687408 Prefab: m_ObjectHideFlags: 0 @@ -541,6 +757,33 @@ Prefab: m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: bb0a05fd2c374477cba1d93212b4600c, type: 2} m_IsPrefabParent: 0 +--- !u!1 &718956936 stripped +GameObject: + m_PrefabParentObject: {fileID: 191238, guid: bb0a05fd2c374477cba1d93212b4600c, type: 2} + m_PrefabInternal: {fileID: 2071229255} +--- !u!114 &718956937 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 718956936} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 66f406de0e0ca42828041209d7c5f611, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &718956938 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 718956936} + 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!1 &721853795 stripped GameObject: m_PrefabParentObject: {fileID: 100006, guid: 648250201fabe574b8591ee45cddcf4a, type: 3} @@ -938,6 +1181,33 @@ CanvasRenderer: Transform: m_PrefabParentObject: {fileID: 437898, guid: b4fd857376bb94265b47bcf5b50f67fa, type: 2} m_PrefabInternal: {fileID: 997919739} +--- !u!1 &909805779 stripped +GameObject: + m_PrefabParentObject: {fileID: 191238, guid: bb0a05fd2c374477cba1d93212b4600c, type: 2} + m_PrefabInternal: {fileID: 1975095845} +--- !u!114 &909805780 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 909805779} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 66f406de0e0ca42828041209d7c5f611, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &909805781 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 909805779} + 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!1001 &912356309 Prefab: m_ObjectHideFlags: 0 @@ -1109,6 +1379,33 @@ Prefab: m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: bb0a05fd2c374477cba1d93212b4600c, type: 2} m_IsPrefabParent: 0 +--- !u!1 &1100161185 stripped +GameObject: + m_PrefabParentObject: {fileID: 137898, guid: b4fd857376bb94265b47bcf5b50f67fa, type: 2} + m_PrefabInternal: {fileID: 1242757937} +--- !u!114 &1100161186 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1100161185} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 66f406de0e0ca42828041209d7c5f611, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &1100161187 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1100161185} + 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!1 &1138005899 GameObject: m_ObjectHideFlags: 0 @@ -1468,6 +1765,33 @@ Transform: Transform: m_PrefabParentObject: {fileID: 491238, guid: bb0a05fd2c374477cba1d93212b4600c, type: 2} m_PrefabInternal: {fileID: 1404673428} +--- !u!1 &1484313264 stripped +GameObject: + m_PrefabParentObject: {fileID: 191238, guid: bb0a05fd2c374477cba1d93212b4600c, type: 2} + m_PrefabInternal: {fileID: 690687408} +--- !u!114 &1484313265 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1484313264} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 66f406de0e0ca42828041209d7c5f611, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &1484313266 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1484313264} + 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!1001 &1492764721 Prefab: m_ObjectHideFlags: 0 @@ -1644,6 +1968,33 @@ MonoBehaviour: m_EffectColor: {r: 0, g: 0, b: 0, a: 1} m_EffectDistance: {x: 1, y: -1} m_UseGraphicAlpha: 1 +--- !u!1 &1556569441 stripped +GameObject: + m_PrefabParentObject: {fileID: 137898, guid: b4fd857376bb94265b47bcf5b50f67fa, type: 2} + m_PrefabInternal: {fileID: 997919739} +--- !u!114 &1556569442 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1556569441} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 66f406de0e0ca42828041209d7c5f611, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &1556569443 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1556569441} + 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!1001 &1590395755 Prefab: m_ObjectHideFlags: 0 @@ -1909,6 +2260,99 @@ Prefab: m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: b4fd857376bb94265b47bcf5b50f67fa, type: 2} m_IsPrefabParent: 0 +--- !u!1 &1841925474 stripped +GameObject: + m_PrefabParentObject: {fileID: 137898, guid: b4fd857376bb94265b47bcf5b50f67fa, type: 2} + m_PrefabInternal: {fileID: 556842199} +--- !u!114 &1841925475 +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: 66f406de0e0ca42828041209d7c5f611, type: 3} + 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} + 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!1 &1890351926 stripped +GameObject: + m_PrefabParentObject: {fileID: 137898, guid: b4fd857376bb94265b47bcf5b50f67fa, type: 2} + m_PrefabInternal: {fileID: 1525929576} +--- !u!114 &1890351927 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1890351926} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 66f406de0e0ca42828041209d7c5f611, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &1890351928 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1890351926} + 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!1 &1908498623 stripped +GameObject: + m_PrefabParentObject: {fileID: 191238, guid: bb0a05fd2c374477cba1d93212b4600c, type: 2} + m_PrefabInternal: {fileID: 813591731} +--- !u!114 &1908498624 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1908498623} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 66f406de0e0ca42828041209d7c5f611, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &1908498625 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1908498623} + 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!4 &1953507434 stripped Transform: m_PrefabParentObject: {fileID: 437898, guid: b4fd857376bb94265b47bcf5b50f67fa, type: 2} @@ -2122,7 +2566,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 38e07bff8743d4ee38bf724a7a2b4cbb, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 diff --git a/Source/Assets/TouchScript/Examples/_misc/Scripts/Highlight.cs b/Source/Assets/TouchScript/Examples/_misc/Scripts/Highlight.cs new file mode 100644 index 000000000..a7d3e665f --- /dev/null +++ b/Source/Assets/TouchScript/Examples/_misc/Scripts/Highlight.cs @@ -0,0 +1,44 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using UnityEngine; +using System.Collections; +using TouchScript.Behaviors; + +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; + } + +} diff --git a/Source/Assets/TouchScript/Examples/_misc/Scripts/Highlight.cs.meta b/Source/Assets/TouchScript/Examples/_misc/Scripts/Highlight.cs.meta new file mode 100644 index 000000000..967ec9b42 --- /dev/null +++ b/Source/Assets/TouchScript/Examples/_misc/Scripts/Highlight.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f91ca003806bd40f7938a006eee71921 +timeCreated: 1468203566 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/OverHelper.cs b/Source/Assets/TouchScript/Scripts/Behaviors/OverHelper.cs new file mode 100644 index 000000000..879deabdb --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Behaviors/OverHelper.cs @@ -0,0 +1,145 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using System; +using System.Collections.Generic; +using TouchScript.Pointers; +using TouchScript.Utils; +using UnityEngine; + +namespace TouchScript.Behaviors +{ + + /// + /// 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")] + public class OverHelper : MonoBehaviour + { + + #region Events + + /// + /// Occurs when the first (non-pressed) touch enters the area of the GameObject. + /// + public event EventHandler Over; + + /// + /// Occurs when the last touch leaves the area of the GameObject. + /// + public event EventHandler Out; + + #endregion + + #region Private variable + + private HashSet pointers = new HashSet(); + + #endregion + + #region Unity methods + + private void OnEnable() + { + TouchManager.Instance.PointersAdded += pointersAddedHandler; + TouchManager.Instance.PointersUpdated += pointersUpdatedHandler; + TouchManager.Instance.PointersReleased += pointersReleasedHandler; + TouchManager.Instance.PointersRemoved += pointersRemovedHandler; + TouchManager.Instance.PointersCancelled += pointersRemovedHandler; + } + + private void OnDisable() + { + if (TouchManager.Instance == null) return; + TouchManager.Instance.PointersAdded -= pointersAddedHandler; + TouchManager.Instance.PointersUpdated -= pointersUpdatedHandler; + TouchManager.Instance.PointersReleased -= pointersReleasedHandler; + TouchManager.Instance.PointersRemoved -= pointersRemovedHandler; + TouchManager.Instance.PointersCancelled -= pointersRemovedHandler; + } + + #endregion + + #region Private functions + + private void dispatchOver() + { + if (Over != null) Over.InvokeHandleExceptions(this, EventArgs.Empty); + } + + private void dispatchOut() + { + if (Out != null) Out.InvokeHandleExceptions(this, EventArgs.Empty); + } + + #endregion + + #region Callbacks + + private void pointersAddedHandler(object sender, PointerEventArgs pointerEventArgs) + { + var over = pointers.Count; + var p = pointerEventArgs.Pointers; + var count = p.Count; + for (var i = 0; i < count; i++) + { + var pointer = p[i]; + if (PointerUtils.IsPointerOnTarget(pointer, transform)) pointers.Add(pointer.Id); + } + + if (over == 0 && pointers.Count > 0) dispatchOver(); + } + + private void pointersUpdatedHandler(object sender, PointerEventArgs pointerEventArgs) + { + var over = pointers.Count; + var p = pointerEventArgs.Pointers; + var count = p.Count; + for (var i = 0; i < count; i++) + { + var pointer = p[i]; + if ((pointer.Flags & Pointer.FLAG_INCONTACT) != 0) continue; // we ignore pressed pointers + if (PointerUtils.IsPointerOnTarget(pointer, transform)) pointers.Add(pointer.Id); + else pointers.Remove(pointer.Id); + } + + if (over == 0 && pointers.Count > 0) dispatchOver(); + else if (over > 0 && pointers.Count == 0) dispatchOut(); + } + + private void pointersReleasedHandler(object sender, PointerEventArgs pointerEventArgs) + { + var over = pointers.Count; + var p = pointerEventArgs.Pointers; + var count = p.Count; + for (var i = 0; i < count; i++) + { + var pointer = p[i]; + if (PointerUtils.IsPointerOnTarget(pointer, transform)) pointers.Add(pointer.Id); + else pointers.Remove(pointer.Id); + } + + if (over == 0 && pointers.Count > 0) dispatchOver(); + else if (over > 0 && pointers.Count == 0) dispatchOut(); + } + + private void pointersRemovedHandler(object sender, PointerEventArgs pointerEventArgs) + { + var over = pointers.Count; + var p = pointerEventArgs.Pointers; + var count = p.Count; + for (var i = 0; i < count; i++) + { + var pointer = p[i]; + pointers.Remove(pointer.Id); + } + + if (over > 0 && pointers.Count == 0) dispatchOut(); + } + + #endregion + + } +} diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/OverHelper.cs.meta b/Source/Assets/TouchScript/Scripts/Behaviors/OverHelper.cs.meta new file mode 100644 index 000000000..e4e79dceb --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Behaviors/OverHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 66f406de0e0ca42828041209d7c5f611 +timeCreated: 1468201700 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From 34ff2829a72bb99be58d50edb4e7a61316be8165 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Mon, 11 Jul 2016 06:40:47 +0300 Subject: [PATCH 061/211] Using nonalloc API for CameraLayer and CameraLayer2D, fixed defines for 5.4+. --- .../Examples/_misc/Scripts/Runner.cs | 6 +-- .../TouchScript/Scripts/Layers/CameraLayer.cs | 54 +++++++++++++------ .../Scripts/Layers/CameraLayer2D.cs | 37 +++++++++---- 3 files changed, 69 insertions(+), 28 deletions(-) diff --git a/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs b/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs index 7bd3c99cf..b7b61c9b7 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs +++ b/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs @@ -4,7 +4,7 @@ using UnityEngine; using TouchScript.Layers; -#if UNITY_5_3 +#if UNITY_5_3_OR_NEWER using UnityEngine.SceneManagement; #endif @@ -20,7 +20,7 @@ public class Runner : MonoBehaviour public void LoadNextLevel() { -#if UNITY_5_3 +#if UNITY_5_3_OR_NEWER SceneManager.LoadScene((SceneManager.GetActiveScene().buildIndex + 1) % SceneManager.sceneCountInBuildSettings); #else Application.LoadLevel((Application.loadedLevel + 1)%Application.levelCount); @@ -37,7 +37,7 @@ private void Awake() layer = GetComponent(); -#if UNITY_5_3 +#if UNITY_5_3_OR_NEWER if (SceneManager.GetActiveScene().name == "Examples" && SceneManager.sceneCountInBuildSettings > 1) #else if (Application.loadedLevelName == "Examples" && Application.levelCount > 1) diff --git a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs index f069424b6..505f455cf 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs @@ -2,6 +2,7 @@ * @author Valentin Simonov / http://va.lent.in/ */ +using System; using System.Collections.Generic; using TouchScript.Hit; using UnityEngine; @@ -16,12 +17,16 @@ namespace TouchScript.Layers public class CameraLayer : CameraLayerBase { #region Private variables - +#if UNITY_5_3_OR_NEWER + private RaycastHit[] raycastHits = new RaycastHit[20]; +#endif private List sortedHits = new List(20); private Transform cachedTransform; private List tmpHitTestList = new List(10); - #endregion + private RaycastHitComparer comparer; + +#endregion #region Unity methods @@ -32,26 +37,31 @@ protected override void Awake() if (!Application.isPlaying) return; cachedTransform = GetComponent(); + comparer = new RaycastHitComparer(cachedTransform); } - #endregion +#endregion - #region Protected functions +#region Protected functions /// protected override LayerHitResult castRay(Ray ray, out HitData hit) { hit = default(HitData); +#if UNITY_5_3_OR_NEWER + var count = Physics.RaycastNonAlloc(ray, raycastHits, float.PositiveInfinity, LayerMask); +#else var raycastHits = Physics.RaycastAll(ray, float.PositiveInfinity, LayerMask); + var count = raycastHits.Length; +#endif - if (raycastHits.Length == 0) return LayerHitResult.Miss; - if (raycastHits.Length > 1) + if (count == 0) return LayerHitResult.Miss; + if (count > 1) { - sortHits(raycastHits); + sortHits(raycastHits, count); RaycastHit raycastHit = default(RaycastHit); - var i = 0; - while (i < sortedHits.Count) + for (var i = 0; i < count; i++) { raycastHit = sortedHits[i]; switch (doHit(raycastHit, out hit)) @@ -61,7 +71,6 @@ protected override LayerHitResult castRay(Ray ray, out HitData hit) case HitTest.ObjectHitResult.Discard: return LayerHitResult.Miss; } - i++; } } else @@ -99,20 +108,33 @@ private HitTest.ObjectHitResult doHit(RaycastHit raycastHit, out HitData hit) return hitResult; } - private void sortHits(RaycastHit[] hits) + private void sortHits(RaycastHit[] hits, int count) { - var cameraPos = cachedTransform.position; sortedHits.Clear(); - sortedHits.AddRange(hits); - sortedHits.Sort((a, b) => + for (var i = 0; i < count; i++) sortedHits.Add(hits[i]); + sortedHits.Sort(comparer); + } + + #endregion + + private class RaycastHitComparer : IComparer + { + private Transform transform; + + public RaycastHitComparer(Transform transform) { + this.transform = transform; + } + + public int Compare(RaycastHit a, RaycastHit b) + { + var cameraPos = transform.position; if (a.collider.transform == b.collider.transform) return 0; var distA = (a.point - cameraPos).sqrMagnitude; var distB = (b.point - cameraPos).sqrMagnitude; return distA < distB ? -1 : 1; - }); + } } - #endregion } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs b/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs index 5d5d05551..ac48ed779 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs @@ -21,10 +21,14 @@ public class CameraLayer2D : CameraLayerBase [HideInInspector] private int[] layerIds = new int[0]; + private RaycastHit2D[] raycastHits = new RaycastHit2D[20]; + private Dictionary layerById = new Dictionary(); private List sortedHits = new List(20); private List tmpHitTestList = new List(10); + private RaycastHit2DComparer comparer; + #endregion #region Unity methods @@ -43,6 +47,8 @@ protected virtual void OnEnable() if (layerById.ContainsKey(value)) continue; layerById.Add(value, i); } + + comparer = new RaycastHit2DComparer(layerById); } #endregion @@ -53,12 +59,12 @@ protected virtual void OnEnable() protected override LayerHitResult castRay(Ray ray, out HitData hit) { hit = default(HitData); - var raycastHits = Physics2D.GetRayIntersectionAll(ray, float.PositiveInfinity, LayerMask); + var count = Physics2D.GetRayIntersectionNonAlloc(ray, raycastHits, float.PositiveInfinity, LayerMask); - if (raycastHits.Length == 0) return LayerHitResult.Miss; - if (raycastHits.Length > 1) + if (count == 0) return LayerHitResult.Miss; + if (count > 1) { - sortHits(raycastHits); + sortHits(raycastHits, count); RaycastHit2D raycastHit = default(RaycastHit2D); var i = 0; @@ -111,11 +117,25 @@ private HitTest.ObjectHitResult doHit(RaycastHit2D raycastHit, out HitData hit) return hitResult; } - private void sortHits(RaycastHit2D[] hits) + private void sortHits(RaycastHit2D[] hits, int count) { sortedHits.Clear(); - sortedHits.AddRange(hits); - sortedHits.Sort((a, b) => + for (var i = 0; i < count; i++) sortedHits.Add(hits[i]); + sortedHits.Sort(comparer); + } + + #endregion + + private class RaycastHit2DComparer : IComparer + { + private Dictionary layerById; + + public RaycastHit2DComparer(Dictionary layerById) + { + this.layerById = layerById; + } + + public int Compare(RaycastHit2D a, RaycastHit2D b) { if (a.collider.transform == b.collider.transform) return 0; @@ -133,9 +153,8 @@ private void sortHits(RaycastHit2D[] hits) } return a.distance < b.distance ? -1 : 1; - }); + } } - #endregion } } From d4b42542200b3eaffc198420bff0e8946ae4d624 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Mon, 11 Jul 2016 06:58:59 +0300 Subject: [PATCH 062/211] Fixed wrong OverData if fetched during Added event. --- Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs index 6e7fb01ab..4c3132262 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs @@ -248,6 +248,7 @@ internal virtual void INTERNAL_Reset() INTERNAL_ClearPressData(); position = newPosition = PreviousPosition = Vector2.zero; flags = newFlags = PreviousFlags = 0; + overDataIsDirty = true; } internal virtual void INTERNAL_FrameStarted() @@ -273,6 +274,8 @@ internal int INTERNAL_Release() internal void INTERNAL_SetPressData(HitData data) { pressData = data; + overData = data; + overDataIsDirty = false; } internal void INTERNAL_ClearPressData() From 988ed0ba89219568eac1fa68f1dc21a9f1282267 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Mon, 11 Jul 2016 07:37:59 +0300 Subject: [PATCH 063/211] Cache GestureStateChangeEventArgs in Gesture. --- .../TouchScript/Scripts/Gestures/Gesture.cs | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs index 9495bdd61..97010d0c1 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs @@ -6,7 +6,6 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using TouchScript.Hit; -using TouchScript.Layers; using TouchScript.Utils; using TouchScript.Utils.Attributes; using TouchScript.Pointers; @@ -283,8 +282,7 @@ private set } if (stateChangedInvoker != null) - stateChangedInvoker.InvokeHandleExceptions(this, - new GestureStateChangeEventArgs(state, PreviousState)); + stateChangedInvoker.InvokeHandleExceptions(this, GestureStateChangeEventArgs.GetCachedEventArgs(state, PreviousState)); if (useSendMessage && sendStateChangeMessages && SendMessageTarget != null) sendMessageTarget.SendMessage(STATE_CHANGE_MESSAGE, this, SendMessageOptions.DontRequireReceiver); } @@ -1051,7 +1049,7 @@ private void requiredToFailGestureStateChangedHandler(object sender, GestureStat } /// - /// Event arguments for Gesture events + /// Event arguments for Gesture state change events. /// public class GestureStateChangeEventArgs : EventArgs { @@ -1065,15 +1063,26 @@ public class GestureStateChangeEventArgs : EventArgs /// public Gesture.GestureState State { get; private set; } + private static GestureStateChangeEventArgs instance; + /// /// Initializes a new instance of the class. /// + public GestureStateChangeEventArgs() {} + + /// + /// Returns cached instance of EventArgs. + /// This cached EventArgs is reused throughout the library not to alocate new ones on every call. + /// /// Current gesture state. /// Previous gesture state. - public GestureStateChangeEventArgs(Gesture.GestureState state, Gesture.GestureState previousState) + /// Cached EventArgs object. + public static GestureStateChangeEventArgs GetCachedEventArgs(Gesture.GestureState state, Gesture.GestureState previousState) { - State = state; - PreviousState = previousState; + if (instance == null) instance = new GestureStateChangeEventArgs(); + instance.State = state; + instance.PreviousState = previousState; + return instance; } } } \ No newline at end of file From de33dea951bea63280be9d0cd4c871f418e0fc69 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Mon, 11 Jul 2016 07:38:18 +0300 Subject: [PATCH 064/211] Removed unnecessary Hashset.Contains checks. --- .../Scripts/TouchManagerInstance.cs | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs index b0d3a8aaa..061be7b55 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs @@ -394,7 +394,7 @@ internal void INTERNAL_UpdatePointer(int id) } } - if (!pointersUpdated.Contains(id)) pointersUpdated.Add(id); + pointersUpdated.Add(id); } } @@ -417,11 +417,12 @@ internal void INTERNAL_PressPointer(int id) return; } } - if (!pointersPressed.Contains(id)) pointersPressed.Add(id); #if TOUCHSCRIPT_DEBUG - else + if (!pointersPressed.Add(id)) Debug.LogWarning("TouchScript > Pointer with id [" + id + "] is requested to PRESS more than once this frame."); +#else + pointersPressed.Add(id); #endif } } @@ -446,11 +447,12 @@ internal void INTERNAL_ReleasePointer(int id) return; } } - if (!pointersReleased.Contains(id)) pointersReleased.Add(id); #if TOUCHSCRIPT_DEBUG - else + if (!pointersReleased.Add(id)) Debug.LogWarning("TouchScript > Pointer with id [" + id + "] is requested to END more than once this frame."); +#else + pointersReleased.Add(id); #endif } } @@ -475,11 +477,12 @@ internal void INTERNAL_RemovePointer(int id) return; } } - if (!pointersRemoved.Contains(id)) pointersRemoved.Add(pointer.Id); #if TOUCHSCRIPT_DEBUG - else + if (!pointersRemoved.Add(pointer.Id)) Debug.LogWarning("TouchScript > Pointer with id [" + id + "] is requested to REMOVE more than once this frame."); +#else + pointersRemoved.Add(pointer.Id); #endif } } @@ -504,11 +507,12 @@ internal void INTERNAL_CancelPointer(int id) return; } } - if (!pointersCancelled.Contains(id)) pointersCancelled.Add(pointer.Id); #if TOUCHSCRIPT_DEBUG - else + if (!pointersCancelled.Add(pointer.Id)) Debug.LogWarning("TouchScript > Pointer with id [" + id + "] is requested to CANCEL more than once this frame."); +#else + pointersCancelled.Add(pointer.Id); #endif } } From eed899fd71af4ef8221bb58c8c8feb0f1c70e071 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Mon, 11 Jul 2016 08:03:19 +0300 Subject: [PATCH 065/211] Renamed Gesture.ScreenPositionHitData to GetScreenPositionHitData(). --- .../Examples/Taps/Scripts/Spawn.cs | 2 +- .../TouchScript/Scripts/Gestures/Gesture.cs | 26 +++++++++---------- .../Scripts/Gestures/LongPressGesture.cs | 2 +- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Source/Assets/TouchScript/Examples/Taps/Scripts/Spawn.cs b/Source/Assets/TouchScript/Examples/Taps/Scripts/Spawn.cs index 6ec1124fe..7f71494e5 100644 --- a/Source/Assets/TouchScript/Examples/Taps/Scripts/Spawn.cs +++ b/Source/Assets/TouchScript/Examples/Taps/Scripts/Spawn.cs @@ -28,7 +28,7 @@ private void OnDisable() private void tappedHandler(object sender, EventArgs e) { var gesture = sender as TapGesture; - HitData hit = gesture.ScreenPositionHitData; + HitData hit = gesture.GetScreenPositionHitData(); var cube = Instantiate(CubePrefab) as Transform; cube.parent = Container; diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs index 97010d0c1..2d080477c 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs @@ -357,16 +357,6 @@ public Vector2 PreviousNormalizedScreenPosition } } - public HitData ScreenPositionHitData - { - get - { - HitData hit; - touchManager.GetHitTarget(ScreenPosition, out hit); - return hit; - } - } - /// /// Gets list of gesture's active pointers. /// @@ -596,6 +586,16 @@ public void Cancel() Cancel(false, false); } + /// + /// Returns for gesture's , i.e. what is right beneath it. + /// + public virtual HitData GetScreenPositionHitData() + { + HitData hit; + touchManager.GetHitTarget(ScreenPosition, out hit); + return hit; + } + #endregion #region Unity methods @@ -614,7 +614,7 @@ protected virtual void Awake() } /// - /// Unity3d Start handler. + /// Unity Start handler. /// protected virtual void OnEnable() { @@ -632,7 +632,7 @@ protected virtual void OnEnable() } /// - /// Unity3d OnDisable handler. + /// Unity OnDisable handler. /// protected virtual void OnDisable() { @@ -640,7 +640,7 @@ protected virtual void OnDisable() } /// - /// Unity3d OnDestroy handler. + /// Unity OnDestroy handler. /// protected virtual void OnDestroy() { diff --git a/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs index 56c087ec9..89992a32d 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs @@ -169,7 +169,7 @@ private IEnumerator wait() if (State == GestureState.Possible) { - if (ScreenPositionHitData.Target.IsChildOf(cachedTransform)) + if (GetScreenPositionHitData().Target.IsChildOf(cachedTransform)) { setState(GestureState.Recognized); } From f1f63339183aa8472e39c447dd8f1d37efea5f89 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Mon, 11 Jul 2016 08:26:39 +0300 Subject: [PATCH 066/211] Abstracted HitTest logic for layers in one function. --- .../TouchScript/Scripts/Layers/CameraLayer.cs | 16 +------ .../Scripts/Layers/CameraLayer2D.cs | 17 +------- .../Scripts/Layers/FullscreenLayer.cs | 18 +++----- .../TouchScript/Scripts/Layers/TouchLayer.cs | 43 ++++++++++++++----- .../TouchScript/Scripts/Layers/UILayer.cs | 18 +------- 5 files changed, 41 insertions(+), 71 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs index 505f455cf..c44f587d3 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs @@ -22,7 +22,6 @@ public class CameraLayer : CameraLayerBase #endif private List sortedHits = new List(20); private Transform cachedTransform; - private List tmpHitTestList = new List(10); private RaycastHitComparer comparer; @@ -92,20 +91,7 @@ protected override LayerHitResult castRay(Ray ray, out HitData hit) private HitTest.ObjectHitResult doHit(RaycastHit raycastHit, out HitData hit) { hit = new HitData(raycastHit, this); - raycastHit.transform.GetComponents(tmpHitTestList); - var count = tmpHitTestList.Count; - if (count == 0) return HitTest.ObjectHitResult.Hit; - - var hitResult = HitTest.ObjectHitResult.Hit; - for (var i = 0; i < count; i++) - { - var test = tmpHitTestList[i]; - if (!test.enabled) continue; - hitResult = test.IsHit(hit); - if (hitResult == HitTest.ObjectHitResult.Miss || hitResult == HitTest.ObjectHitResult.Discard) break; - } - - return hitResult; + return checkHitFilters(hit); } private void sortHits(RaycastHit[] hits, int count) diff --git a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs b/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs index ac48ed779..e5dea67d9 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs @@ -25,7 +25,6 @@ public class CameraLayer2D : CameraLayerBase private Dictionary layerById = new Dictionary(); private List sortedHits = new List(20); - private List tmpHitTestList = new List(10); private RaycastHit2DComparer comparer; @@ -100,21 +99,7 @@ protected override LayerHitResult castRay(Ray ray, out HitData hit) private HitTest.ObjectHitResult doHit(RaycastHit2D raycastHit, out HitData hit) { hit = new HitData(raycastHit, this); - raycastHit.transform.GetComponents(tmpHitTestList); - var count = tmpHitTestList.Count; - if (count == 0) return HitTest.ObjectHitResult.Hit; - - - var hitResult = HitTest.ObjectHitResult.Hit; - for (var i = 0; i < count; i++) - { - var test = tmpHitTestList[i]; - if (!test.enabled) continue; - hitResult = test.IsHit(hit); - if (hitResult == HitTest.ObjectHitResult.Miss || hitResult == HitTest.ObjectHitResult.Discard) break; - } - - return hitResult; + return checkHitFilters(hit); } private void sortHits(RaycastHit2D[] hits, int count) diff --git a/Source/Assets/TouchScript/Scripts/Layers/FullscreenLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/FullscreenLayer.cs index 33d497521..2630b3f28 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/FullscreenLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/FullscreenLayer.cs @@ -94,7 +94,6 @@ public override Vector3 WorldProjectionNormal private Camera _camera; private Transform cameraTransform; - private List tmpHitTestList = new List(10); #endregion @@ -111,20 +110,15 @@ public override LayerHitResult Hit(Vector2 position, out HitData hit) } hit = new HitData(transform, this); - transform.GetComponents(tmpHitTestList); - var count = tmpHitTestList.Count; - if (count == 0) return LayerHitResult.Hit; - - for (var i = 0; i < count; i++) + switch (checkHitFilters(hit)) { - var test = tmpHitTestList[i]; - if (!test.enabled) continue; - var hitResult = test.IsHit(hit); - if (hitResult == HitTest.ObjectHitResult.Miss || hitResult == HitTest.ObjectHitResult.Discard) + case HitTest.ObjectHitResult.Hit: + return LayerHitResult.Hit; + case HitTest.ObjectHitResult.Error: + return LayerHitResult.Error; + default: return LayerHitResult.Miss; } - - return LayerHitResult.Hit; } #endregion diff --git a/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs index b13d93967..d0ef9959a 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs @@ -7,6 +7,7 @@ using TouchScript.Utils; using UnityEngine; using System.Collections; +using System.Collections.Generic; using TouchScript.Pointers; namespace TouchScript.Layers @@ -90,6 +91,17 @@ public virtual Vector3 WorldProjectionNormal #endregion + #region Private variables + + /// + /// The layer projection parameters. + /// + protected ProjectionParams layerProjectionParams; + + private List tmpHitTestList = new List(10); + + #endregion + #region Public methods /// @@ -117,15 +129,6 @@ public virtual LayerHitResult Hit(Vector2 position, out HitData hit) #endregion - #region Private variables - - /// - /// The layer projection parameters. - /// - protected ProjectionParams layerProjectionParams; - - #endregion - #region Unity methods /// @@ -175,7 +178,7 @@ internal bool INTERNAL_PressPointer(Pointer pointer) { HitData hit; if (Delegate != null && Delegate.ShouldReceivePointer(this, pointer) == false) return false; - var result = beginPointer(pointer, out hit); + var result = pressPointer(pointer, out hit); if (result == LayerHitResult.Hit) { pointer.INTERNAL_SetPressData(hit); @@ -200,6 +203,24 @@ internal void INTERNAL_CancelPointer(Pointer pointer) #region Protected functions + protected HitTest.ObjectHitResult checkHitFilters(HitData hit) + { + hit.Target.GetComponents(tmpHitTestList); + var count = tmpHitTestList.Count; + if (count == 0) return HitTest.ObjectHitResult.Hit; + + var hitResult = HitTest.ObjectHitResult.Hit; + for (var i = 0; i < count; i++) + { + var test = tmpHitTestList[i]; + if (!test.enabled) continue; + hitResult = test.IsHit(hit); + if (hitResult == HitTest.ObjectHitResult.Miss || hitResult == HitTest.ObjectHitResult.Discard) break; + } + + return hitResult; + } + /// /// Updates pointer layers's name. /// @@ -215,7 +236,7 @@ protected virtual void setName() /// Hit result. /// , if an object is hit, or otherwise. /// This method may also be used to update some internal state or resend this event somewhere. - protected virtual LayerHitResult beginPointer(Pointer pointer, out HitData hit) + protected virtual LayerHitResult pressPointer(Pointer pointer, out HitData hit) { var result = Hit(pointer.Position, out hit); return result; diff --git a/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs b/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs index 79a5049f0..1ecd35019 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs @@ -31,8 +31,6 @@ public class UILayer : TouchLayer [NonSerialized] private List raycastResultCache = new List(20); - private List tmpHitTestList = new List(10); - private PointerEventData pointerDataCache; private EventSystem eventSystem; private Dictionary projectionParamsCache = new Dictionary(); @@ -156,21 +154,7 @@ private HitTest.ObjectHitResult doHit(RaycastResult raycastHit, out HitData hit) hit = new HitData(raycastHit, this); if (!(raycastHit.module is GraphicRaycaster)) return HitTest.ObjectHitResult.Miss; - var go = raycastHit.gameObject; - if (go == null) return HitTest.ObjectHitResult.Miss; - go.GetComponents(tmpHitTestList); - var count = tmpHitTestList.Count; - if (count == 0) return HitTest.ObjectHitResult.Hit; - - var hitResult = HitTest.ObjectHitResult.Hit; - for (var i = 0; i < count; i++) - { - var test = tmpHitTestList[i]; - if (!test.enabled) continue; - hitResult = test.IsHit(hit); - if (hitResult == HitTest.ObjectHitResult.Miss || hitResult == HitTest.ObjectHitResult.Discard) break; - } - return hitResult; + return checkHitFilters(hit); } #endregion From ae5478a72ff0457d8da4c876f407b87573fa6fae Mon Sep 17 00:00:00 2001 From: Marlon Ruvalcaba Date: Wed, 13 Jul 2016 14:00:23 -0500 Subject: [PATCH 067/211] *Fix, If the user isn't using ShowTouchId and ShowTags, clean the text, to avoid displaying the default text or last one. --- .../TouchScript/Scripts/Behaviors/Visualizer/TouchProxy.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/TouchProxy.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/TouchProxy.cs index ebccbbc0c..ab87188c5 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/TouchProxy.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/TouchProxy.cs @@ -34,7 +34,11 @@ protected override void updateOnce(TouchPoint touch) gameObject.name = stringBuilder.ToString(); if (Text == null) return; - if (!ShowTouchId && !ShowTags) return; + if (!ShowTouchId && !ShowTags) + { + Text.text = ""; + return; + } stringBuilder.Length = 0; if (ShowTouchId) From 81211e4400bfe3cc068a3ab3837e70656fcf25fa Mon Sep 17 00:00:00 2001 From: Maros Galik Date: Thu, 21 Jul 2016 15:02:53 +0200 Subject: [PATCH 068/211] UILayer simple excludes touches fromm all Canvas elements. However, one would like to decide which UI elements should be touchable and which not - adding a public LayerMask to specify UI Layers which are touchable --- .../TouchScript/Scripts/Layers/UILayer.cs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs b/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs index 785f3b777..0a3f5d6e3 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs @@ -21,12 +21,25 @@ public class UILayer : TouchLayer { #region Public properties + /// + /// Gets or sets the layer mask which is used to select layers which should be touchable from this layer. + /// + /// A mask to include/exclude objects from possibly touchable list. + public LayerMask LayerMask + { + get { return layerMask; } + set { layerMask = value; } + } + #endregion #region Private variables private static UILayer instance; + [SerializeField] + private LayerMask layerMask = -1; + [NonSerialized] private List raycastResultCache = new List(20); @@ -157,6 +170,9 @@ private HitTest.ObjectHitResult doHit(RaycastResult raycastHit, out TouchHit hit if (!(raycastHit.module is GraphicRaycaster)) return HitTest.ObjectHitResult.Miss; var go = raycastHit.gameObject; if (go == null) return HitTest.ObjectHitResult.Miss; + + if (((1 << go.layer) & LayerMask) == 0) return HitTest.ObjectHitResult.Miss; + go.GetComponents(tmpHitTestList); var count = tmpHitTestList.Count; if (count == 0) return HitTest.ObjectHitResult.Hit; @@ -174,4 +190,4 @@ private HitTest.ObjectHitResult doHit(RaycastResult raycastHit, out TouchHit hit #endregion } -} \ No newline at end of file +} From ff9fcd806fb65d73b0565992a189d5779383b124 Mon Sep 17 00:00:00 2001 From: David Haynes Date: Mon, 1 Aug 2016 13:06:36 +0100 Subject: [PATCH 069/211] Add Unity 5.4 conditional compilation directives --- .../Assets/TouchScript/Examples/_misc/Scripts/Runner.cs | 8 ++++---- .../Scripts/Devices/Display/GenericDisplayDevice.cs | 4 +++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs b/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs index b474f7084..c59dd0da3 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs +++ b/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs @@ -4,7 +4,7 @@ using UnityEngine; using TouchScript.Layers; -#if UNITY_5_3 +#if UNITY_5_3 || UNITY_5_4 using UnityEngine.SceneManagement; #endif @@ -17,7 +17,7 @@ public class Runner : MonoBehaviour public void LoadNextLevel() { -#if UNITY_5_3 +#if UNITY_5_3 || UNITY_5_4 SceneManager.LoadScene((SceneManager.GetActiveScene().buildIndex + 1) % SceneManager.sceneCountInBuildSettings); #else Application.LoadLevel((Application.loadedLevel + 1)%Application.levelCount); @@ -34,7 +34,7 @@ private void Awake() layer = GetComponent(); -#if UNITY_5_3 +#if UNITY_5_3 || UNITY_5_4 if (SceneManager.GetActiveScene().name == "Examples" && SceneManager.sceneCountInBuildSettings > 1) #else if (Application.loadedLevelName == "Examples" && Application.levelCount > 1) @@ -49,4 +49,4 @@ private void OnLevelWasLoaded(int num) TouchManager.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 733f28f7e..1ac9307e4 100644 --- a/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs +++ b/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs @@ -46,10 +46,12 @@ protected override void OnEnable() case RuntimePlatform.OSXEditor: case RuntimePlatform.OSXDashboardPlayer: case RuntimePlatform.OSXPlayer: +#if !UNITY_5_4 + case RuntimePlatform.WindowsWebPlayer: case RuntimePlatform.OSXWebPlayer: +#endif case RuntimePlatform.WindowsEditor: case RuntimePlatform.WindowsPlayer: - case RuntimePlatform.WindowsWebPlayer: case RuntimePlatform.LinuxPlayer: { var width = Mathf.Max(Screen.currentResolution.width, Screen.currentResolution.height); From 5ad7b5e94bcf2c642eb754472587b9e058629436 Mon Sep 17 00:00:00 2001 From: David Haynes Date: Mon, 1 Aug 2016 13:24:19 +0100 Subject: [PATCH 070/211] OnLevelLoaded is deprecated in 5.4 --- .../TouchScript/Examples/_misc/Scripts/Runner.cs | 14 +++++++++++++- .../TouchScript/Scripts/TouchManagerInstance.cs | 16 ++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs b/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs index c59dd0da3..7151b397a 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs +++ b/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs @@ -34,6 +34,10 @@ private void Awake() layer = GetComponent(); +#if UNITY_5_4 + SceneManager.sceneLoaded += LevelWasLoaded; +#endif + #if UNITY_5_3 || UNITY_5_4 if (SceneManager.GetActiveScene().name == "Examples" && SceneManager.sceneCountInBuildSettings > 1) #else @@ -44,9 +48,17 @@ private void Awake() } } - private void OnLevelWasLoaded(int num) + +#if !UNITY_5_4 + private void OnLevelWasLoaded(int value) + { + TouchManager.Instance.AddLayer(layer, 0); + } +#else + private void LevelWasLoaded(Scene scene, LoadSceneMode mode) { TouchManager.Instance.AddLayer(layer, 0); } +#endif } } diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs index 36b1ec3ce..37d832335 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs @@ -15,6 +15,10 @@ #endif using UnityEngine; +#if UNITY_5_4 +using UnityEngine.SceneManagement; +#endif + namespace TouchScript { /// @@ -488,6 +492,10 @@ private void Awake() return; } +#if UNITY_5_4 + SceneManager.sceneLoaded += LevelWasLoaded; +#endif + gameObject.hideFlags = HideFlags.HideInHierarchy; DontDestroyOnLoad(gameObject); @@ -504,11 +512,19 @@ private void Awake() #endif } +#if !UNITY_5_4 private void OnLevelWasLoaded(int value) { StopAllCoroutines(); StartCoroutine(lateAwake()); } +#else + private void LevelWasLoaded(Scene scene, LoadSceneMode mode) + { + StopAllCoroutines(); + StartCoroutine(lateAwake()); + } +#endif private IEnumerator lateAwake() { From ba0f6ddc6c05fe9c2507a5f6e1652237e1655474 Mon Sep 17 00:00:00 2001 From: David Haynes Date: Tue, 2 Aug 2016 09:12:09 +0100 Subject: [PATCH 071/211] Use *_OR_NEWER defines for conditional version compilation --- .../Examples/_misc/Scripts/Runner.cs | 19 +++++++++---------- .../Devices/Display/GenericDisplayDevice.cs | 2 +- .../Scripts/TouchManagerInstance.cs | 10 +++++----- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs b/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs index 7151b397a..de5a5c3bf 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs +++ b/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs @@ -4,7 +4,7 @@ using UnityEngine; using TouchScript.Layers; -#if UNITY_5_3 || UNITY_5_4 +#if UNITY_5_3_OR_NEWER using UnityEngine.SceneManagement; #endif @@ -17,10 +17,10 @@ public class Runner : MonoBehaviour public void LoadNextLevel() { -#if UNITY_5_3 || UNITY_5_4 +#if UNITY_5_3_OR_NEWER SceneManager.LoadScene((SceneManager.GetActiveScene().buildIndex + 1) % SceneManager.sceneCountInBuildSettings); #else - Application.LoadLevel((Application.loadedLevel + 1)%Application.levelCount); + Application.LoadLevel((Application.loadedLevel + 1)%Application.levelCount); #endif } @@ -34,28 +34,27 @@ private void Awake() layer = GetComponent(); -#if UNITY_5_4 +#if UNITY_5_4_OR_NEWER SceneManager.sceneLoaded += LevelWasLoaded; #endif -#if UNITY_5_3 || UNITY_5_4 +#if UNITY_5_3_OR_NEWER if (SceneManager.GetActiveScene().name == "Examples" && SceneManager.sceneCountInBuildSettings > 1) #else - if (Application.loadedLevelName == "Examples" && Application.levelCount > 1) + if (Application.loadedLevelName == "Examples" && Application.levelCount > 1) #endif { LoadNextLevel(); } } - -#if !UNITY_5_4 - private void OnLevelWasLoaded(int value) +#if UNITY_5_4_OR_NEWER + private void LevelWasLoaded(Scene scene, LoadSceneMode mode) { TouchManager.Instance.AddLayer(layer, 0); } #else - private void LevelWasLoaded(Scene scene, LoadSceneMode mode) + private void OnLevelWasLoaded(int value) { TouchManager.Instance.AddLayer(layer, 0); } diff --git a/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs b/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs index 1ac9307e4..a0d1e9c46 100644 --- a/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs +++ b/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs @@ -46,7 +46,7 @@ protected override void OnEnable() case RuntimePlatform.OSXEditor: case RuntimePlatform.OSXDashboardPlayer: case RuntimePlatform.OSXPlayer: -#if !UNITY_5_4 +#if !UNITY_5_4_OR_NEWER case RuntimePlatform.WindowsWebPlayer: case RuntimePlatform.OSXWebPlayer: #endif diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs index 37d832335..841a80450 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs @@ -15,7 +15,7 @@ #endif using UnityEngine; -#if UNITY_5_4 +#if UNITY_5_4_OR_NEWER using UnityEngine.SceneManagement; #endif @@ -492,7 +492,7 @@ private void Awake() return; } -#if UNITY_5_4 +#if UNITY_5_4_OR_NEWER SceneManager.sceneLoaded += LevelWasLoaded; #endif @@ -512,14 +512,14 @@ private void Awake() #endif } -#if !UNITY_5_4 - private void OnLevelWasLoaded(int value) +#if UNITY_5_4_OR_NEWER + private void LevelWasLoaded(Scene scene, LoadSceneMode mode) { StopAllCoroutines(); StartCoroutine(lateAwake()); } #else - private void LevelWasLoaded(Scene scene, LoadSceneMode mode) + private void OnLevelWasLoaded(int value) { StopAllCoroutines(); StartCoroutine(lateAwake()); From 9e746d19ab36f360fca52502439fdbe1452b5e4e Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sat, 6 Aug 2016 06:30:29 +0300 Subject: [PATCH 072/211] Uped version to 8.2. --- 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 adbf2f20c..744690fb3 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, 1); + public static readonly Version VERSION = new Version(8, 2); #endregion From 139f2d15e011eb049bfec1ee067660d73b2e3b85 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sat, 6 Aug 2016 08:02:24 +0300 Subject: [PATCH 073/211] Caching TouchManager.Instance in Pointer. --- Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs index 4c3132262..9320432c9 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs @@ -149,6 +149,7 @@ public ProjectionParams ProjectionParams #region Private variables + private TouchManagerInstance manager; private int refCount = 0; private Vector2 position, newPosition; private uint flags, newFlags; @@ -167,7 +168,7 @@ public HitData GetOverData(bool forceRecalculate = false) { if (overDataIsDirty || forceRecalculate) { - TouchManager.Instance.GetHitTarget(position, out overData); + manager.INTERNAL_GetHitTarget(this, out overData); overDataIsDirty = false; } return overData; @@ -226,6 +227,7 @@ public override int GetHashCode() /// public Pointer(IInputSource input) { + manager = TouchManager.Instance as TouchManagerInstance; Type = PointerType.Touch; InputSource = input; INTERNAL_Reset(); From 2fd095f5d3e6858f3b0540e575ea83c5ed0c4566 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sat, 6 Aug 2016 11:19:17 +0300 Subject: [PATCH 074/211] =?UTF-8?q?Refactored=20pointer-layer=20integratio?= =?UTF-8?q?n:=20-=20REMOVED=20ITouchManager.GetHitTarget=20API=20=E2=80=94?= =?UTF-8?q?=20this=20functionality=20is=20replaced=20by=20IPointer.GetOver?= =?UTF-8?q?Data,=20PointerUtils.IsPointerOnTarget.=20-=20CHANGED=20TouchMa?= =?UTF-8?q?nager=20->=20layer=20loop=20to=20TouchManager=20->=20point.GetO?= =?UTF-8?q?verData=20->=20TouchManager.INTERNAL=5FGetHitTarget.=20point.Ge?= =?UTF-8?q?tOverData=20caches=20its=20result=20for=20the=20duration=20of?= =?UTF-8?q?=20a=20frame.=20-=20EXTRACTED=20IPointer=20interface=20from=20P?= =?UTF-8?q?ointer=20mainly=20for=20Gesture.GetScreenPositionHitData=20work?= =?UTF-8?q?s=20through=20creating=20a=20FakePointer.=20LayerDelegate,=20To?= =?UTF-8?q?uchLayer,=20HitTest=20accept=20IPointer=20instead=20of=20Pointe?= =?UTF-8?q?r.=20-=20REFACTORED=20hittest=20logic=20to=20accept=20IPointer?= =?UTF-8?q?=20on=20all=20stages.=20-=20MOVED=20Delegate.ShouldReceivePoint?= =?UTF-8?q?er=20check=20to=20TouchLayer.Hit().=20-=20RENAMED=20ObjectHitRe?= =?UTF-8?q?sult,=20LayerHitResult=20to=20HitResult.=20-=20REMOVED=20HitRes?= =?UTF-8?q?ult.Error.=20-=20MOVED=20INTERNAL=5FFrameStarted=20before=20upd?= =?UTF-8?q?ateAdded.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Cube/Scripts/CustomPointerProxy.cs | 2 +- .../Examples/Cube/Scripts/LayerDelegate.cs | 2 +- .../Examples/Cube/Scripts/RedirectInput.cs | 3 +- .../TouchScript/Scripts/Gestures/Gesture.cs | 8 +- .../Assets/TouchScript/Scripts/Hit/HitTest.cs | 52 ++++++------- .../TouchScript/Scripts/Hit/Untouchable.cs | 5 +- .../TouchScript/Scripts/ITouchManager.cs | 16 ---- .../TouchScript/Scripts/Layers/CameraLayer.cs | 42 ++++------ .../Scripts/Layers/CameraLayer2D.cs | 38 +++------ .../Scripts/Layers/CameraLayerBase.cs | 20 +++-- .../Scripts/Layers/FullscreenLayer.cs | 19 +++-- .../Scripts/Layers/ILayerDelegate.cs | 2 +- .../TouchScript/Scripts/Layers/TouchLayer.cs | 77 ++++++------------- .../TouchScript/Scripts/Layers/UILayer.cs | 74 ++++++++---------- .../Scripts/Pointers/FakePointer.cs | 61 +++++++++++++++ .../Scripts/Pointers/FakePointer.cs.meta | 12 +++ .../TouchScript/Scripts/Pointers/IPointer.cs | 46 +++++++++++ .../Scripts/Pointers/IPointer.cs.meta | 12 +++ .../TouchScript/Scripts/Pointers/Pointer.cs | 22 +++--- .../Scripts/TouchManagerInstance.cs | 77 +++++++++---------- .../TouchScript/Scripts/Utils/Debug.meta | 9 +++ .../TouchScript/Scripts/Utils/DebugUtils.meta | 2 +- .../TouchScript/Scripts/Utils/PointerUtils.cs | 4 +- 23 files changed, 323 insertions(+), 282 deletions(-) create mode 100644 Source/Assets/TouchScript/Scripts/Pointers/FakePointer.cs create mode 100644 Source/Assets/TouchScript/Scripts/Pointers/FakePointer.cs.meta create mode 100644 Source/Assets/TouchScript/Scripts/Pointers/IPointer.cs create mode 100644 Source/Assets/TouchScript/Scripts/Pointers/IPointer.cs.meta create mode 100644 Source/Assets/TouchScript/Scripts/Utils/Debug.meta diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs index 8b62e7f8e..f27d32b6d 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/CustomPointerProxy.cs @@ -6,7 +6,7 @@ namespace TouchScript.Examples.Cube { - public class CustomPointerProxy : TouchScript.Behaviors.Visualizer.PointerProxy + public class CustomPointerProxy : Behaviors.Visualizer.PointerProxy { protected override void updateOnce(Pointer pointer) { if (pointer.InputSource is RedirectInput) Hide(); diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/LayerDelegate.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/LayerDelegate.cs index 56db76fa0..19838878e 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/LayerDelegate.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/LayerDelegate.cs @@ -14,7 +14,7 @@ public class LayerDelegate : MonoBehaviour, ILayerDelegate public RedirectInput Source; public TouchLayer RenderTextureLayer; - public bool ShouldReceivePointer(TouchLayer layer, Pointer pointer) + public bool ShouldReceivePointer(TouchLayer layer, IPointer pointer) { if (layer == RenderTextureLayer) return pointer.InputSource == Source; diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs index 1da2d0961..d6beaff94 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs @@ -89,7 +89,8 @@ 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 == this) return; Pointer newPointer; diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs index 2d080477c..e58689e04 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs @@ -402,7 +402,7 @@ protected IGestureManager gestureManager /// /// Reference to global TouchManager. /// - protected ITouchManager touchManager { get; private set; } + protected TouchManagerInstance touchManager { get; private set; } /// /// The state of min/max number of pointers. @@ -460,6 +460,7 @@ protected IGestureManager gestureManager private GestureManagerInstance gestureManagerInstance; private GestureState delayedStateChange = GestureState.Possible; private bool requiredGestureFailed = false; + private FakePointer fakePointer = new FakePointer(); private GestureState state = GestureState.Possible; /// @@ -592,7 +593,8 @@ public void Cancel() public virtual HitData GetScreenPositionHitData() { HitData hit; - touchManager.GetHitTarget(ScreenPosition, out hit); + fakePointer.Position = ScreenPosition; + touchManager.INTERNAL_GetHitTarget(fakePointer, out hit); return hit; } @@ -619,7 +621,7 @@ protected virtual void Awake() protected virtual void OnEnable() { // TouchManager might be different in another scene - touchManager = TouchManager.Instance; + touchManager = TouchManager.Instance as TouchManagerInstance; gestureManagerInstance = GestureManager.Instance as GestureManagerInstance; if (touchManager == null) diff --git a/Source/Assets/TouchScript/Scripts/Hit/HitTest.cs b/Source/Assets/TouchScript/Scripts/Hit/HitTest.cs index a2c508972..25d8ebcd8 100644 --- a/Source/Assets/TouchScript/Scripts/Hit/HitTest.cs +++ b/Source/Assets/TouchScript/Scripts/Hit/HitTest.cs @@ -2,44 +2,38 @@ * @author Valentin Simonov / http://va.lent.in/ */ +using TouchScript.Pointers; using UnityEngine; namespace TouchScript.Hit { + /// - /// Base class for all hit test handlers. + /// Result of a check to find if a hit object should recieve this pointer or not. /// - public abstract class HitTest : MonoBehaviour + public enum HitResult { - #region Constants - /// - /// Result of a check to find if a hit object should recieve this pointer or not. + /// This is a hit, object should recieve pointer. /// - public enum ObjectHitResult - { - /// - /// Something happened. - /// - Error = 0, + Hit = 1, - /// - /// This is a hit, object should recieve pointer. - /// - Hit = 1, - - /// - /// Object should not recieve pointer. - /// - Miss = 2, + /// + /// Object should not recieve pointer. + /// + Miss = 2, - /// - /// Object should not recieve pointer and this pointer should be discarded and not tested with any other object. - /// - Discard = 3 - } + /// + /// Object should not recieve pointer and this pointer should be discarded and not tested with any other object. + /// + Discard = 3 + } - #endregion + /// + /// Base class for all hit test handlers. + /// + public abstract class HitTest : MonoBehaviour + { #region Public methods @@ -47,10 +41,10 @@ public enum ObjectHitResult /// Determines whether a pointer hit the object. /// /// 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 ObjectHitResult IsHit(HitData hit) + /// 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) { - return ObjectHitResult.Hit; + return HitResult.Hit; } #endregion diff --git a/Source/Assets/TouchScript/Scripts/Hit/Untouchable.cs b/Source/Assets/TouchScript/Scripts/Hit/Untouchable.cs index eab4b1e78..dcb0c1a30 100644 --- a/Source/Assets/TouchScript/Scripts/Hit/Untouchable.cs +++ b/Source/Assets/TouchScript/Scripts/Hit/Untouchable.cs @@ -2,6 +2,7 @@ * @author Valentin Simonov / http://va.lent.in/ */ +using TouchScript.Pointers; using UnityEngine; namespace TouchScript.Hit @@ -26,9 +27,9 @@ public class Untouchable : HitTest #region Public methods /// - public override ObjectHitResult IsHit(HitData hit) + public override HitResult IsHit(IPointer pointer, HitData hit) { - return DiscardPointer ? ObjectHitResult.Discard : ObjectHitResult.Miss; + return DiscardPointer ? HitResult.Discard : HitResult.Miss; } #endregion diff --git a/Source/Assets/TouchScript/Scripts/ITouchManager.cs b/Source/Assets/TouchScript/Scripts/ITouchManager.cs index 2b6c72f5a..81a409ff0 100644 --- a/Source/Assets/TouchScript/Scripts/ITouchManager.cs +++ b/Source/Assets/TouchScript/Scripts/ITouchManager.cs @@ -187,22 +187,6 @@ public interface ITouchManager /// true if the input source was removed; false otherwise. bool RemoveInput(IInputSource input); - /// - /// Checks if a pointer hits anything. - /// - /// Screen position of the pointer. - /// Transform which has been hit or null otherwise. - Transform GetHitTarget(Vector2 position); - - /// - /// Checks if a pointer hits anything. - /// - /// - /// Screen position of the pointer. - /// An object which represents hit information. - /// True if the pointer hits any Transform. - bool GetHitTarget(Vector2 position, out HitData hit); - /// /// Cancels a pointer and returns it to the system of need. /// diff --git a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs index c44f587d3..19cf8a18a 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using TouchScript.Hit; +using TouchScript.Pointers; using UnityEngine; namespace TouchScript.Layers @@ -17,6 +18,7 @@ namespace TouchScript.Layers public class CameraLayer : CameraLayerBase { #region Private variables + #if UNITY_5_3_OR_NEWER private RaycastHit[] raycastHits = new RaycastHit[20]; #endif @@ -25,7 +27,7 @@ public class CameraLayer : CameraLayerBase private RaycastHitComparer comparer; -#endregion + #endregion #region Unity methods @@ -39,12 +41,12 @@ protected override void Awake() comparer = new RaycastHitComparer(cachedTransform); } -#endregion + #endregion -#region Protected functions + #region Protected functions /// - protected override LayerHitResult castRay(Ray ray, out HitData hit) + protected override HitResult castRay(IPointer pointer, Ray ray, out HitData hit) { hit = default(HitData); #if UNITY_5_3_OR_NEWER @@ -54,7 +56,7 @@ protected override LayerHitResult castRay(Ray ray, out HitData hit) var count = raycastHits.Length; #endif - if (count == 0) return LayerHitResult.Miss; + if (count == 0) return HitResult.Miss; if (count > 1) { sortHits(raycastHits, count); @@ -63,35 +65,18 @@ protected override LayerHitResult castRay(Ray ray, out HitData hit) for (var i = 0; i < count; i++) { raycastHit = sortedHits[i]; - switch (doHit(raycastHit, out hit)) - { - case HitTest.ObjectHitResult.Hit: - return LayerHitResult.Hit; - case HitTest.ObjectHitResult.Discard: - return LayerHitResult.Miss; - } + var result = doHit(pointer, raycastHit, out hit); + if (result != HitResult.Miss) return result; } + return HitResult.Miss; } - else - { - switch (doHit(raycastHits[0], out hit)) - { - case HitTest.ObjectHitResult.Hit: - return LayerHitResult.Hit; - case HitTest.ObjectHitResult.Error: - return LayerHitResult.Error; - default: - return LayerHitResult.Miss; - } - } - - return LayerHitResult.Miss; + return doHit(pointer, raycastHits[0], out hit); } - private HitTest.ObjectHitResult doHit(RaycastHit raycastHit, out HitData hit) + private HitResult doHit(IPointer pointer, RaycastHit raycastHit, out HitData hit) { hit = new HitData(raycastHit, this); - return checkHitFilters(hit); + return checkHitFilters(pointer, hit); } private void sortHits(RaycastHit[] hits, int count) @@ -121,6 +106,5 @@ public int Compare(RaycastHit a, RaycastHit b) return distA < distB ? -1 : 1; } } - } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs b/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs index e5dea67d9..ede75db32 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using TouchScript.Hit; +using TouchScript.Pointers; using UnityEngine; namespace TouchScript.Layers @@ -55,51 +56,32 @@ protected virtual void OnEnable() #region Protected functions /// - protected override LayerHitResult castRay(Ray ray, out HitData hit) + protected override HitResult castRay(IPointer pointer, Ray ray, out HitData hit) { hit = default(HitData); var count = Physics2D.GetRayIntersectionNonAlloc(ray, raycastHits, float.PositiveInfinity, LayerMask); - if (count == 0) return LayerHitResult.Miss; + if (count == 0) return HitResult.Miss; if (count > 1) { sortHits(raycastHits, count); RaycastHit2D raycastHit = default(RaycastHit2D); - var i = 0; - while (i < sortedHits.Count) + for (var i = 0; i < count; i++) { raycastHit = sortedHits[i]; - switch (doHit(raycastHit, out hit)) - { - case HitTest.ObjectHitResult.Hit: - return LayerHitResult.Hit; - case HitTest.ObjectHitResult.Discard: - return LayerHitResult.Miss; - } - i++; + var result = doHit(pointer, raycastHit, out hit); + if (result != HitResult.Miss) return result; } + return HitResult.Miss; } - else - { - switch (doHit(raycastHits[0], out hit)) - { - case HitTest.ObjectHitResult.Hit: - return LayerHitResult.Hit; - case HitTest.ObjectHitResult.Error: - return LayerHitResult.Error; - default: - return LayerHitResult.Miss; - } - } - - return LayerHitResult.Miss; + return doHit(pointer, raycastHits[0], out hit); } - private HitTest.ObjectHitResult doHit(RaycastHit2D raycastHit, out HitData hit) + private HitResult doHit(IPointer pointer, RaycastHit2D raycastHit, out HitData hit) { hit = new HitData(raycastHit, this); - return checkHitFilters(hit); + return checkHitFilters(pointer, hit); } private void sortHits(RaycastHit2D[] hits, int count) diff --git a/Source/Assets/TouchScript/Scripts/Layers/CameraLayerBase.cs b/Source/Assets/TouchScript/Scripts/Layers/CameraLayerBase.cs index d63541080..c7e78af67 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/CameraLayerBase.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/CameraLayerBase.cs @@ -4,6 +4,7 @@ using System; using TouchScript.Hit; +using TouchScript.Pointers; using UnityEngine; namespace TouchScript.Layers @@ -52,16 +53,19 @@ public override Vector3 WorldProjectionNormal #region Public methods /// - public override LayerHitResult Hit(Vector2 position, out HitData hit) + public override HitResult Hit(IPointer pointer, out HitData hit) { - if (base.Hit(position, out hit) == LayerHitResult.Miss) return LayerHitResult.Miss; + if (base.Hit(pointer, out hit) != HitResult.Hit) return HitResult.Miss; - if (_camera == null) return LayerHitResult.Error; - if (_camera.enabled == false || _camera.gameObject.activeInHierarchy == false) return LayerHitResult.Miss; - if (!_camera.pixelRect.Contains(position)) return LayerHitResult.Miss; + if (_camera == null) return HitResult.Miss; + if (_camera.enabled == false || _camera.gameObject.activeInHierarchy == false) return HitResult.Miss; + var position = pointer.Position; + if (!_camera.pixelRect.Contains(position)) return HitResult.Miss; var ray = _camera.ScreenPointToRay(position); - return castRay(ray, out hit); + var result = castRay(pointer, ray, out hit); + if (result != HitResult.Hit) hit = default(HitData); + return result; } #endregion @@ -82,7 +86,7 @@ protected override void Awake() /// protected override void setName() { - if (String.IsNullOrEmpty(Name) && _camera != null) Name = _camera.name; + if (string.IsNullOrEmpty(Name) && _camera != null) Name = _camera.name; } /// @@ -109,7 +113,7 @@ protected virtual void updateCamera() /// The ray. /// Hit information if the ray has hit something. /// Hit result. - protected abstract LayerHitResult castRay(Ray ray, out HitData hit); + protected abstract HitResult castRay(IPointer pointer, Ray ray, out HitData hit); #endregion } diff --git a/Source/Assets/TouchScript/Scripts/Layers/FullscreenLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/FullscreenLayer.cs index 2630b3f28..2fc97c59b 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/FullscreenLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/FullscreenLayer.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using TouchScript.Hit; +using TouchScript.Pointers; using UnityEngine; namespace TouchScript.Layers @@ -100,25 +101,23 @@ public override Vector3 WorldProjectionNormal #region Public methods /// - public override LayerHitResult Hit(Vector2 position, out HitData hit) + public override HitResult Hit(IPointer pointer, out HitData hit) { - if (base.Hit(position, out hit) == LayerHitResult.Miss) return LayerHitResult.Miss; + if (base.Hit(pointer, out hit) != HitResult.Hit) return HitResult.Miss; if (_camera != null) { - if (!_camera.pixelRect.Contains(position)) return LayerHitResult.Miss; + if (!_camera.pixelRect.Contains(pointer.Position)) return HitResult.Miss; } hit = new HitData(transform, this); - switch (checkHitFilters(hit)) + var result = checkHitFilters(pointer, hit); + if (result != HitResult.Hit) { - case HitTest.ObjectHitResult.Hit: - return LayerHitResult.Hit; - case HitTest.ObjectHitResult.Error: - return LayerHitResult.Error; - default: - return LayerHitResult.Miss; + hit = default(HitData); + return result; } + return HitResult.Hit; } #endregion diff --git a/Source/Assets/TouchScript/Scripts/Layers/ILayerDelegate.cs b/Source/Assets/TouchScript/Scripts/Layers/ILayerDelegate.cs index 71855fb87..a8dfe9ede 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/ILayerDelegate.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/ILayerDelegate.cs @@ -19,7 +19,7 @@ public interface ILayerDelegate /// The layer. /// The pointer. /// true if it should; false otherwise. - bool ShouldReceivePointer(TouchLayer layer, Pointer pointer); + bool ShouldReceivePointer(TouchLayer layer, IPointer pointer); } } diff --git a/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs index d0ef9959a..2e53cf660 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs @@ -27,30 +27,6 @@ namespace TouchScript.Layers [ExecuteInEditMode] public abstract class TouchLayer : MonoBehaviour { - #region Constants - - /// - /// Result of a pointer's hit test with a layer. - /// - public enum LayerHitResult - { - /// - /// Something wrong happened. - /// - Error = 0, - - /// - /// Pointer hit an object. - /// - Hit = 1, - - /// - /// Pointer didn't hit any object. - /// - Miss = 2 - } - - #endregion #region Events @@ -59,12 +35,12 @@ public enum LayerHitResult /// public event EventHandler PointerBegan { - add { pointerBeganInvoker += value; } - remove { pointerBeganInvoker -= value; } + add { pointerPressInvoker += value; } + remove { pointerPressInvoker -= value; } } // Needed to overcome iOS AOT limitations - private EventHandler pointerBeganInvoker; + private EventHandler pointerPressInvoker; #endregion @@ -117,14 +93,19 @@ public virtual ProjectionParams GetProjectionParams(Pointer pointer) /// /// Checks if a point in screen coordinates hits something in this layer. /// - /// Position in screen coordinates. + /// Pointer. /// Hit result. - /// , if an object is hit, or otherwise. - public virtual LayerHitResult Hit(Vector2 position, out HitData hit) + /// true, if an object is hit, ; false otherwise. + public virtual HitResult Hit(IPointer pointer, out HitData hit) { hit = default(HitData); - if (enabled == false || gameObject.activeInHierarchy == false) return LayerHitResult.Miss; - return LayerHitResult.Error; + if (enabled == false || gameObject.activeInHierarchy == false) return HitResult.Miss; + if (Delegate != null) + { + if (Delegate.ShouldReceivePointer(this, pointer)) return HitResult.Hit; + return HitResult.Miss; + } + return HitResult.Hit; } #endregion @@ -176,17 +157,9 @@ internal void INTERNAL_UpdatePointer(Pointer pointer) internal bool INTERNAL_PressPointer(Pointer pointer) { - HitData hit; - if (Delegate != null && Delegate.ShouldReceivePointer(this, pointer) == false) return false; - var result = pressPointer(pointer, out hit); - if (result == LayerHitResult.Hit) - { - pointer.INTERNAL_SetPressData(hit); - if (pointerBeganInvoker != null) - pointerBeganInvoker.InvokeHandleExceptions(this, new TouchLayerEventArgs(pointer)); - return true; - } - return false; + pressPointer(pointer); + if (pointerPressInvoker != null) pointerPressInvoker.InvokeHandleExceptions(this, new TouchLayerEventArgs(pointer)); + return true; } internal void INTERNAL_ReleasePointer(Pointer pointer) @@ -203,19 +176,19 @@ internal void INTERNAL_CancelPointer(Pointer pointer) #region Protected functions - protected HitTest.ObjectHitResult checkHitFilters(HitData hit) + protected HitResult checkHitFilters(IPointer pointer, HitData hit) { hit.Target.GetComponents(tmpHitTestList); var count = tmpHitTestList.Count; - if (count == 0) return HitTest.ObjectHitResult.Hit; + if (count == 0) return HitResult.Hit; - var hitResult = HitTest.ObjectHitResult.Hit; + var hitResult = HitResult.Hit; for (var i = 0; i < count; i++) { var test = tmpHitTestList[i]; if (!test.enabled) continue; - hitResult = test.IsHit(hit); - if (hitResult == HitTest.ObjectHitResult.Miss || hitResult == HitTest.ObjectHitResult.Discard) break; + hitResult = test.IsHit(pointer, hit); + if (hitResult != HitResult.Hit) break; } return hitResult; @@ -233,14 +206,8 @@ protected virtual void setName() /// Called when a layer is touched to query the layer if this pointer hits something. /// /// Pointer. - /// Hit result. - /// , if an object is hit, or otherwise. /// This method may also be used to update some internal state or resend this event somewhere. - protected virtual LayerHitResult pressPointer(Pointer pointer, out HitData hit) - { - var result = Hit(pointer.Position, out hit); - return result; - } + protected virtual void pressPointer(Pointer pointer) {} /// /// Called when a pointer is moved. diff --git a/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs b/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs index 1ecd35019..967d953d6 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs @@ -40,45 +40,14 @@ public class UILayer : TouchLayer #region Public methods /// - public override LayerHitResult Hit(Vector2 position, out HitData hit) + public override HitResult Hit(IPointer pointer, out HitData hit) { - if (base.Hit(position, out hit) == LayerHitResult.Miss) return LayerHitResult.Miss; - if (eventSystem == null) return LayerHitResult.Error; + if (base.Hit(pointer, out hit) != HitResult.Hit) return HitResult.Miss; + if (eventSystem == null) return HitResult.Miss; - if (pointerDataCache == null) pointerDataCache = new PointerEventData(eventSystem); - pointerDataCache.position = position; - eventSystem.RaycastAll(pointerDataCache, raycastResultCache); - - var count = raycastResultCache.Count; - if (count == 0) return LayerHitResult.Miss; - if (count > 1) - { - for (var i = 0; i < count; ++i) - { - var raycastHit = raycastResultCache[i]; - switch (doHit(raycastHit, out hit)) - { - case HitTest.ObjectHitResult.Hit: - return LayerHitResult.Hit; - case HitTest.ObjectHitResult.Discard: - return LayerHitResult.Miss; - } - } - } - else - { - switch (doHit(raycastResultCache[0], out hit)) - { - case HitTest.ObjectHitResult.Hit: - return LayerHitResult.Hit; - case HitTest.ObjectHitResult.Error: - return LayerHitResult.Error; - default: - return LayerHitResult.Miss; - } - } - - return LayerHitResult.Miss; + var result = castRay(pointer, out hit); + if (result != HitResult.Hit) hit = default(HitData); + return result; } /// @@ -145,16 +114,39 @@ protected override void setName() Name = "UI Layer"; } + protected HitResult castRay(IPointer pointer, out HitData hit) + { + hit = default(HitData); + if (pointerDataCache == null) pointerDataCache = new PointerEventData(eventSystem); + pointerDataCache.position = pointer.Position; + eventSystem.RaycastAll(pointerDataCache, raycastResultCache); + + var count = raycastResultCache.Count; + if (count == 0) return HitResult.Miss; + if (count > 1) + { + for (var i = 0; i < count; ++i) + { + var raycastHit = raycastResultCache[i]; + if (!(raycastHit.module is GraphicRaycaster)) continue; + var result = doHit(pointer, raycastHit, out hit); + if (result != HitResult.Miss) return result; + } + return HitResult.Miss; + } + + if (!(raycastResultCache[0].module is GraphicRaycaster)) return HitResult.Miss; + return doHit(pointer, raycastResultCache[0], out hit); + } + #endregion #region Private functions - private HitTest.ObjectHitResult doHit(RaycastResult raycastHit, out HitData hit) + private HitResult doHit(IPointer pointer, RaycastResult raycastHit, out HitData hit) { hit = new HitData(raycastHit, this); - - if (!(raycastHit.module is GraphicRaycaster)) return HitTest.ObjectHitResult.Miss; - return checkHitFilters(hit); + return checkHitFilters(pointer, hit); } #endregion diff --git a/Source/Assets/TouchScript/Scripts/Pointers/FakePointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/FakePointer.cs new file mode 100644 index 000000000..dd80d4d27 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Pointers/FakePointer.cs @@ -0,0 +1,61 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using TouchScript.Hit; +using TouchScript.InputSources; +using UnityEngine; + +namespace TouchScript.Pointers +{ + public class FakePointer : IPointer + { + + #region Public properties + + /// + public int Id { get; set; } + + /// + public Pointer.PointerType Type { get; set; } + + /// + public IInputSource InputSource { get; set; } + + /// + public Vector2 Position { get; set; } + + /// + public uint Flags { get; set; } + + #endregion + + #region Constructors + + public FakePointer(Vector2 position) : this() + { + Position = position; + } + + public FakePointer() + { + Id = Pointer.INVALID_POINTER; + Type = Pointer.PointerType.Unknown; + Flags = Pointer.FLAG_ARTIFICIAL; + } + + #endregion + + #region Public methods + + /// + public HitData GetOverData(bool forceRecalculate = false) + { + HitData overData; + TouchManagerInstance.Instance.INTERNAL_GetHitTarget(this, out overData); + return overData; + } + + #endregion + } +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Pointers/FakePointer.cs.meta b/Source/Assets/TouchScript/Scripts/Pointers/FakePointer.cs.meta new file mode 100644 index 000000000..bbd616fb0 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Pointers/FakePointer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a59adb6c636064c8496f0078661777f1 +timeCreated: 1470469109 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Pointers/IPointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/IPointer.cs new file mode 100644 index 000000000..47829ec69 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Pointers/IPointer.cs @@ -0,0 +1,46 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using TouchScript.Hit; +using TouchScript.InputSources; +using UnityEngine; + +namespace TouchScript.Pointers +{ + public interface IPointer + { + /// + /// Internal unique pointer id. + /// + int Id { get; } + + /// + /// Pointer type. See . + /// + Pointer.PointerType Type { get; } + + /// + /// Original input source which created this pointer. + /// + /// + IInputSource InputSource { get; } + + /// + /// Current position in screen coordinates. + /// + Vector2 Position { get; 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. + /// + uint Flags { get; set; } + + /// + /// Returns for current pointer position, i.e. what is right beneath it. Caches the result for the entire frame. + /// + /// if set to true forces to recalculate the value. + HitData GetOverData(bool forceRecalculate = false); + } +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Pointers/IPointer.cs.meta b/Source/Assets/TouchScript/Scripts/Pointers/IPointer.cs.meta new file mode 100644 index 000000000..00898eceb --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Pointers/IPointer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c98af71ed8641458f89cd9710017249a +timeCreated: 1470469109 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs index 9320432c9..0a09348ea 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs @@ -14,7 +14,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 + public class Pointer : IPointer { #region Constants @@ -62,6 +62,11 @@ public class Pointer /// public enum PointerType { + /// + /// Unknown. + /// + Unknown, + /// /// Touch. /// @@ -87,14 +92,10 @@ public enum PointerType #region Public properties - /// - /// Internal unique pointer id. - /// + /// public int Id { get; private set; } - /// - /// Pointer type. See . - /// + /// public PointerType Type { get; protected set; } /// @@ -160,10 +161,7 @@ public ProjectionParams ProjectionParams #region Public methods - /// - /// Returns for current pointer position, i.e. what is right beneath it. Caches the result for the entire frame. - /// - /// if set to true forces to recalculate the value. + /// public HitData GetOverData(bool forceRecalculate = false) { if (overDataIsDirty || forceRecalculate) @@ -228,7 +226,7 @@ public override int GetHashCode() public Pointer(IInputSource input) { manager = TouchManager.Instance as TouchManagerInstance; - Type = PointerType.Touch; + Type = PointerType.Unknown; InputSource = input; INTERNAL_Reset(); } diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs index 061be7b55..948252255 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs @@ -21,7 +21,7 @@ namespace TouchScript /// /// Default implementation of . /// - internal sealed class TouchManagerInstance : DebuggableMonoBehaviour, ITouchManager + public sealed class TouchManagerInstance : DebuggableMonoBehaviour, ITouchManager { #region Events @@ -318,34 +318,6 @@ public bool RemoveInput(IInputSource input) return result; } - /// - public Transform GetHitTarget(Vector2 position) - { - HitData hit; - if (GetHitTarget(position, out hit)) return hit.Target; - return null; - } - - /// - public bool GetHitTarget(Vector2 position, out HitData hit) - { - hit = default(HitData); - - for (var i = 0; i < layerCount; i++) - { - var touchLayer = layers[i]; - if (touchLayer == null) continue; - HitData _hit; - if (touchLayer.Hit(position, out _hit) == TouchLayer.LayerHitResult.Hit) - { - hit = _hit; - return true; - } - } - - return false; - } - /// public void CancelPointer(int id, bool shouldReturn) { @@ -366,6 +338,28 @@ public void CancelPointer(int id) #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) @@ -705,12 +699,12 @@ private void updatePressed(List pointers) } list.Add(pointer); pressedPointers.Add(pointer); - for (var j = 0; j < layerCount; j++) - { - var touchLayer = layers[j]; - if (touchLayer == null || !touchLayer.enabled) continue; - if (touchLayer.INTERNAL_PressPointer(pointer)) break; - } + HitData hit = pointer.GetOverData(); + if (hit.Layer != null) + { + pointer.INTERNAL_SetPressData(hit); + hit.Layer.INTERNAL_PressPointer(pointer); + } #if TOUCHSCRIPT_DEBUG addDebugFigureForPointer(pointer); @@ -886,19 +880,18 @@ private void updatePointers() } } + var count = pointers.Count; + for (var i = 0; i < count; i++) + { + pointers[i].INTERNAL_FrameStarted(); + } + if (addedList != null) { updateAdded(addedList); pointerListPool.Release(addedList); } - // Need to loop through all pointers to update position/previousPosition. - var count = pointers.Count; - for (var i = 0; i < count; i++) - { - pointers[i].INTERNAL_FrameStarted(); - } - if (updatedList != null) { updateUpdated(updatedList); diff --git a/Source/Assets/TouchScript/Scripts/Utils/Debug.meta b/Source/Assets/TouchScript/Scripts/Utils/Debug.meta new file mode 100644 index 000000000..23a1c9fcf --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Utils/Debug.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 130e732941aee45338415c75c7c1c62a +folderAsset: yes +timeCreated: 1447582128 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Utils/DebugUtils.meta b/Source/Assets/TouchScript/Scripts/Utils/DebugUtils.meta index 23a1c9fcf..6bdfb9d1d 100644 --- a/Source/Assets/TouchScript/Scripts/Utils/DebugUtils.meta +++ b/Source/Assets/TouchScript/Scripts/Utils/DebugUtils.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 130e732941aee45338415c75c7c1c62a +guid: c8b78ed8d23cd4373bebaff448436deb folderAsset: yes timeCreated: 1447582128 licenseType: Pro diff --git a/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs b/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs index 98255f297..dfc8630bf 100644 --- a/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs +++ b/Source/Assets/TouchScript/Scripts/Utils/PointerUtils.cs @@ -30,7 +30,7 @@ public static bool IsPointerOnTarget(Pointer pointer) /// The pointer. /// The target. /// true if the pointer is over the GameObject; false otherwise. - public static bool IsPointerOnTarget(Pointer pointer, Transform target) + public static bool IsPointerOnTarget(IPointer pointer, Transform target) { HitData hit; return IsPointerOnTarget(pointer, target, out hit); @@ -43,7 +43,7 @@ public static bool IsPointerOnTarget(Pointer pointer, Transform target) /// The target. /// The hit. /// true if the pointer is over the GameObject; false otherwise. - public static bool IsPointerOnTarget(Pointer pointer, Transform target, out HitData hit) + public static bool IsPointerOnTarget(IPointer pointer, Transform target, out HitData hit) { hit = default(HitData); if (pointer == null || target == null) return false; From bcbb1ff98615aa3d3dacee2f7c8f255de91dde7e Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 7 Aug 2016 11:52:49 +0300 Subject: [PATCH 075/211] TouchScript pointer events debug. --- .../TouchScript/Editor/TouchManagerEditor.cs | 37 ++++++++++++++++ .../Scripts/DebuggableMonoBehaviour.cs | 2 +- .../TouchScript/Scripts/Pointers/Pointer.cs | 24 +++++++++++ .../TouchScript/Scripts/TouchManager.cs | 21 +++++++++- .../Scripts/TouchManagerInstance.cs | 42 +++++++++++++++---- .../TouchScript/Scripts/Utils/BinaryUtils.cs | 24 +++++++++++ .../Scripts/Utils/BinaryUtils.cs.meta | 12 ++++++ 7 files changed, 150 insertions(+), 12 deletions(-) create mode 100644 Source/Assets/TouchScript/Scripts/Utils/BinaryUtils.cs create mode 100644 Source/Assets/TouchScript/Scripts/Utils/BinaryUtils.cs.meta diff --git a/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs b/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs index 4b46bced8..5df096d1a 100644 --- a/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs +++ b/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Linq; using TouchScript.Devices.Display; +using TouchScript.Editor.Utils; using TouchScript.Layers; using UnityEditor; using UnityEditorInternal; @@ -16,6 +17,8 @@ namespace TouchScript.Editor [CustomEditor(typeof(TouchManager))] internal sealed class TouchManagerEditor : UnityEditor.Editor { + private static readonly GUIContent TEXT_ADVANCED_HEADER = new GUIContent("Advanced", "Advanced properties."); + private static readonly GUIContent DEBUG_MODE = new GUIContent("Debug", "Turns on debug mode."); private static readonly GUIContent DISPLAY_DEVICE = new GUIContent("Display Device", "Display device properties where such parameters as target DPI are stored."); private static readonly GUIContent 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."); private static readonly GUIContent CREATE_STANDARD_INPUT = new GUIContent("Create Standard Input", ""); @@ -26,11 +29,15 @@ internal sealed class TouchManagerEditor : UnityEditor.Editor private TouchManager instance; private ReorderableList layersList; + private SerializedProperty advanced; + private SerializedProperty debugMode; private SerializedProperty layers, displayDevice, shouldCreateCameraLayer, shouldCreateStandardInput, useSendMessage, sendMessageTarget, sendMessageEvents; private void OnEnable() { instance = target as TouchManager; + advanced = serializedObject.FindProperty("advancedProps"); + debugMode = serializedObject.FindProperty("debugMode"); layers = serializedObject.FindProperty("layers"); displayDevice = serializedObject.FindProperty("displayDevice"); shouldCreateCameraLayer = serializedObject.FindProperty("shouldCreateCameraLayer"); @@ -103,9 +110,39 @@ public override void OnInspectorGUI() layersList.DoLayoutList(); GUI.enabled = true; + + if (debugMode != null) + { + EditorGUI.BeginChangeCheck(); + var expanded = GUIElements.BeginFoldout(advanced.isExpanded, TEXT_ADVANCED_HEADER); + if (EditorGUI.EndChangeCheck()) + { + advanced.isExpanded = expanded; + } + if (expanded) + { + GUILayout.BeginVertical(GUIElements.FoldoutStyle); + drawAdvanced(); + GUILayout.EndVertical(); + } + GUIElements.EndFoldout(); + } serializedObject.ApplyModifiedProperties(); } + private void drawAdvanced() + { + drawDebug(); + } + + private void drawDebug() + { + if (debugMode == null) return; + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(debugMode, DEBUG_MODE); + if (EditorGUI.EndChangeCheck()) instance.DebugMode = debugMode.boolValue; + } + private void refresh() { var allLayers = FindObjectsOfType(typeof(TouchLayer)).Cast().ToList(); diff --git a/Source/Assets/TouchScript/Scripts/DebuggableMonoBehaviour.cs b/Source/Assets/TouchScript/Scripts/DebuggableMonoBehaviour.cs index 780a54bde..89fd419ad 100644 --- a/Source/Assets/TouchScript/Scripts/DebuggableMonoBehaviour.cs +++ b/Source/Assets/TouchScript/Scripts/DebuggableMonoBehaviour.cs @@ -15,7 +15,7 @@ namespace TouchScript public class DebuggableMonoBehaviour : MonoBehaviour, IDebuggable { /// - public bool DebugMode + public virtual bool DebugMode { get { diff --git a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs index 0a09348ea..465b5c65a 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs @@ -2,9 +2,12 @@ * @author Valentin Simonov / http://va.lent.in/ */ +using System; +using System.Text; using TouchScript.Hit; using TouchScript.InputSources; using TouchScript.Layers; +using TouchScript.Utils; using UnityEngine; namespace TouchScript.Pointers @@ -150,6 +153,8 @@ public ProjectionParams ProjectionParams #region Private variables + private static StringBuilder builder; + private TouchManagerInstance manager; private int refCount = 0; private Vector2 position, newPosition; @@ -216,6 +221,25 @@ public override int GetHashCode() return Id; } + /// + public override string ToString() + { + if (builder == null) builder = new StringBuilder(); + builder.Length = 0; + builder.Append("(Pointer type: "); + builder.Append(Type); + builder.Append(", id: "); + builder.Append(Id); + builder.Append(", flags: "); + BinaryUtils.ToBinaryString(Flags, builder, 8); + // builder.Append(", buttons: "); + // builder.Append((uint)Buttons); + builder.Append(", position: "); + builder.Append(Position); + builder.Append(")"); + return builder.ToString(); + } + #endregion #region Constructor diff --git a/Source/Assets/TouchScript/Scripts/TouchManager.cs b/Source/Assets/TouchScript/Scripts/TouchManager.cs index 798c38716..2c191bd54 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManager.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManager.cs @@ -22,7 +22,7 @@ namespace TouchScript /// [AddComponentMenu("TouchScript/Pointer Manager")] [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_TouchManager.htm")] - public sealed class TouchManager : MonoBehaviour + public sealed class TouchManager : DebuggableMonoBehaviour { #region Constants @@ -247,7 +247,21 @@ public GameObject SendMessageTarget } } - #endregion +#if TOUCHSCRIPT_DEBUG + + public override bool DebugMode + { + get { return base.DebugMode; } + set + { + base.DebugMode = value; + if (Application.isPlaying) (Instance as TouchManagerInstance).DebugMode = value; + } + } + +#endif + +#endregion #region Public methods @@ -265,6 +279,9 @@ public static bool IsInvalidPosition(Vector2 position) #region Private variables + [SerializeField] + private bool advancedProps; // is used to save if advanced properties are opened or closed + [SerializeField] private Object displayDevice; diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs index 948252255..47b155fde 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs @@ -366,6 +366,10 @@ internal void INTERNAL_AddPointer(Pointer pointer) { pointer.INTERNAL_Init(nextPointerId++); pointersAdded.Add(pointer); + +#if TOUCHSCRIPT_DEBUG + if (DebugMode) Debug.Log("TouchScript > Pointer Added: " + pointer); +#endif } } @@ -382,13 +386,17 @@ internal void INTERNAL_UpdatePointer(int id) if (pointer == null) { #if TOUCHSCRIPT_DEBUG - Debug.LogWarning("TouchScript > Pointer with id [" + id + "] is requested to MOVE to but no pointer with such id found."); + if (DebugMode) Debug.LogWarning("TouchScript > Pointer with id [" + id + "] is requested to MOVE to but no pointer with such id found."); #endif return; } } pointersUpdated.Add(id); + +#if TOUCHSCRIPT_DEBUG + if (DebugMode) Debug.Log("TouchScript > Pointer Updated: " + pointer); +#endif } } @@ -405,7 +413,7 @@ internal void INTERNAL_PressPointer(int id) if (pointer == null) { #if TOUCHSCRIPT_DEBUG - Debug.LogWarning("TouchScript > Pointer with id [" + id + + if (DebugMode) Debug.LogWarning("TouchScript > Pointer with id [" + id + "] is requested to PRESS but no pointer with such id found."); #endif return; @@ -413,11 +421,15 @@ internal void INTERNAL_PressPointer(int id) } #if TOUCHSCRIPT_DEBUG if (!pointersPressed.Add(id)) - Debug.LogWarning("TouchScript > Pointer with id [" + id + + if (DebugMode) Debug.LogWarning("TouchScript > Pointer with id [" + id + "] is requested to PRESS more than once this frame."); #else pointersPressed.Add(id); #endif + +#if TOUCHSCRIPT_DEBUG + if (DebugMode) Debug.Log("TouchScript > Pointer Pressed: " + pointer); +#endif } } @@ -435,7 +447,7 @@ internal void INTERNAL_ReleasePointer(int id) if (pointer == null) { #if TOUCHSCRIPT_DEBUG - Debug.LogWarning("TouchScript > Pointer with id [" + id + + if (DebugMode) Debug.LogWarning("TouchScript > Pointer with id [" + id + "] is requested to END but no pointer with such id found."); #endif return; @@ -443,11 +455,15 @@ internal void INTERNAL_ReleasePointer(int id) } #if TOUCHSCRIPT_DEBUG if (!pointersReleased.Add(id)) - Debug.LogWarning("TouchScript > Pointer with id [" + id + + if (DebugMode) Debug.LogWarning("TouchScript > Pointer with id [" + id + "] is requested to END more than once this frame."); #else pointersReleased.Add(id); #endif + +#if TOUCHSCRIPT_DEBUG + if (DebugMode) Debug.Log("TouchScript > Pointer Released: " + pointer); +#endif } } @@ -465,7 +481,7 @@ internal void INTERNAL_RemovePointer(int id) if (pointer == null) { #if TOUCHSCRIPT_DEBUG - Debug.LogWarning("TouchScript > Pointer with id [" + id + + if (DebugMode) Debug.LogWarning("TouchScript > Pointer with id [" + id + "] is requested to REMOVE but no pointer with such id found."); #endif return; @@ -473,11 +489,15 @@ internal void INTERNAL_RemovePointer(int id) } #if TOUCHSCRIPT_DEBUG if (!pointersRemoved.Add(pointer.Id)) - Debug.LogWarning("TouchScript > Pointer with id [" + id + + if (DebugMode) Debug.LogWarning("TouchScript > Pointer with id [" + id + "] is requested to REMOVE more than once this frame."); #else pointersRemoved.Add(pointer.Id); #endif + +#if TOUCHSCRIPT_DEBUG + if (DebugMode) Debug.Log("TouchScript > Pointer Removed: " + pointer); +#endif } } @@ -495,7 +515,7 @@ internal void INTERNAL_CancelPointer(int id) if (pointer == null) { #if TOUCHSCRIPT_DEBUG - Debug.LogWarning("TouchScript > Pointer with id [" + id + + if (DebugMode) Debug.LogWarning("TouchScript > Pointer with id [" + id + "] is requested to CANCEL but no pointer with such id found."); #endif return; @@ -503,11 +523,15 @@ internal void INTERNAL_CancelPointer(int id) } #if TOUCHSCRIPT_DEBUG if (!pointersCancelled.Add(pointer.Id)) - Debug.LogWarning("TouchScript > Pointer with id [" + id + + if (DebugMode) Debug.LogWarning("TouchScript > Pointer with id [" + id + "] is requested to CANCEL more than once this frame."); #else pointersCancelled.Add(pointer.Id); #endif + +#if TOUCHSCRIPT_DEBUG + if (DebugMode) Debug.Log("TouchScript > Pointer Cancelled: " + pointer); +#endif } } diff --git a/Source/Assets/TouchScript/Scripts/Utils/BinaryUtils.cs b/Source/Assets/TouchScript/Scripts/Utils/BinaryUtils.cs new file mode 100644 index 000000000..669f785d7 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Utils/BinaryUtils.cs @@ -0,0 +1,24 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using System.Text; + +namespace TouchScript.Utils +{ + public static class BinaryUtils + { + + public static void ToBinaryString(uint value, StringBuilder builder, int digits = 32) + { + int i = digits-1; + + while (i >= 0) + { + builder.Append((value & (1 << i)) == 0 ? 0 : 1); + i--; + } + } + + } +} diff --git a/Source/Assets/TouchScript/Scripts/Utils/BinaryUtils.cs.meta b/Source/Assets/TouchScript/Scripts/Utils/BinaryUtils.cs.meta new file mode 100644 index 000000000..5811728d3 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Utils/BinaryUtils.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3b405a870ebaf43898b07b1b373e55b8 +timeCreated: 1470559674 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From b7810c801c682c2f12243e760c1b9c5490e73c13 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 7 Aug 2016 12:00:11 +0300 Subject: [PATCH 076/211] Added Pointer.Buttons. --- .../TUIO/Scripts/InputSources/TuioInput.cs | 18 +- .../Scripts/Behaviors/OverHelper.cs | 2 +- .../InputHandlers/MouseHandler.cs | 117 +++++++----- .../InputHandlers/TouchHandler.cs | 20 +- .../InputHandlers/WindowsPointerHandlers.cs | 107 ++++++++--- .../Scripts/InputSources/InputSource.cs | 2 +- .../TouchScript/Scripts/Pointers/IPointer.cs | 2 +- .../TouchScript/Scripts/Pointers/Pointer.cs | 172 +++++++++++++----- .../Scripts/TouchManagerInstance.cs | 12 +- 9 files changed, 313 insertions(+), 139 deletions(-) diff --git a/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs b/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs index 80e052baa..3b4df7074 100644 --- a/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs +++ b/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs @@ -263,11 +263,11 @@ protected override void OnDisable() #region Private functions - private TouchPointer internalAddTouch(Vector2 position, uint flags = 0) + private TouchPointer internalAddTouch(Vector2 position) { var pointer = touchPool.Get(); pointer.Position = remapCoordinates(position); - pointer.Flags |= flags; + pointer.Buttons |= Pointer.PointerButtonState.FirstButtonDown | Pointer.PointerButtonState.FirstButtonPressed; addPointer(pointer); pressPointer(pointer); return pointer; @@ -277,16 +277,18 @@ private TouchPointer internalReturnTouch(TouchPointer pointer) { var newPointer = touchPool.Get(); newPointer.CopyFrom(pointer); + pointer.Buttons |= Pointer.PointerButtonState.FirstButtonDown | Pointer.PointerButtonState.FirstButtonPressed; + newPointer.Flags |= Pointer.FLAG_RETURNED; addPointer(newPointer); pressPointer(newPointer); return newPointer; } - private ObjectPointer internalAddObject(Vector2 position, uint flags = 0) + private ObjectPointer internalAddObject(Vector2 position) { var pointer = objectPool.Get(); pointer.Position = remapCoordinates(position); - pointer.Flags |= flags; + pointer.Buttons |= Pointer.PointerButtonState.FirstButtonDown | Pointer.PointerButtonState.FirstButtonPressed; addPointer(pointer); pressPointer(pointer); return pointer; @@ -296,6 +298,8 @@ private ObjectPointer internalReturnObject(ObjectPointer pointer, Vector2 positi { var newPointer = objectPool.Get(); newPointer.CopyFrom(pointer); + pointer.Buttons |= Pointer.PointerButtonState.FirstButtonDown | Pointer.PointerButtonState.FirstButtonPressed; + newPointer.Flags |= Pointer.FLAG_RETURNED; addPointer(newPointer); pressPointer(newPointer); return newPointer; @@ -364,7 +368,7 @@ private void OnCursorAdded(object sender, TuioCursorEventArgs e) { var x = entity.X * screenWidth; var y = (1 - entity.Y) * screenHeight; - cursorToInternalId.Add(entity, internalAddTouch(new Vector2(x, y), Pointer.FLAG_FIRST_BUTTON)); + cursorToInternalId.Add(entity, internalAddTouch(new Vector2(x, y))); } } @@ -405,7 +409,7 @@ private void OnBlobAdded(object sender, TuioBlobEventArgs e) { var x = entity.X * screenWidth; var y = (1 - entity.Y) * screenHeight; - var touch = internalAddObject(new Vector2(x, y), Pointer.FLAG_FIRST_BUTTON); + var touch = internalAddObject(new Vector2(x, y)); updateBlobProperties(touch, entity); blobToInternalId.Add(entity, touch); } @@ -449,7 +453,7 @@ private void OnObjectAdded(object sender, TuioObjectEventArgs e) { var x = entity.X * screenWidth; var y = (1 - entity.Y) * screenHeight; - var touch = internalAddObject(new Vector2(x, y), Pointer.FLAG_FIRST_BUTTON); + var touch = internalAddObject(new Vector2(x, y)); updateObjectProperties(touch, entity); objectToInternalId.Add(entity, touch); } diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/OverHelper.cs b/Source/Assets/TouchScript/Scripts/Behaviors/OverHelper.cs index 879deabdb..8513f2553 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/OverHelper.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/OverHelper.cs @@ -100,7 +100,7 @@ private void pointersUpdatedHandler(object sender, PointerEventArgs pointerEvent for (var i = 0; i < count; i++) { var pointer = p[i]; - if ((pointer.Flags & Pointer.FLAG_INCONTACT) != 0) continue; // we ignore pressed pointers + if ((pointer.Buttons & Pointer.PointerButtonState.AnyButtonPressed) != 0) continue; // we ignore pressed pointers if (PointerUtils.IsPointerOnTarget(pointer, transform)) pointers.Add(pointer.Id); else pointers.Remove(pointer.Id); } diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs index 4ff423c38..cd209bf2a 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs @@ -88,7 +88,7 @@ public void UpdateInput() if (addFakePointer.ShouldAdd) { addFakePointer.ShouldAdd = false; - fakeMousePointer = internalAddPointer(addFakePointer.Position, addFakePointer.Flags); + fakeMousePointer = internalAddPointer(addFakePointer.Position, addFakePointer.Buttons, addFakePointer.Flags); pressPointer(fakeMousePointer); } @@ -108,52 +108,44 @@ public void UpdateInput() updatePointer(mousePointer); } - var flags = mousePointer.Flags; - var buttonFlags = flags & Pointer.FLAG_INCONTACT; - if (buttonFlags == 0) + var buttons = mousePointer.Buttons; + var newButtons = getMouseButtons(); + + if (buttons == newButtons) return; // nothing new happened + + // pressed something + if (buttons == Pointer.PointerButtonState.Nothing) { - // Hovering point - if (Input.GetMouseButtonDown(0) || Input.GetMouseButtonDown(1) || Input.GetMouseButtonDown(2)) + // pressed and released this frame + if ((newButtons & Pointer.PointerButtonState.AnyButtonPressed) == 0) { - // But there was a click this frame - var newFlags = getMouseButtonFlags(); - mousePointer.Flags = (flags & ~Pointer.FLAG_INCONTACT) | newFlags; + // Add pressed buttons for processing + mousePointer.Buttons = newButtons | (Pointer.PointerButtonState) ((uint) (newButtons & Pointer.PointerButtonState.AnyButtonDown) >> 1); + pressPointer(mousePointer); + releasePointer(mousePointer); + tryAddFakePointer(newButtons); + } + // pressed this frame + else + { + mousePointer.Buttons = newButtons; pressPointer(mousePointer); - if (newFlags == 0) - { - // And release the same frame - releasePointer(mousePointer); - if (emulateSecondMousePointer - && (Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt)) - && fakeMousePointer == null) - { - addFakePointer.ShouldAdd = true; - addFakePointer.Flags = flags | Pointer.FLAG_ARTIFICIAL; - addFakePointer.Position = mousePointPos; - } - } } } + // released or button state changed else { - var newFlags = getMouseButtonFlags(); - var oldFlags = flags & Pointer.FLAG_INCONTACT; - mousePointer.Flags = (flags & ~Pointer.FLAG_INCONTACT) | newFlags; - if (newFlags == 0) + // released this frame + if ((newButtons & Pointer.PointerButtonState.AnyButtonPressed) == 0) { - // Released this frame + mousePointer.Buttons = newButtons; releasePointer(mousePointer); - if (emulateSecondMousePointer - && (Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt)) - && fakeMousePointer == null) - { - addFakePointer.ShouldAdd = true; - addFakePointer.Flags = flags | Pointer.FLAG_ARTIFICIAL; - addFakePointer.Position = mousePointPos; - } - } else if (newFlags != oldFlags) + tryAddFakePointer(newButtons); + } + // button state changed this frame + else { - // Button state changed + mousePointer.Buttons = newButtons; updatePointer(mousePointer); } } @@ -211,19 +203,47 @@ public void INTERNAL_DiscardPointer(Pointer pointer) #region Private functions - private uint getMouseButtonFlags() + private Pointer.PointerButtonState getMouseButtons() + { + Pointer.PointerButtonState buttons = Pointer.PointerButtonState.Nothing; + + if (Input.GetMouseButton(0)) buttons |= Pointer.PointerButtonState.FirstButtonPressed; + if (Input.GetMouseButtonDown(0)) buttons |= Pointer.PointerButtonState.FirstButtonDown; + if (Input.GetMouseButtonUp(0)) buttons |= Pointer.PointerButtonState.FirstButtonUp; + + if (Input.GetMouseButton(1)) buttons |= Pointer.PointerButtonState.SecondButtonPressed; + if (Input.GetMouseButtonDown(1)) buttons |= Pointer.PointerButtonState.SecondButtonDown; + if (Input.GetMouseButtonUp(1)) buttons |= Pointer.PointerButtonState.SecondButtonUp; + + if (Input.GetMouseButton(2)) buttons |= Pointer.PointerButtonState.ThirdButtonPressed; + if (Input.GetMouseButtonDown(2)) buttons |= Pointer.PointerButtonState.ThirdButtonDown; + if (Input.GetMouseButtonUp(2)) buttons |= Pointer.PointerButtonState.ThirdButtonUp; + + return buttons; + } + + private void tryAddFakePointer(Pointer.PointerButtonState newButtons) { - uint pressedButtons = 0; - if (Input.GetMouseButton(0)) pressedButtons |= Pointer.FLAG_FIRST_BUTTON; - if (Input.GetMouseButton(1)) pressedButtons |= Pointer.FLAG_SECOND_BUTTON; - if (Input.GetMouseButton(2)) pressedButtons |= Pointer.FLAG_THIRD_BUTTON; - return pressedButtons; + if (emulateSecondMousePointer + && (Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt)) + && fakeMousePointer == null) + { + var up = (uint)(newButtons & Pointer.PointerButtonState.AnyButtonUp); + addFakePointer.ShouldAdd = true; + addFakePointer.Flags = mousePointer.Flags | Pointer.FLAG_ARTIFICIAL; + addFakePointer.Buttons = newButtons + & ~Pointer.PointerButtonState.AnyButtonUp // remove up state from fake pointer + | (Pointer.PointerButtonState)(up >> 1) // Add down state from pressed buttons + | (Pointer.PointerButtonState)(up >> 2); // Add pressed state from pressed buttons + addFakePointer.Position = mousePointPos; + } } - private MousePointer internalAddPointer(Vector2 position, uint flags = 0) + private MousePointer internalAddPointer(Vector2 position, Pointer.PointerButtonState buttons = Pointer.PointerButtonState.Nothing, uint flags = 0) { var pointer = mousePool.Get(); pointer.Position = remapCoordinates(position); + pointer.Buttons |= buttons; pointer.Flags |= flags; addPointer(pointer); return pointer; @@ -233,8 +253,14 @@ private MousePointer internalReturnPointer(MousePointer pointer) { var newPointer = mousePool.Get(); newPointer.CopyFrom(pointer); + newPointer.Flags |= Pointer.FLAG_RETURNED; addPointer(newPointer); - if ((newPointer.Flags & Pointer.FLAG_INCONTACT) != 0) pressPointer(newPointer); + if ((newPointer.Buttons & Pointer.PointerButtonState.AnyButtonPressed) != 0) + { + // Adding down state this frame + newPointer.Buttons |= (Pointer.PointerButtonState) ((uint) (newPointer.Buttons & Pointer.PointerButtonState.AnyButtonPressed) << 1); + pressPointer(newPointer); + } return newPointer; } @@ -250,6 +276,7 @@ private struct DelayedFakePointer { public bool ShouldAdd; public uint Flags; + public Pointer.PointerButtonState Buttons; public Vector2 Position; } diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs index 4e154a8ab..48c4578f8 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/TouchHandler.cs @@ -87,11 +87,11 @@ public void UpdateInput() { // Ending previous touch (missed a frame) internalRemovePointer(touchState.Pointer); - systemToInternalId[t.fingerId] = new TouchState(internalAddPointer(t.position, Pointer.FLAG_FIRST_BUTTON)); + systemToInternalId[t.fingerId] = new TouchState(internalAddPointer(t.position)); } else { - systemToInternalId.Add(t.fingerId, new TouchState(internalAddPointer(t.position, Pointer.FLAG_FIRST_BUTTON))); + systemToInternalId.Add(t.fingerId, new TouchState(internalAddPointer(t.position))); } break; case TouchPhase.Moved: @@ -106,7 +106,7 @@ public void UpdateInput() else { // Missed began phase - systemToInternalId.Add(t.fingerId, new TouchState(internalAddPointer(t.position, Pointer.FLAG_FIRST_BUTTON))); + systemToInternalId.Add(t.fingerId, new TouchState(internalAddPointer(t.position))); } break; case TouchPhase.Ended: @@ -118,7 +118,7 @@ public void UpdateInput() else { // Missed one finger begin-end transition - var pointer = internalAddPointer(t.position, Pointer.FLAG_FIRST_BUTTON); + var pointer = internalAddPointer(t.position); internalRemovePointer(pointer); } break; @@ -131,7 +131,7 @@ public void UpdateInput() else { // Missed one finger begin-end transition - var pointer = internalAddPointer(t.position, Pointer.FLAG_FIRST_BUTTON); + var pointer = internalAddPointer(t.position); internalCancelPointer(pointer); } break; @@ -140,7 +140,7 @@ public void UpdateInput() else { // Missed begin phase - systemToInternalId.Add(t.fingerId, new TouchState(internalAddPointer(t.position, Pointer.FLAG_FIRST_BUTTON))); + systemToInternalId.Add(t.fingerId, new TouchState(internalAddPointer(t.position))); } break; } @@ -199,12 +199,12 @@ public void INTERNAL_DiscardPointer(Pointer pointer) #region Private functions - private Pointer internalAddPointer(Vector2 position, uint flags = 0) + private Pointer internalAddPointer(Vector2 position) { pointersNum++; var pointer = touchPool.Get(); pointer.Position = remapCoordinates(position); - pointer.Flags |= flags; + pointer.Buttons |= Pointer.PointerButtonState.FirstButtonDown | Pointer.PointerButtonState.FirstButtonPressed; addPointer(pointer); pressPointer(pointer); return pointer; @@ -215,6 +215,8 @@ private TouchPointer internalReturnPointer(TouchPointer pointer) pointersNum++; var newPointer = touchPool.Get(); newPointer.CopyFrom(pointer); + pointer.Buttons |= Pointer.PointerButtonState.FirstButtonDown | Pointer.PointerButtonState.FirstButtonPressed; + newPointer.Flags |= Pointer.FLAG_RETURNED; addPointer(newPointer); pressPointer(newPointer); return newPointer; @@ -223,6 +225,8 @@ private TouchPointer internalReturnPointer(TouchPointer pointer) private void internalRemovePointer(Pointer pointer) { pointersNum--; + pointer.Buttons &= ~Pointer.PointerButtonState.FirstButtonPressed; + pointer.Buttons |= Pointer.PointerButtonState.FirstButtonUp; releasePointer(pointer); removePointer(pointer); } diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs index b2e34396c..36703a896 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs @@ -4,7 +4,6 @@ * @author Andrew David Griffiths */ - #if UNITY_STANDALONE_WIN using System; @@ -38,7 +37,13 @@ public bool MouseInPointer { if (mousePointer != null) { - if ((mousePointer.Flags & Pointer.FLAG_INCONTACT) != 0) releasePointer(mousePointer); + 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 + releasePointer(mousePointer); + } removePointer(mousePointer); } } @@ -170,19 +175,26 @@ private void decodeWin8Touches(uint msg, IntPtr wParam, IntPtr lParam) { if ((pointerInfo.pointerFlags & POINTER_FLAG_CANCELLED) == POINTER_FLAG_CANCELLED) break; var position = new Vector2((p.X - offsetX)*scaleX, Screen.height - (p.Y - offsetY)*scaleY); - var buttonFlags = (pointerInfo.pointerFlags >> 3) & Pointer.FLAG_INCONTACT; switch (pointerInfo.pointerType) { case POINTER_INPUT_TYPE.PT_MOUSE: - mousePointer.Flags = (mousePointer.Flags & ~Pointer.FLAG_INCONTACT) | buttonFlags; + { + var buttons = 1 << (((int) pointerInfo.ButtonChangeType - 1) / 2 * 3 + 1); // down state + mousePointer.Buttons |= (Pointer.PointerButtonState) buttons | (Pointer.PointerButtonState) (uint) (buttons >> 1); // add pressed state pressPointer(mousePointer); + } break; case POINTER_INPUT_TYPE.PT_TOUCH: - winTouchToInternalId.Add(pointerId, internalAddTouchPointer(position, buttonFlags)); + { + winTouchToInternalId.Add(pointerId, internalAddTouchPointer(position)); + } break; case POINTER_INPUT_TYPE.PT_PEN: - penPointer.Flags = (penPointer.Flags & ~Pointer.FLAG_INCONTACT) | buttonFlags; + { + var buttons = 1 << (((int) pointerInfo.ButtonChangeType - 1) / 2 * 3 + 1); // down state + penPointer.Buttons = (Pointer.PointerButtonState) buttons | (Pointer.PointerButtonState) (uint) (buttons >> 1); // add pressed state pressPointer(penPointer); + } break; } } @@ -198,7 +210,13 @@ private void decodeWin8Touches(uint msg, IntPtr wParam, IntPtr lParam) cancelPointer(mousePointer); mousePointer = internalAddMousePointer(mousePointer.Position); // can't totally cancell mouse pointer } - else releasePointer(mousePointer); + else + { + var buttons = 1 << (((int)pointerInfo.ButtonChangeType - 2) / 2 * 3 + 2); // up state + mousePointer.Buttons |= (Pointer.PointerButtonState) buttons; + mousePointer.Buttons &= ~Pointer.PointerButtonState.AnyButtonPressed; // clear pressed state + releasePointer(mousePointer); + } break; case POINTER_INPUT_TYPE.PT_TOUCH: TouchPointer touchPointer; @@ -208,8 +226,7 @@ private void decodeWin8Touches(uint msg, IntPtr wParam, IntPtr lParam) if ((pointerInfo.pointerFlags & POINTER_FLAG_CANCELLED) == POINTER_FLAG_CANCELLED) cancelPointer(touchPointer); else { - releasePointer(touchPointer); - removePointer(touchPointer); + internalRemoveTouchPointer(touchPointer); } } break; @@ -219,7 +236,13 @@ private void decodeWin8Touches(uint msg, IntPtr wParam, IntPtr lParam) cancelPointer(penPointer); penPointer = internalAddPenPointer(penPointer.Position); // can't totally cancell mouse pointer; } - else releasePointer(penPointer); + else + { + var buttons = 1 << (((int)pointerInfo.ButtonChangeType - 2) / 2 * 3 + 2); // up state + penPointer.Buttons |= (Pointer.PointerButtonState)buttons; + penPointer.Buttons &= ~Pointer.PointerButtonState.AnyButtonPressed; // clear pressed state + releasePointer(penPointer); + } break; } } @@ -227,7 +250,7 @@ private void decodeWin8Touches(uint msg, IntPtr wParam, IntPtr lParam) case WM_POINTERUPDATE: { Pointer pointer = null; - var position = remapCoordinates(new Vector2((p.X - offsetX)*scaleX, Screen.height - (p.Y - offsetY)*scaleY)); + var position = new Vector2((p.X - offsetX)*scaleX, Screen.height - (p.Y - offsetY)*scaleY); switch (pointerInfo.pointerType) { case POINTER_INPUT_TYPE.PT_MOUSE: @@ -246,13 +269,26 @@ private void decodeWin8Touches(uint msg, IntPtr wParam, IntPtr lParam) { if ((pointerInfo.pointerFlags & POINTER_FLAG_CANCELLED) == POINTER_FLAG_CANCELLED) { - if (pointerInfo.pointerType == POINTER_INPUT_TYPE.PT_TOUCH) winTouchToInternalId.Remove(pointerId); cancelPointer(pointer); + switch (pointerInfo.pointerType) + { + case POINTER_INPUT_TYPE.PT_MOUSE: + mousePointer = internalAddMousePointer(pointer.Position); // can't totally cancell mouse pointer + break; + case POINTER_INPUT_TYPE.PT_TOUCH: + winTouchToInternalId.Remove(pointerId); + break; + case POINTER_INPUT_TYPE.PT_PEN: + penPointer = internalAddPenPointer(pointer.Position); // can't totally cancell mouse pointer; + break; + } } else { - var buttonFlags = (pointerInfo.pointerFlags >> 3) & Pointer.FLAG_INCONTACT; - pointer.Flags = (pointer.Flags & ~Pointer.FLAG_INCONTACT) | buttonFlags; + var down = 1 << (((int)pointerInfo.ButtonChangeType - 1) / 2 * 3 + 1); // down state + var up = 1 << (((int)pointerInfo.ButtonChangeType - 2) / 2 * 3 + 2); // up state + pointer.Buttons |= (Pointer.PointerButtonState)down | (Pointer.PointerButtonState)up | (Pointer.PointerButtonState)(uint)(down >> 1); // add pressed state + pointer.Buttons &= ~(Pointer.PointerButtonState) (uint) (up >> 2); // removed pressed where up is 1 pointer.Position = position; updatePointer(pointer); } @@ -262,11 +298,10 @@ private void decodeWin8Touches(uint msg, IntPtr wParam, IntPtr lParam) } } - private MousePointer internalAddMousePointer(Vector2 position, uint flags = 0) + private MousePointer internalAddMousePointer(Vector2 position) { var pointer = mousePool.Get(); pointer.Position = remapCoordinates(position); - pointer.Flags |= flags; addPointer(pointer); return pointer; } @@ -275,16 +310,21 @@ private MousePointer internalReturnMousePointer(MousePointer pointer) { var newPointer = mousePool.Get(); newPointer.CopyFrom(pointer); + newPointer.Flags |= Pointer.FLAG_RETURNED; addPointer(newPointer); - if ((newPointer.Flags & Pointer.FLAG_INCONTACT) != 0) pressPointer(newPointer); + if ((newPointer.Buttons & Pointer.PointerButtonState.AnyButtonPressed) != 0) + { + // Adding down state this frame + newPointer.Buttons |= (Pointer.PointerButtonState)((uint)(newPointer.Buttons & Pointer.PointerButtonState.AnyButtonPressed) << 1); + pressPointer(newPointer); + } return newPointer; } - private PenPointer internalAddPenPointer(Vector2 position, uint flags = 0) + private PenPointer internalAddPenPointer(Vector2 position) { var pointer = penPool.Get(); pointer.Position = remapCoordinates(position); - pointer.Flags |= flags; addPointer(pointer); return pointer; } @@ -293,8 +333,14 @@ private PenPointer internalReturnPenPointer(PenPointer pointer) { var newPointer = penPool.Get(); newPointer.CopyFrom(pointer); + newPointer.Flags |= Pointer.FLAG_RETURNED; addPointer(newPointer); - if ((newPointer.Flags & Pointer.FLAG_INCONTACT) != 0) pressPointer(newPointer); + if ((newPointer.Buttons & Pointer.PointerButtonState.AnyButtonPressed) != 0) + { + // Adding down state this frame + newPointer.Buttons |= (Pointer.PointerButtonState)((uint)(newPointer.Buttons & Pointer.PointerButtonState.AnyButtonPressed) << 1); + pressPointer(newPointer); + } return newPointer; } } @@ -358,7 +404,7 @@ private void decodeWin7Touches(IntPtr wParam, IntPtr lParam) p.Y = touch.y/100; ScreenToClient(hMainWindow, ref p); - winTouchToInternalId.Add(touch.dwID, internalAddTouchPointer(new Vector2((p.X - offsetX)*scaleX, Screen.height - (p.Y - offsetY)*scaleY), Pointer.FLAG_FIRST_BUTTON)); + winTouchToInternalId.Add(touch.dwID, internalAddTouchPointer(new Vector2((p.X - offsetX)*scaleX, Screen.height - (p.Y - offsetY)*scaleY))); } else if ((touch.dwFlags & (int) TOUCH_EVENT.TOUCHEVENTF_UP) != 0) { @@ -366,8 +412,7 @@ private void decodeWin7Touches(IntPtr wParam, IntPtr lParam) if (winTouchToInternalId.TryGetValue(touch.dwID, out touchPointer)) { winTouchToInternalId.Remove(touch.dwID); - releasePointer(touchPointer); - removePointer(touchPointer); + internalRemoveTouchPointer(touchPointer); } } else if ((touch.dwFlags & (int) TOUCH_EVENT.TOUCHEVENTF_MOVE) != 0) @@ -530,25 +575,35 @@ public virtual void INTERNAL_DiscardPointer(Pointer pointer) #region Protected methods - protected TouchPointer internalAddTouchPointer(Vector2 position, uint flags = 0) + protected TouchPointer internalAddTouchPointer(Vector2 position) { var pointer = touchPool.Get(); pointer.Position = remapCoordinates(position); - pointer.Flags |= flags; + pointer.Buttons |= Pointer.PointerButtonState.FirstButtonDown | Pointer.PointerButtonState.FirstButtonPressed; addPointer(pointer); pressPointer(pointer); return pointer; } - private TouchPointer internalReturnTouchPointer(TouchPointer pointer) + protected TouchPointer internalReturnTouchPointer(TouchPointer pointer) { var newPointer = touchPool.Get(); newPointer.CopyFrom(pointer); + pointer.Buttons |= Pointer.PointerButtonState.FirstButtonDown | Pointer.PointerButtonState.FirstButtonPressed; + newPointer.Flags |= Pointer.FLAG_RETURNED; addPointer(newPointer); pressPointer(newPointer); return newPointer; } + protected void internalRemoveTouchPointer(TouchPointer pointer) + { + pointer.Buttons &= ~Pointer.PointerButtonState.FirstButtonPressed; + pointer.Buttons |= Pointer.PointerButtonState.FirstButtonUp; + releasePointer(pointer); + removePointer(pointer); + } + protected void registerWindowProc(WndProcDelegate windowProc) { newWndProc = windowProc; diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs index f73189f99..c60a7dd62 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputSource.cs @@ -136,7 +136,7 @@ protected virtual void pressPointer(Pointer pointer) protected virtual void releasePointer(Pointer pointer) { if (pointer == null) return; - pointer.Flags = pointer.Flags & ~Pointer.FLAG_INCONTACT; + pointer.Buttons &= ~Pointer.PointerButtonState.AnyButtonPressed; manager.INTERNAL_ReleasePointer(pointer.Id); } diff --git a/Source/Assets/TouchScript/Scripts/Pointers/IPointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/IPointer.cs index 47829ec69..2dce019fb 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/IPointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/IPointer.cs @@ -32,7 +32,7 @@ public interface IPointer Vector2 Position { get; set; } /// - /// 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; set; } diff --git a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs index 465b5c65a..9e348f5d9 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs @@ -31,34 +31,7 @@ public class Pointer : IPointer /// public const uint FLAG_ARTIFICIAL = 1 << 0; - /// - /// Indicates a primary action, analogous to a left mouse button down. - /// A or has this flag set when it is in contact with the digitizer surface. - /// A has this flag set when it is in contact with the digitizer surface with no buttons pressed. - /// A has this flag set when the left mouse button is down. - /// - public const uint FLAG_FIRST_BUTTON = 1 << 1; - - /// - /// 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. - /// - public const uint FLAG_SECOND_BUTTON = 1 << 2; - - /// - /// Analogous to a mouse wheel button down. - /// A or does not use this flag. - /// A does not use this flag. - /// A has this flag set when the mouse wheel button is down. - /// - public const uint FLAG_THIRD_BUTTON = 1 << 3; - - /// - /// Indicates that this pointer is in contact with the surface. When this flag is not set, it indicates a hovering pointer. - /// - public const uint FLAG_INCONTACT = FLAG_FIRST_BUTTON | FLAG_SECOND_BUTTON | FLAG_THIRD_BUTTON; + public const uint FLAG_RETURNED = 1 << 1; /// /// Pointer type. @@ -91,6 +64,114 @@ public enum PointerType Object } + [Flags] + public enum PointerButtonState + { + Nothing = 0, + + /// + /// Indicates a primary action, analogous to a left mouse button down. + /// A or has this flag set when it is in contact with the digitizer surface. + /// A has this flag set when it is in contact with the digitizer surface with no buttons pressed. + /// A has this flag set when the left mouse button is down. + /// + FirstButtonPressed = 1 << 0, + + /// + /// First button pressed this frame. + /// + FirstButtonDown = 1 << 1, + + /// + /// First button released this frame. + /// + FirstButtonUp = 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. + /// + SecondButtonPressed = 1 << 3, + + /// + /// Second button pressed this frame. + /// + SecondButtonDown = 1 << 4, + + /// + /// Second button released this frame. + /// + SecondButtonUp = 1 << 5, + + /// + /// 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. + /// + ThirdButtonPressed = 1 << 6, + + /// + /// Third button pressed this frame. + /// + ThirdButtonDown = 1 << 7, + + /// + /// Third button released this frame. + /// + ThirdButtonUp = 1 << 8, + + /// + /// 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. + /// + FourthButtonPressed = 1 << 9, + + /// + /// Fourth button pressed this frame. + /// + FourthButtonDown = 1 << 10, + + /// + /// Fourth button released this frame. + /// + FourthButtonUp = 1 << 11, + + /// + /// 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. + /// + FifthButtonPressed = 1 << 12, + + /// + /// Fifth button pressed this frame. + /// + FifthButtonDown = 1 << 13, + + /// + /// Fifth button released this frame. + /// + FifthButtonUp = 1 << 14, + + /// + /// Any button is pressed. + /// + AnyButtonPressed = FirstButtonPressed | SecondButtonPressed | ThirdButtonPressed | FourthButtonPressed | FifthButtonPressed, + + /// + /// Any button down this frame. + /// + AnyButtonDown = FirstButtonDown | SecondButtonDown | ThirdButtonDown | FourthButtonDown | FifthButtonDown, + + /// + /// Any button up this frame. + /// + AnyButtonUp = FirstButtonUp | SecondButtonUp | ThirdButtonUp | FourthButtonUp | FifthButtonUp + } + #endregion #region Public properties @@ -101,6 +182,8 @@ public enum PointerType /// public PointerType Type { get; protected set; } + public PointerButtonState Buttons { get; set; } + /// /// Original input source which created this pointer. /// @@ -123,19 +206,10 @@ public Vector2 Position public Vector2 PreviousPosition { get; private set; } /// - /// 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. /// - public uint Flags - { - get { return flags; } - set { newFlags = value; } - } - - /// - /// Gets the previous value of . - /// - public uint PreviousFlags { get; private set; } + public uint Flags { get; set; } /// /// Projection parameters for the layer which created this pointer. @@ -158,7 +232,6 @@ public ProjectionParams ProjectionParams private TouchManagerInstance manager; private int refCount = 0; private Vector2 position, newPosition; - private uint flags, newFlags; private HitData pressData, overData; private bool overDataIsDirty = true; @@ -192,9 +265,8 @@ public HitData GetPressData() public virtual void CopyFrom(Pointer target) { Type = target.Type; - flags = target.flags; - newFlags = target.newFlags; - PreviousFlags = target.PreviousFlags; + Flags = target.Flags; + Buttons = target.Buttons; position = target.position; newPosition = target.newPosition; PreviousPosition = target.PreviousPosition; @@ -263,7 +335,6 @@ internal virtual void INTERNAL_Init(int id) { Id = id; PreviousPosition = position = newPosition; - PreviousFlags = flags = newFlags; } internal virtual void INTERNAL_Reset() @@ -271,18 +342,21 @@ internal virtual void INTERNAL_Reset() Id = INVALID_POINTER; INTERNAL_ClearPressData(); position = newPosition = PreviousPosition = Vector2.zero; - flags = newFlags = PreviousFlags = 0; + Flags = 0; + Buttons = PointerButtonState.Nothing; overDataIsDirty = true; } internal virtual void INTERNAL_FrameStarted() + { + Buttons &= ~(PointerButtonState.AnyButtonDown | PointerButtonState.AnyButtonUp); + overDataIsDirty = true; + } + + internal virtual void INTERNAL_UpdatePosition() { PreviousPosition = position; position = newPosition; - PreviousFlags = flags; - flags = newFlags; - - overDataIsDirty = true; } internal void INTERNAL_Retain() diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs index 47b155fde..141abe5a4 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs @@ -584,6 +584,7 @@ private IEnumerator lateAwake() private void Update() { + sendFrameStartedToPointers(); updateInputs(); updatePointers(); } @@ -853,6 +854,15 @@ private void updateCancelled(List pointers) pointerListPool.Release(list); } + private void sendFrameStartedToPointers() + { + var count = pointers.Count; + for (var i = 0; i < count; i++) + { + pointers[i].INTERNAL_FrameStarted(); + } + } + private void updatePointers() { if (frameStartedInvoker != null) frameStartedInvoker.InvokeHandleExceptions(this, EventArgs.Empty); @@ -907,7 +917,7 @@ private void updatePointers() var count = pointers.Count; for (var i = 0; i < count; i++) { - pointers[i].INTERNAL_FrameStarted(); + pointers[i].INTERNAL_UpdatePosition(); } if (addedList != null) From 420342077ebbf025885bec6724d4e79d518a77e6 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 7 Aug 2016 12:13:29 +0300 Subject: [PATCH 077/211] Buttons string in Pointer. --- .../TouchScript/Scripts/Pointers/Pointer.cs | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs index 9e348f5d9..b1fda70c4 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/Pointer.cs @@ -304,8 +304,28 @@ public override string ToString() builder.Append(Id); builder.Append(", flags: "); BinaryUtils.ToBinaryString(Flags, builder, 8); - // builder.Append(", buttons: "); - // builder.Append((uint)Buttons); + 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(")"); From 38729d90369019792ad0fa6b2ec581c753fde9d6 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 7 Aug 2016 12:25:40 +0300 Subject: [PATCH 078/211] Fixed TouchManager auto enabling debug mode. --- .../TouchScript/Scripts/TouchManager.cs | 4 +++ .../Scripts/TouchManagerInstance.cs | 26 ++++++++----------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/TouchManager.cs b/Source/Assets/TouchScript/Scripts/TouchManager.cs index 2c191bd54..daee88353 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManager.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManager.cs @@ -315,6 +315,10 @@ private void Awake() { if (Instance == null) return; +#if TOUCHSCRIPT_DEBUG + if (DebugMode) (Instance as TouchManagerInstance).DebugMode = true; +#endif + Instance.DisplayDevice = displayDevice as IDisplayDevice; Instance.ShouldCreateCameraLayer = ShouldCreateCameraLayer; Instance.ShouldCreateStandardInput = ShouldCreateStandardInput; diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs index 141abe5a4..3bd464082 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs @@ -561,10 +561,6 @@ private void Awake() pointerListPool.WarmUp(2); intListPool.WarmUp(3); - -#if TOUCHSCRIPT_DEBUG - DebugMode = true; -#endif } private void OnLevelWasLoaded(int value) @@ -667,7 +663,7 @@ private void updateAdded(List pointers) idToPointer.Add(pointer.Id, pointer); #if TOUCHSCRIPT_DEBUG - addDebugFigureForPointer(pointer); + if (DebugMode) addDebugFigureForPointer(pointer); #endif } @@ -687,7 +683,7 @@ private void updateUpdated(List pointers) if (!idToPointer.TryGetValue(id, out pointer)) { #if TOUCHSCRIPT_DEBUG - Debug.LogWarning("TouchScript > Id [" + id + + if (DebugMode) Debug.LogWarning("TouchScript > Id [" + id + "] was in UPDATED list but no pointer with such id found."); #endif continue; @@ -697,7 +693,7 @@ private void updateUpdated(List pointers) if (layer != null) layer.INTERNAL_UpdatePointer(pointer); #if TOUCHSCRIPT_DEBUG - addDebugFigureForPointer(pointer); + if (DebugMode) addDebugFigureForPointer(pointer); #endif } @@ -717,7 +713,7 @@ private void updatePressed(List pointers) if (!idToPointer.TryGetValue(id, out pointer)) { #if TOUCHSCRIPT_DEBUG - Debug.LogWarning("TouchScript > Id [" + id + + if (DebugMode) Debug.LogWarning("TouchScript > Id [" + id + "] was in PRESSED list but no pointer with such id found."); #endif continue; @@ -732,7 +728,7 @@ private void updatePressed(List pointers) } #if TOUCHSCRIPT_DEBUG - addDebugFigureForPointer(pointer); + if (DebugMode) addDebugFigureForPointer(pointer); #endif } @@ -752,7 +748,7 @@ private void updateReleased(List pointers) if (!idToPointer.TryGetValue(id, out pointer)) { #if TOUCHSCRIPT_DEBUG - Debug.LogWarning("TouchScript > Id [" + id + "] was in RELEASED list but no pointer with such id found."); + if (DebugMode) Debug.LogWarning("TouchScript > Id [" + id + "] was in RELEASED list but no pointer with such id found."); #endif continue; } @@ -762,7 +758,7 @@ private void updateReleased(List pointers) if (layer != null) layer.INTERNAL_ReleasePointer(pointer); #if TOUCHSCRIPT_DEBUG - addDebugFigureForPointer(pointer); + if (DebugMode) addDebugFigureForPointer(pointer); #endif } @@ -789,7 +785,7 @@ private void updateRemoved(List pointers) if (!idToPointer.TryGetValue(id, out pointer)) { #if TOUCHSCRIPT_DEBUG - Debug.LogWarning("TouchScript > Id [" + id + "] was in REMOVED list but no pointer with such id found."); + if (DebugMode) Debug.LogWarning("TouchScript > Id [" + id + "] was in REMOVED list but no pointer with such id found."); #endif continue; } @@ -799,7 +795,7 @@ private void updateRemoved(List pointers) list.Add(pointer); #if TOUCHSCRIPT_DEBUG - removeDebugFigureForPointer(pointer); + if (DebugMode) removeDebugFigureForPointer(pointer); #endif } @@ -826,7 +822,7 @@ private void updateCancelled(List pointers) if (!idToPointer.TryGetValue(id, out pointer)) { #if TOUCHSCRIPT_DEBUG - Debug.LogWarning("TouchScript > Id [" + id + + if (DebugMode) Debug.LogWarning("TouchScript > Id [" + id + "] was in CANCELLED list but no pointer with such id found."); #endif continue; @@ -839,7 +835,7 @@ private void updateCancelled(List pointers) if (layer != null) layer.INTERNAL_CancelPointer(pointer); #if TOUCHSCRIPT_DEBUG - removeDebugFigureForPointer(pointer); + if (DebugMode) removeDebugFigureForPointer(pointer); #endif } From d2b36c685b56467b88f44eb54415255527325d1a Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 7 Aug 2016 13:16:02 +0300 Subject: [PATCH 079/211] Fixed Windows 8 mouse buttons state. --- .../InputHandlers/WindowsPointerHandlers.cs | 44 ++++++++++++------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs index 36703a896..3b49e2457 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs @@ -175,12 +175,14 @@ private void decodeWin8Touches(uint msg, IntPtr wParam, IntPtr lParam) { if ((pointerInfo.pointerFlags & POINTER_FLAG_CANCELLED) == POINTER_FLAG_CANCELLED) break; var position = new Vector2((p.X - offsetX)*scaleX, Screen.height - (p.Y - offsetY)*scaleY); + switch (pointerInfo.pointerType) { case POINTER_INPUT_TYPE.PT_MOUSE: { - var buttons = 1 << (((int) pointerInfo.ButtonChangeType - 1) / 2 * 3 + 1); // down state - mousePointer.Buttons |= (Pointer.PointerButtonState) buttons | (Pointer.PointerButtonState) (uint) (buttons >> 1); // add pressed state + var button = (((int)pointerInfo.ButtonChangeType - 1) / 2) * 3; + mousePointer.Buttons |= (Pointer.PointerButtonState)(1 << (button + 1)); // add down + mousePointer.Buttons |= (Pointer.PointerButtonState)(1 << button); // add pressed pressPointer(mousePointer); } break; @@ -191,8 +193,9 @@ private void decodeWin8Touches(uint msg, IntPtr wParam, IntPtr lParam) break; case POINTER_INPUT_TYPE.PT_PEN: { - var buttons = 1 << (((int) pointerInfo.ButtonChangeType - 1) / 2 * 3 + 1); // down state - penPointer.Buttons = (Pointer.PointerButtonState) buttons | (Pointer.PointerButtonState) (uint) (buttons >> 1); // add pressed state + var button = (((int)pointerInfo.ButtonChangeType - 1) / 2) * 3; + penPointer.Buttons |= (Pointer.PointerButtonState)(1 << (button + 1)); // add down + penPointer.Buttons |= (Pointer.PointerButtonState)(1 << button); // add pressed pressPointer(penPointer); } break; @@ -212,10 +215,10 @@ private void decodeWin8Touches(uint msg, IntPtr wParam, IntPtr lParam) } else { - var buttons = 1 << (((int)pointerInfo.ButtonChangeType - 2) / 2 * 3 + 2); // up state - mousePointer.Buttons |= (Pointer.PointerButtonState) buttons; - mousePointer.Buttons &= ~Pointer.PointerButtonState.AnyButtonPressed; // clear pressed state - releasePointer(mousePointer); + var button = ((int)pointerInfo.ButtonChangeType / 2 - 1) * 3; + mousePointer.Buttons |= (Pointer.PointerButtonState)(1 << (button + 2)); // add up + mousePointer.Buttons &= ~(Pointer.PointerButtonState)(1 << button); // remove pressed + releasePointer(mousePointer); } break; case POINTER_INPUT_TYPE.PT_TOUCH: @@ -238,9 +241,9 @@ private void decodeWin8Touches(uint msg, IntPtr wParam, IntPtr lParam) } else { - var buttons = 1 << (((int)pointerInfo.ButtonChangeType - 2) / 2 * 3 + 2); // up state - penPointer.Buttons |= (Pointer.PointerButtonState)buttons; - penPointer.Buttons &= ~Pointer.PointerButtonState.AnyButtonPressed; // clear pressed state + var button = ((int)pointerInfo.ButtonChangeType / 2 - 1) * 3; + penPointer.Buttons |= (Pointer.PointerButtonState)(1 << (button + 2)); // add up + penPointer.Buttons &= ~(Pointer.PointerButtonState)(1 << button); // remove pressed releasePointer(penPointer); } break; @@ -285,10 +288,21 @@ private void decodeWin8Touches(uint msg, IntPtr wParam, IntPtr lParam) } else { - var down = 1 << (((int)pointerInfo.ButtonChangeType - 1) / 2 * 3 + 1); // down state - var up = 1 << (((int)pointerInfo.ButtonChangeType - 2) / 2 * 3 + 2); // up state - pointer.Buttons |= (Pointer.PointerButtonState)down | (Pointer.PointerButtonState)up | (Pointer.PointerButtonState)(uint)(down >> 1); // add pressed state - pointer.Buttons &= ~(Pointer.PointerButtonState) (uint) (up >> 2); // removed pressed where up is 1 + if (pointerInfo.ButtonChangeType != POINTER_BUTTON_CHANGE_TYPE.POINTER_CHANGE_NONE) + { + var change = (int)pointerInfo.ButtonChangeType; + if (change % 2 == 0) // up + { + var button = (change / 2 - 1) * 3; + pointer.Buttons |= (Pointer.PointerButtonState)(1 << (button + 2)); // add up + pointer.Buttons &= ~(Pointer.PointerButtonState)(1 << button); // remove pressed + } else // down + { + var button = ((change - 1) / 2) * 3; + pointer.Buttons |= (Pointer.PointerButtonState)(1 << (button + 1)); // add down + pointer.Buttons |= (Pointer.PointerButtonState)(1 << button); // add pressed + } + } pointer.Position = position; updatePointer(pointer); } From ed0639ad1d21cee04303415121bc037fc3e61b2c Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 7 Aug 2016 13:43:17 +0300 Subject: [PATCH 080/211] Fixed mouse pointer not resetting returned flag. --- .../InputSources/InputHandlers/MouseHandler.cs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs index cd209bf2a..2f468173c 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs @@ -122,8 +122,7 @@ public void UpdateInput() // Add pressed buttons for processing mousePointer.Buttons = newButtons | (Pointer.PointerButtonState) ((uint) (newButtons & Pointer.PointerButtonState.AnyButtonDown) >> 1); pressPointer(mousePointer); - releasePointer(mousePointer); - tryAddFakePointer(newButtons); + internalReleaseMousePointer(newButtons); } // pressed this frame else @@ -139,8 +138,7 @@ public void UpdateInput() if ((newButtons & Pointer.PointerButtonState.AnyButtonPressed) == 0) { mousePointer.Buttons = newButtons; - releasePointer(mousePointer); - tryAddFakePointer(newButtons); + internalReleaseMousePointer(newButtons); } // button state changed this frame else @@ -249,6 +247,13 @@ private MousePointer internalAddPointer(Vector2 position, Pointer.PointerButtonS return pointer; } + private void internalReleaseMousePointer(Pointer.PointerButtonState buttons) + { + mousePointer.Flags &= ~Pointer.FLAG_RETURNED; + releasePointer(mousePointer); + tryAddFakePointer(buttons); + } + private MousePointer internalReturnPointer(MousePointer pointer) { var newPointer = mousePool.Get(); From 541fededee60a75acd1d334c1af89be2b70f1c69 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Mon, 8 Aug 2016 16:30:40 +0300 Subject: [PATCH 081/211] Renamed HitType enum values. --- .../Assets/TouchScript/Scripts/Hit/HitData.cs | 49 ++++++++++++------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Hit/HitData.cs b/Source/Assets/TouchScript/Scripts/Hit/HitData.cs index bad0add42..5323c4f48 100644 --- a/Source/Assets/TouchScript/Scripts/Hit/HitData.cs +++ b/Source/Assets/TouchScript/Scripts/Hit/HitData.cs @@ -2,6 +2,7 @@ * @author Valentin Simonov / http://va.lent.in/ */ +using System; using TouchScript.Layers; using UnityEngine; using UnityEngine.EventSystems; @@ -18,22 +19,25 @@ public struct HitData /// /// Type of hit /// + [Flags] public enum HitType { + ScreenSpace, + /// /// 3D hit. /// - Hit3D, + World3D, /// /// 2D hit. /// - Hit2D, + World2D, /// /// UI hit. /// - HitUI + UI } #endregion @@ -94,6 +98,11 @@ public RaycastResult RaycastResult get { return raycastResult; } } + public bool ScreenSpace + { + get { return screenSpace; } + } + /// /// Gets the point in 3D where raycast hit the object. /// @@ -104,11 +113,11 @@ public Vector3 Point { switch (type) { - case HitType.Hit3D: + case HitType.World3D: return RaycastHit.point; - case HitType.Hit2D: + case HitType.World2D: return RaycastHit2D.point; - case HitType.HitUI: + case HitType.UI: return RaycastResult.worldPosition; } return Vector3.zero; @@ -125,11 +134,11 @@ public Vector3 Normal { switch (type) { - case HitType.Hit3D: + case HitType.World3D: return RaycastHit.normal; - case HitType.Hit2D: + case HitType.World2D: return RaycastHit2D.normal; - case HitType.HitUI: + case HitType.UI: return RaycastResult.worldNormal; } return Vector3.forward; @@ -142,6 +151,7 @@ public Vector3 Normal private HitType type; private Transform target; + private bool screenSpace; private TouchLayer layer; private RaycastHit raycastHit; private RaycastHit2D raycastHit2D; @@ -155,46 +165,47 @@ public Vector3 Normal /// Initializes a new instance of the struct. /// /// Target Target. - public HitData(Transform target, TouchLayer layer) + public HitData(Transform target, TouchLayer layer, bool screenSpace = false) { this.target = target; this.layer = layer; + this.screenSpace = screenSpace; raycastHit = default(RaycastHit); raycastHit2D = default(RaycastHit2D); raycastResult = default(RaycastResult); - type = HitType.Hit3D; + type = HitType.ScreenSpace; } /// /// Initializes a new instance of the struct from a 3D raycast. /// /// 3D raycast value. - public HitData(RaycastHit value, TouchLayer layer) : this(value.collider.transform, layer) + public HitData(RaycastHit value, TouchLayer layer, bool screenSpace = false) : this(value.collider.transform, layer, screenSpace) { raycastHit = value; - type = HitType.Hit3D; + type = HitType.World3D; } /// /// Initializes a new instance of the struct from a 2D raycast. /// /// 2D raycast value. - public HitData(RaycastHit2D value, TouchLayer layer) : - this(value.collider.transform, layer) + public HitData(RaycastHit2D value, TouchLayer layer, bool screenSpace = false) : + this(value.collider.transform, layer, screenSpace) { raycastHit2D = value; - type = HitType.Hit2D; + type = HitType.World2D; } /// /// Initializes a new instance of the struct from a UI raycast. /// /// UI raycast value. - public HitData(RaycastResult value, TouchLayer layer) : - this(value.gameObject.transform, layer) + public HitData(RaycastResult value, TouchLayer layer, bool screenSpace = false) : + this(value.gameObject.transform, layer, screenSpace) { raycastResult = value; - type = HitType.HitUI; + type = HitType.UI; } #endregion From 57d12ef9515d8ed664b9200ccbde4cb72d73c698 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Mon, 8 Aug 2016 16:31:08 +0300 Subject: [PATCH 082/211] Overlay UI layer kinda working. --- .../Assets/TouchScript/Scripts/Layers/UI.meta | 9 + .../Layers/UI/TouchScriptInputModule.cs | 380 ++++++++++++++++++ .../Layers/UI/TouchScriptInputModule.cs.meta | 12 + .../Scripts/Layers/UIOverlayLayer.cs | 164 ++++++++ .../Scripts/Layers/UIOverlayLayer.cs.meta | 12 + 5 files changed, 577 insertions(+) create mode 100644 Source/Assets/TouchScript/Scripts/Layers/UI.meta create mode 100644 Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs create mode 100644 Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs.meta create mode 100644 Source/Assets/TouchScript/Scripts/Layers/UIOverlayLayer.cs create mode 100644 Source/Assets/TouchScript/Scripts/Layers/UIOverlayLayer.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/Layers/UI.meta b/Source/Assets/TouchScript/Scripts/Layers/UI.meta new file mode 100644 index 000000000..846098d55 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Layers/UI.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 98bf3eb5cb0e24a748a370189ec5829e +folderAsset: yes +timeCreated: 1470651932 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs new file mode 100644 index 000000000..9a1a47933 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs @@ -0,0 +1,380 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using System; +using System.Collections.Generic; +using System.Reflection; +using UnityEngine; +using UnityEngine.EventSystems; +using UnityEngine.UI; +using Pointer = TouchScript.Pointers.Pointer; + +namespace TouchScript.Layers.UI +{ + internal sealed class TouchScriptInputModule : BaseInputModule + { + + #region Public properties + + public static TouchScriptInputModule Instance + { + get + { + if (instance == null) + { + if (EventSystem.current != null) + { + instance = EventSystem.current.GetComponent(); + if (instance == null) instance = EventSystem.current.gameObject.AddComponent(); + } + } + return instance; + } + } + + #endregion + + #region Private variables + + private static TouchScriptInputModule instance; + private static FieldInfo raycastersProp; + private static PropertyInfo canvasProp; + private static Dictionary raycasterCanvasCache = new Dictionary(); + private static int refCount = 0; + + private UIPointerInputModule ui; + + #endregion + + #region Constructor + + 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); + } + } + + #endregion + + #region Unity methods + + protected override void OnEnable() + { + base.OnEnable(); + + if (instance == null) instance = this; + else + { + if (instance == this) return; + if (eventSystem != EventSystem.current) + { + Destroy(this); + instance = null; + return; + } + } + + ui = new UIStandardInputModule(this, eventSystem); + + TouchManager.Instance.PointersUpdated += pointerUpdatedHandler; + } + + protected override void OnDisable() + { + if (TouchManager.Instance != null) TouchManager.Instance.PointersUpdated -= pointerUpdatedHandler; + instance = null; + + base.OnDisable(); + } + + #endregion + + #region Public methods + + public List GetRaycasters() + { + return raycastersProp.GetValue(null) as List; + } + + public Canvas GetCanvasForRaycaster(BaseRaycaster raycaster) + { + var id = raycaster.GetInstanceID(); + Canvas canvas; + if (!raycasterCanvasCache.TryGetValue(id, out canvas)) + { + canvas = canvasProp.GetValue(raycaster, null) as Canvas; + raycasterCanvasCache.Add(id, canvas); + } + return canvas; + } + + public override void Process() + { + ui.Process(); + } + + public override bool IsPointerOverGameObject(int pointerId) + { + return base.IsPointerOverGameObject(pointerId); + } + + public override bool ShouldActivateModule() + { + return true; + } + + public override bool IsModuleSupported() + { + return true; + } + + public override void DeactivateModule() {} + + public override void ActivateModule() {} + + public override void UpdateModule() {} + + #endregion + + #region Internal methods + + internal void INTERNAL_Retain() + { + refCount++; + } + + internal int INTERNAL_Release() + { + if (--refCount <= 0) Destroy(this); + return refCount; + } + + #endregion + + #region Private functions + + #endregion + + #region Event handlers + + private void pointerUpdatedHandler(object sender, PointerEventArgs pointerEventArgs) + { + ui.ProcessUpdated(pointerEventArgs.Pointers); + } + + #endregion + + #region Copypasted code from UI + + // last update: df1947cd (5.4f3) + private abstract class UIPointerInputModule + { + + protected TouchScriptInputModule input; + protected EventSystem eventSystem; + + protected Dictionary m_PointerData = new Dictionary(); + + public UIPointerInputModule(TouchScriptInputModule input, EventSystem eventSystem) + { + this.eventSystem = eventSystem; + this.input = input; + } + + #region Unchanged + + protected bool GetPointerData(int id, out PointerEventData data, bool create) + { + if (!m_PointerData.TryGetValue(id, out data) && create) + { + data = new PointerEventData(eventSystem) + { + pointerId = id, + }; + m_PointerData.Add(id, data); + return true; + } + return false; + } + + #endregion + + #region Changed + + #endregion + + public abstract void Process(); + + public virtual void ProcessUpdated(IList pointers) + { + var count = pointers.Count; + for (var i = 0; i < count; i++) + { + var pointer = pointers[i]; + PointerEventData data; + GetPointerData(pointer.Id, out data, true); + + data.position = pointer.Position; + data.delta = pointer.Position - pointer.PreviousPosition; + + var target = pointer.GetOverData().Target; + input.HandlePointerExitAndEnter(data, target == null ? null : target.gameObject); + } + } + + } + + private abstract class UITouchInputModule : UIPointerInputModule + { + + public UITouchInputModule(TouchScriptInputModule input, EventSystem eventSystem) : base(input, eventSystem) + { } + + public override void Process() + {} + } + + private sealed class UIStandardInputModule : UIPointerInputModule + { + + public UIStandardInputModule(TouchScriptInputModule input, EventSystem eventSystem) : base(input, eventSystem) + { } + + #region Unchanged + + private string m_HorizontalAxis = "Horizontal"; + private string m_VerticalAxis = "Vertical"; + private string m_SubmitButton = "Submit"; + private string m_CancelButton = "Cancel"; + private float m_InputActionsPerSecond = 10; + private float m_RepeatDelay = 0.5f; + + private int m_ConsecutiveMoveCount = 0; + private Vector2 m_LastMoveVector; + private float m_PrevActionTime; + + public override void Process() + { + bool usedEvent = SendUpdateEventToSelectedObject(); + + if (eventSystem.sendNavigationEvents) + { + if (!usedEvent) + usedEvent |= SendMoveEventToSelectedObject(); + + if (!usedEvent) + SendSubmitEventToSelectedObject(); + } + + // touch needs to take precedence because of the mouse emulation layer +// if (!ProcessTouchEvents() && Input.mousePresent) +// ProcessMouseEvent(); + } + + private bool SendUpdateEventToSelectedObject() + { + if (eventSystem.currentSelectedGameObject == null) + return false; + + var data = input.GetBaseEventData(); + ExecuteEvents.Execute(eventSystem.currentSelectedGameObject, data, ExecuteEvents.updateSelectedHandler); + return data.used; + } + + private bool SendMoveEventToSelectedObject() + { + float time = Time.unscaledTime; + + Vector2 movement = GetRawMoveVector(); + if (Mathf.Approximately(movement.x, 0f) && Mathf.Approximately(movement.y, 0f)) + { + m_ConsecutiveMoveCount = 0; + return false; + } + + // If user pressed key again, always allow event + bool allow = Input.GetButtonDown(m_HorizontalAxis) || Input.GetButtonDown(m_VerticalAxis); + bool similarDir = (Vector2.Dot(movement, m_LastMoveVector) > 0); + if (!allow) + { + // Otherwise, user held down key or axis. + // If direction didn't change at least 90 degrees, wait for delay before allowing consequtive event. + if (similarDir && m_ConsecutiveMoveCount == 1) + allow = (time > m_PrevActionTime + m_RepeatDelay); + // If direction changed at least 90 degree, or we already had the delay, repeat at repeat rate. + else + allow = (time > m_PrevActionTime + 1f / m_InputActionsPerSecond); + } + if (!allow) + return false; + + // Debug.Log(m_ProcessingEvent.rawType + " axis:" + m_AllowAxisEvents + " value:" + "(" + x + "," + y + ")"); + var axisEventData = input.GetAxisEventData(movement.x, movement.y, 0.6f); + + if (axisEventData.moveDir != MoveDirection.None) + { + ExecuteEvents.Execute(eventSystem.currentSelectedGameObject, axisEventData, ExecuteEvents.moveHandler); + if (!similarDir) + m_ConsecutiveMoveCount = 0; + m_ConsecutiveMoveCount++; + m_PrevActionTime = time; + m_LastMoveVector = movement; + } + else + { + m_ConsecutiveMoveCount = 0; + } + + return axisEventData.used; + } + + private bool SendSubmitEventToSelectedObject() + { + if (eventSystem.currentSelectedGameObject == null) + return false; + + var data = input.GetBaseEventData(); + if (Input.GetButtonDown(m_SubmitButton)) + ExecuteEvents.Execute(eventSystem.currentSelectedGameObject, data, ExecuteEvents.submitHandler); + + if (Input.GetButtonDown(m_CancelButton)) + ExecuteEvents.Execute(eventSystem.currentSelectedGameObject, data, ExecuteEvents.cancelHandler); + return data.used; + } + + private Vector2 GetRawMoveVector() + { + Vector2 move = Vector2.zero; + move.x = Input.GetAxisRaw(m_HorizontalAxis); + move.y = Input.GetAxisRaw(m_VerticalAxis); + + if (Input.GetButtonDown(m_HorizontalAxis)) + { + if (move.x < 0) + move.x = -1f; + if (move.x > 0) + move.x = 1f; + } + if (Input.GetButtonDown(m_VerticalAxis)) + { + if (move.y < 0) + move.y = -1f; + if (move.y > 0) + move.y = 1f; + } + return move; + } + + #endregion + + } + + #endregion + + } +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs.meta b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs.meta new file mode 100644 index 000000000..f5b86693d --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 803d2abe167ae40a0957010be5cfb7d1 +timeCreated: 1470651932 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Layers/UIOverlayLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/UIOverlayLayer.cs new file mode 100644 index 000000000..2c603c317 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Layers/UIOverlayLayer.cs @@ -0,0 +1,164 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using System; +using System.Collections.Generic; +using TouchScript.Hit; +using TouchScript.Layers.UI; +using TouchScript.Pointers; +using UnityEngine; +using UnityEngine.EventSystems; +using UnityEngine.UI; + +namespace TouchScript.Layers +{ + [AddComponentMenu("TouchScript/Layers/UI Overlay Layer")] + public class UIOverlayLayer : TouchLayer + { + + #region Private variables + + private List graphicList = new List(20); + private Comparison _raycastComparerFunc; + + #endregion + + #region Public methods + + public override HitResult Hit(IPointer pointer, out HitData hit) + { + if (base.Hit(pointer, out hit) != HitResult.Hit) return HitResult.Miss; + + graphicList.Clear(); + + hit = default(HitData); + var position = pointer.Position; + var raycasters = TouchScriptInputModule.Instance.GetRaycasters(); + var count = raycasters.Count; + + for (var i = 0; i < count; i++) + { + var raycaster = raycasters[i] as GraphicRaycaster; + if (raycaster == null) continue; + var canvas = TouchScriptInputModule.Instance.GetCanvasForRaycaster(raycaster); + if (canvas == null) continue; + if (canvas.renderMode != RenderMode.ScreenSpaceOverlay) continue; + + var foundGraphics = GraphicRegistry.GetGraphicsForCanvas(canvas); + var count2 = foundGraphics.Count; + for (int j = 0; j < count2; j++) + { + Graphic graphic = foundGraphics[j]; + + // -1 means it hasn't been processed by the canvas, which means it isn't actually drawn + if (graphic.depth == -1 || !graphic.raycastTarget) + continue; + + if (!RectTransformUtility.RectangleContainsScreenPoint(graphic.rectTransform, position)) + continue; + + if (graphic.Raycast(position, null)) graphicList.Add( + new RaycastResult() + { + gameObject = graphic.gameObject, + module = raycaster, + distance = 0, + screenPosition = position, + index = graphicList.Count, + depth = graphic.depth, + sortingLayer = canvas.sortingLayerID, + sortingOrder = canvas.sortingOrder + }); + } + } + + count = graphicList.Count; + if (count == 0) return HitResult.Miss; + if (count > 1) + { + graphicList.Sort(_raycastComparerFunc); + for (var i = 0; i < count; ++i) + { + var result = doHit(pointer, graphicList[i], out hit); + if (result != HitResult.Miss) return result; + } + return HitResult.Miss; + } + return doHit(pointer, graphicList[0], out hit); + } + + #endregion + + #region Unity methods + + protected override void Awake() + { + base.Awake(); + _raycastComparerFunc = raycastComparerFunc; + } + + protected void OnEnable() + { + if (!Application.isPlaying) return; + if (TouchScriptInputModule.Instance != null) TouchScriptInputModule.Instance.INTERNAL_Retain(); + } + + protected void OnDisable() + { + if (!Application.isPlaying) return; + if (TouchScriptInputModule.Instance != null) TouchScriptInputModule.Instance.INTERNAL_Release(); + } + + #endregion + + #region Protected functions + + /// + protected override void setName() + { + Name = "UI Overlay Layer"; + } + + #endregion + + #region Private functions + + private HitResult doHit(IPointer pointer, RaycastResult raycastHit, out HitData hit) + { + hit = new HitData(raycastHit, this, true); + return checkHitFilters(pointer, hit); + } + + private static int raycastComparerFunc(RaycastResult lhs, RaycastResult rhs) + { + if (lhs.module != rhs.module) + { + if (lhs.module.sortOrderPriority != rhs.module.sortOrderPriority) + return rhs.module.sortOrderPriority.CompareTo(lhs.module.sortOrderPriority); + + if (lhs.module.renderOrderPriority != rhs.module.renderOrderPriority) + return rhs.module.renderOrderPriority.CompareTo(lhs.module.renderOrderPriority); + } + + if (lhs.sortingLayer != rhs.sortingLayer) + { + // Uses the layer value to properly compare the relative order of the layers. + var rid = SortingLayer.GetLayerValueFromID(rhs.sortingLayer); + var lid = SortingLayer.GetLayerValueFromID(lhs.sortingLayer); + return rid.CompareTo(lid); + } + + if (lhs.sortingOrder != rhs.sortingOrder) + return rhs.sortingOrder.CompareTo(lhs.sortingOrder); + + if (lhs.depth != rhs.depth) + return rhs.depth.CompareTo(lhs.depth); + + return lhs.index.CompareTo(rhs.index); + } + + #endregion + + } +} diff --git a/Source/Assets/TouchScript/Scripts/Layers/UIOverlayLayer.cs.meta b/Source/Assets/TouchScript/Scripts/Layers/UIOverlayLayer.cs.meta new file mode 100644 index 000000000..c65b1af9f --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Layers/UIOverlayLayer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4ad2b146e2cb148fdad573d18694ff59 +timeCreated: 1470651932 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From 17b6900fc2422c42e514a64917b8d81679aef657 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 9 Aug 2016 14:21:35 +0300 Subject: [PATCH 083/211] Changed UI atlas for icons. --- .../Textures/Icons/drag_media_gestureworks.png.meta | 9 ++++++++- .../Examples/_misc/Textures/Icons/keyboard.png.meta | 2 +- .../Textures/Icons/media_rotate_gestureworks.png.meta | 9 ++++++++- .../Icons/one_finger_double_tap_gestureworks.png.meta | 9 ++++++++- .../Textures/Icons/one_finger_drag_gestureworks.png.meta | 9 ++++++++- .../Icons/one_finger_flick_gestureworks.png.meta | 9 ++++++++- .../Textures/Icons/one_finger_hold_gestureworks.png.meta | 9 ++++++++- .../Icons/one_finger_scroll_gestureworks.png.meta | 9 ++++++++- .../Icons/one_finger_split_gestureworks.png.meta | 9 ++++++++- .../Icons/one_finger_swipe_gestureworks.png.meta | 9 ++++++++- .../Textures/Icons/one_finger_tap_gestureworks.png.meta | 9 ++++++++- .../Icons/one_finger_triple_tap_gestureworks.png.meta | 9 ++++++++- .../Icons/two_finger_double_tap_gestureworks.png.meta | 9 ++++++++- .../Textures/Icons/two_finger_drag_gestureworks.png.meta | 9 ++++++++- .../Icons/two_finger_flick_gestureworks.png.meta | 9 ++++++++- .../Textures/Icons/two_finger_hold_gestureworks.png.meta | 9 ++++++++- .../two_finger_horizontal_scale_gestureworks.png.meta | 9 ++++++++- .../Icons/two_finger_rotate_gestureworks.png.meta | 9 ++++++++- .../Icons/two_finger_scale_gestureworks.png.meta | 9 ++++++++- .../Icons/two_finger_scroll_gestureworks.png.meta | 9 ++++++++- .../Icons/two_finger_split_gestureworks.png.meta | 9 ++++++++- .../Icons/two_finger_swipe_gestureworks.png.meta | 9 ++++++++- .../Textures/Icons/two_finger_tap_gestureworks.png.meta | 9 ++++++++- .../Icons/two_finger_triple_tap_gestureworks.png.meta | 9 ++++++++- .../two_finger_vertical_scale_gestureworks.png.meta | 9 ++++++++- .../Textures/Icons/two_hand_rotate_gestureworks.png.meta | 9 ++++++++- .../two_hand_two_finger_rotate_gestureworks.png.meta | 9 ++++++++- 27 files changed, 209 insertions(+), 27 deletions(-) diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/drag_media_gestureworks.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/drag_media_gestureworks.png.meta index f1ca4c802..d0285d330 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/drag_media_gestureworks.png.meta +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/drag_media_gestureworks.png.meta @@ -20,6 +20,9 @@ TextureImporter: isReadable: 0 grayScaleToAlpha: 0 generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 128 @@ -30,7 +33,9 @@ TextureImporter: wrapMode: 1 nPOTScale: 0 lightmap: 0 + rGBM: 0 compressionQuality: 50 + allowsAlphaSplitting: 0 spriteMode: 1 spriteExtrude: 1 spriteMeshType: 1 @@ -43,5 +48,7 @@ TextureImporter: buildTargetSettings: [] spriteSheet: sprites: [] - spritePackingTag: GestureIcons + spritePackingTag: ui userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/keyboard.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/keyboard.png.meta index 10236f2a3..b6df9f5e3 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/keyboard.png.meta +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/keyboard.png.meta @@ -50,7 +50,7 @@ TextureImporter: buildTargetSettings: [] spriteSheet: sprites: [] - spritePackingTag: GestureIcons + spritePackingTag: ui userData: assetBundleName: assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/media_rotate_gestureworks.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/media_rotate_gestureworks.png.meta index 07dc6eae1..f1f68ad1d 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/media_rotate_gestureworks.png.meta +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/media_rotate_gestureworks.png.meta @@ -20,6 +20,9 @@ TextureImporter: isReadable: 0 grayScaleToAlpha: 0 generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 128 @@ -30,7 +33,9 @@ TextureImporter: wrapMode: 1 nPOTScale: 0 lightmap: 0 + rGBM: 0 compressionQuality: 50 + allowsAlphaSplitting: 0 spriteMode: 1 spriteExtrude: 1 spriteMeshType: 1 @@ -43,5 +48,7 @@ TextureImporter: buildTargetSettings: [] spriteSheet: sprites: [] - spritePackingTag: GestureIcons + spritePackingTag: ui userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_double_tap_gestureworks.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_double_tap_gestureworks.png.meta index dc5bdae87..307f28e6c 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_double_tap_gestureworks.png.meta +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_double_tap_gestureworks.png.meta @@ -20,6 +20,9 @@ TextureImporter: isReadable: 0 grayScaleToAlpha: 0 generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 128 @@ -30,7 +33,9 @@ TextureImporter: wrapMode: 1 nPOTScale: 0 lightmap: 0 + rGBM: 0 compressionQuality: 50 + allowsAlphaSplitting: 0 spriteMode: 1 spriteExtrude: 1 spriteMeshType: 1 @@ -43,5 +48,7 @@ TextureImporter: buildTargetSettings: [] spriteSheet: sprites: [] - spritePackingTag: GestureIcons + spritePackingTag: ui userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_drag_gestureworks.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_drag_gestureworks.png.meta index 8663d7711..71c6e36d3 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_drag_gestureworks.png.meta +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_drag_gestureworks.png.meta @@ -20,6 +20,9 @@ TextureImporter: isReadable: 0 grayScaleToAlpha: 0 generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 128 @@ -30,7 +33,9 @@ TextureImporter: wrapMode: 1 nPOTScale: 0 lightmap: 0 + rGBM: 0 compressionQuality: 50 + allowsAlphaSplitting: 0 spriteMode: 1 spriteExtrude: 1 spriteMeshType: 1 @@ -43,5 +48,7 @@ TextureImporter: buildTargetSettings: [] spriteSheet: sprites: [] - spritePackingTag: GestureIcons + spritePackingTag: ui userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_flick_gestureworks.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_flick_gestureworks.png.meta index 05cfd3ad5..eb3aa2cea 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_flick_gestureworks.png.meta +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_flick_gestureworks.png.meta @@ -20,6 +20,9 @@ TextureImporter: isReadable: 0 grayScaleToAlpha: 0 generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 128 @@ -30,7 +33,9 @@ TextureImporter: wrapMode: 1 nPOTScale: 0 lightmap: 0 + rGBM: 0 compressionQuality: 50 + allowsAlphaSplitting: 0 spriteMode: 1 spriteExtrude: 1 spriteMeshType: 1 @@ -43,5 +48,7 @@ TextureImporter: buildTargetSettings: [] spriteSheet: sprites: [] - spritePackingTag: GestureIcons + spritePackingTag: ui userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_hold_gestureworks.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_hold_gestureworks.png.meta index b75a33d71..3ff47c9e5 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_hold_gestureworks.png.meta +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_hold_gestureworks.png.meta @@ -20,6 +20,9 @@ TextureImporter: isReadable: 0 grayScaleToAlpha: 0 generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 128 @@ -30,7 +33,9 @@ TextureImporter: wrapMode: 1 nPOTScale: 0 lightmap: 0 + rGBM: 0 compressionQuality: 50 + allowsAlphaSplitting: 0 spriteMode: 1 spriteExtrude: 1 spriteMeshType: 1 @@ -43,5 +48,7 @@ TextureImporter: buildTargetSettings: [] spriteSheet: sprites: [] - spritePackingTag: GestureIcons + spritePackingTag: ui userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_scroll_gestureworks.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_scroll_gestureworks.png.meta index 6cedb89df..0bb9d6098 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_scroll_gestureworks.png.meta +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_scroll_gestureworks.png.meta @@ -20,6 +20,9 @@ TextureImporter: isReadable: 0 grayScaleToAlpha: 0 generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 128 @@ -30,7 +33,9 @@ TextureImporter: wrapMode: 1 nPOTScale: 0 lightmap: 0 + rGBM: 0 compressionQuality: 50 + allowsAlphaSplitting: 0 spriteMode: 1 spriteExtrude: 1 spriteMeshType: 1 @@ -43,5 +48,7 @@ TextureImporter: buildTargetSettings: [] spriteSheet: sprites: [] - spritePackingTag: GestureIcons + spritePackingTag: ui userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_split_gestureworks.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_split_gestureworks.png.meta index 66b960629..5bbf48519 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_split_gestureworks.png.meta +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_split_gestureworks.png.meta @@ -20,6 +20,9 @@ TextureImporter: isReadable: 0 grayScaleToAlpha: 0 generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 128 @@ -30,7 +33,9 @@ TextureImporter: wrapMode: 1 nPOTScale: 0 lightmap: 0 + rGBM: 0 compressionQuality: 50 + allowsAlphaSplitting: 0 spriteMode: 1 spriteExtrude: 1 spriteMeshType: 1 @@ -43,5 +48,7 @@ TextureImporter: buildTargetSettings: [] spriteSheet: sprites: [] - spritePackingTag: GestureIcons + spritePackingTag: ui userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_swipe_gestureworks.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_swipe_gestureworks.png.meta index ce01157bf..c6e3cff25 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_swipe_gestureworks.png.meta +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_swipe_gestureworks.png.meta @@ -20,6 +20,9 @@ TextureImporter: isReadable: 0 grayScaleToAlpha: 0 generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 128 @@ -30,7 +33,9 @@ TextureImporter: wrapMode: 1 nPOTScale: 0 lightmap: 0 + rGBM: 0 compressionQuality: 50 + allowsAlphaSplitting: 0 spriteMode: 1 spriteExtrude: 1 spriteMeshType: 1 @@ -43,5 +48,7 @@ TextureImporter: buildTargetSettings: [] spriteSheet: sprites: [] - spritePackingTag: GestureIcons + spritePackingTag: ui userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_tap_gestureworks.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_tap_gestureworks.png.meta index 20a476662..bacafdbbe 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_tap_gestureworks.png.meta +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_tap_gestureworks.png.meta @@ -20,6 +20,9 @@ TextureImporter: isReadable: 0 grayScaleToAlpha: 0 generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 128 @@ -30,7 +33,9 @@ TextureImporter: wrapMode: 1 nPOTScale: 0 lightmap: 0 + rGBM: 0 compressionQuality: 50 + allowsAlphaSplitting: 0 spriteMode: 1 spriteExtrude: 1 spriteMeshType: 1 @@ -43,5 +48,7 @@ TextureImporter: buildTargetSettings: [] spriteSheet: sprites: [] - spritePackingTag: GestureIcons + spritePackingTag: ui userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_triple_tap_gestureworks.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_triple_tap_gestureworks.png.meta index 68edb5089..5e94e49b6 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_triple_tap_gestureworks.png.meta +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/one_finger_triple_tap_gestureworks.png.meta @@ -20,6 +20,9 @@ TextureImporter: isReadable: 0 grayScaleToAlpha: 0 generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 128 @@ -30,7 +33,9 @@ TextureImporter: wrapMode: 1 nPOTScale: 0 lightmap: 0 + rGBM: 0 compressionQuality: 50 + allowsAlphaSplitting: 0 spriteMode: 1 spriteExtrude: 1 spriteMeshType: 1 @@ -43,5 +48,7 @@ TextureImporter: buildTargetSettings: [] spriteSheet: sprites: [] - spritePackingTag: GestureIcons + spritePackingTag: ui userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_double_tap_gestureworks.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_double_tap_gestureworks.png.meta index 185a71d38..abf272900 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_double_tap_gestureworks.png.meta +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_double_tap_gestureworks.png.meta @@ -20,6 +20,9 @@ TextureImporter: isReadable: 0 grayScaleToAlpha: 0 generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 128 @@ -30,7 +33,9 @@ TextureImporter: wrapMode: 1 nPOTScale: 0 lightmap: 0 + rGBM: 0 compressionQuality: 50 + allowsAlphaSplitting: 0 spriteMode: 1 spriteExtrude: 1 spriteMeshType: 1 @@ -43,5 +48,7 @@ TextureImporter: buildTargetSettings: [] spriteSheet: sprites: [] - spritePackingTag: GestureIcons + spritePackingTag: ui userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_drag_gestureworks.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_drag_gestureworks.png.meta index a24f9cea6..0421d555f 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_drag_gestureworks.png.meta +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_drag_gestureworks.png.meta @@ -20,6 +20,9 @@ TextureImporter: isReadable: 0 grayScaleToAlpha: 0 generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 128 @@ -30,7 +33,9 @@ TextureImporter: wrapMode: 1 nPOTScale: 0 lightmap: 0 + rGBM: 0 compressionQuality: 50 + allowsAlphaSplitting: 0 spriteMode: 1 spriteExtrude: 1 spriteMeshType: 1 @@ -43,5 +48,7 @@ TextureImporter: buildTargetSettings: [] spriteSheet: sprites: [] - spritePackingTag: GestureIcons + spritePackingTag: ui userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_flick_gestureworks.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_flick_gestureworks.png.meta index 9a590a88f..51dcdcfa7 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_flick_gestureworks.png.meta +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_flick_gestureworks.png.meta @@ -20,6 +20,9 @@ TextureImporter: isReadable: 0 grayScaleToAlpha: 0 generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 128 @@ -30,7 +33,9 @@ TextureImporter: wrapMode: 1 nPOTScale: 0 lightmap: 0 + rGBM: 0 compressionQuality: 50 + allowsAlphaSplitting: 0 spriteMode: 1 spriteExtrude: 1 spriteMeshType: 1 @@ -43,5 +48,7 @@ TextureImporter: buildTargetSettings: [] spriteSheet: sprites: [] - spritePackingTag: GestureIcons + spritePackingTag: ui userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_hold_gestureworks.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_hold_gestureworks.png.meta index 7f37d7c1f..0a5715390 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_hold_gestureworks.png.meta +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_hold_gestureworks.png.meta @@ -20,6 +20,9 @@ TextureImporter: isReadable: 0 grayScaleToAlpha: 0 generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 128 @@ -30,7 +33,9 @@ TextureImporter: wrapMode: 1 nPOTScale: 0 lightmap: 0 + rGBM: 0 compressionQuality: 50 + allowsAlphaSplitting: 0 spriteMode: 1 spriteExtrude: 1 spriteMeshType: 1 @@ -43,5 +48,7 @@ TextureImporter: buildTargetSettings: [] spriteSheet: sprites: [] - spritePackingTag: GestureIcons + spritePackingTag: ui userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_horizontal_scale_gestureworks.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_horizontal_scale_gestureworks.png.meta index e4b80f643..c6818dc4f 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_horizontal_scale_gestureworks.png.meta +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_horizontal_scale_gestureworks.png.meta @@ -20,6 +20,9 @@ TextureImporter: isReadable: 0 grayScaleToAlpha: 0 generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 128 @@ -30,7 +33,9 @@ TextureImporter: wrapMode: 1 nPOTScale: 0 lightmap: 0 + rGBM: 0 compressionQuality: 50 + allowsAlphaSplitting: 0 spriteMode: 1 spriteExtrude: 1 spriteMeshType: 1 @@ -43,5 +48,7 @@ TextureImporter: buildTargetSettings: [] spriteSheet: sprites: [] - spritePackingTag: GestureIcons + spritePackingTag: ui userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_rotate_gestureworks.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_rotate_gestureworks.png.meta index 2dbf3c5ce..505c6f755 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_rotate_gestureworks.png.meta +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_rotate_gestureworks.png.meta @@ -20,6 +20,9 @@ TextureImporter: isReadable: 0 grayScaleToAlpha: 0 generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 128 @@ -30,7 +33,9 @@ TextureImporter: wrapMode: 1 nPOTScale: 0 lightmap: 0 + rGBM: 0 compressionQuality: 50 + allowsAlphaSplitting: 0 spriteMode: 1 spriteExtrude: 1 spriteMeshType: 1 @@ -43,5 +48,7 @@ TextureImporter: buildTargetSettings: [] spriteSheet: sprites: [] - spritePackingTag: GestureIcons + spritePackingTag: ui userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_scale_gestureworks.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_scale_gestureworks.png.meta index d2f62dbdf..5c3584edb 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_scale_gestureworks.png.meta +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_scale_gestureworks.png.meta @@ -20,6 +20,9 @@ TextureImporter: isReadable: 0 grayScaleToAlpha: 0 generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 128 @@ -30,7 +33,9 @@ TextureImporter: wrapMode: 1 nPOTScale: 0 lightmap: 0 + rGBM: 0 compressionQuality: 50 + allowsAlphaSplitting: 0 spriteMode: 1 spriteExtrude: 1 spriteMeshType: 1 @@ -43,5 +48,7 @@ TextureImporter: buildTargetSettings: [] spriteSheet: sprites: [] - spritePackingTag: GestureIcons + spritePackingTag: ui userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_scroll_gestureworks.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_scroll_gestureworks.png.meta index 3ac1a2fd3..2517a53c1 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_scroll_gestureworks.png.meta +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_scroll_gestureworks.png.meta @@ -20,6 +20,9 @@ TextureImporter: isReadable: 0 grayScaleToAlpha: 0 generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 128 @@ -30,7 +33,9 @@ TextureImporter: wrapMode: 1 nPOTScale: 0 lightmap: 0 + rGBM: 0 compressionQuality: 50 + allowsAlphaSplitting: 0 spriteMode: 1 spriteExtrude: 1 spriteMeshType: 1 @@ -43,5 +48,7 @@ TextureImporter: buildTargetSettings: [] spriteSheet: sprites: [] - spritePackingTag: GestureIcons + spritePackingTag: ui userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_split_gestureworks.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_split_gestureworks.png.meta index 5a16e70da..33b183540 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_split_gestureworks.png.meta +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_split_gestureworks.png.meta @@ -20,6 +20,9 @@ TextureImporter: isReadable: 0 grayScaleToAlpha: 0 generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 128 @@ -30,7 +33,9 @@ TextureImporter: wrapMode: 1 nPOTScale: 0 lightmap: 0 + rGBM: 0 compressionQuality: 50 + allowsAlphaSplitting: 0 spriteMode: 1 spriteExtrude: 1 spriteMeshType: 1 @@ -43,5 +48,7 @@ TextureImporter: buildTargetSettings: [] spriteSheet: sprites: [] - spritePackingTag: GestureIcons + spritePackingTag: ui userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_swipe_gestureworks.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_swipe_gestureworks.png.meta index 3c224ac24..0aa21c19d 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_swipe_gestureworks.png.meta +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_swipe_gestureworks.png.meta @@ -20,6 +20,9 @@ TextureImporter: isReadable: 0 grayScaleToAlpha: 0 generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 128 @@ -30,7 +33,9 @@ TextureImporter: wrapMode: 1 nPOTScale: 0 lightmap: 0 + rGBM: 0 compressionQuality: 50 + allowsAlphaSplitting: 0 spriteMode: 1 spriteExtrude: 1 spriteMeshType: 1 @@ -43,5 +48,7 @@ TextureImporter: buildTargetSettings: [] spriteSheet: sprites: [] - spritePackingTag: GestureIcons + spritePackingTag: ui userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_tap_gestureworks.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_tap_gestureworks.png.meta index 8fd334448..b1aa90a02 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_tap_gestureworks.png.meta +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_tap_gestureworks.png.meta @@ -20,6 +20,9 @@ TextureImporter: isReadable: 0 grayScaleToAlpha: 0 generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 128 @@ -30,7 +33,9 @@ TextureImporter: wrapMode: 1 nPOTScale: 0 lightmap: 0 + rGBM: 0 compressionQuality: 50 + allowsAlphaSplitting: 0 spriteMode: 1 spriteExtrude: 1 spriteMeshType: 1 @@ -43,5 +48,7 @@ TextureImporter: buildTargetSettings: [] spriteSheet: sprites: [] - spritePackingTag: GestureIcons + spritePackingTag: ui userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_triple_tap_gestureworks.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_triple_tap_gestureworks.png.meta index 862ce7ce6..aa09cc6fa 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_triple_tap_gestureworks.png.meta +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_triple_tap_gestureworks.png.meta @@ -20,6 +20,9 @@ TextureImporter: isReadable: 0 grayScaleToAlpha: 0 generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 128 @@ -30,7 +33,9 @@ TextureImporter: wrapMode: 1 nPOTScale: 0 lightmap: 0 + rGBM: 0 compressionQuality: 50 + allowsAlphaSplitting: 0 spriteMode: 1 spriteExtrude: 1 spriteMeshType: 1 @@ -43,5 +48,7 @@ TextureImporter: buildTargetSettings: [] spriteSheet: sprites: [] - spritePackingTag: GestureIcons + spritePackingTag: ui userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_vertical_scale_gestureworks.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_vertical_scale_gestureworks.png.meta index 1aaca0caf..a49a8ce3b 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_vertical_scale_gestureworks.png.meta +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_finger_vertical_scale_gestureworks.png.meta @@ -20,6 +20,9 @@ TextureImporter: isReadable: 0 grayScaleToAlpha: 0 generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 128 @@ -30,7 +33,9 @@ TextureImporter: wrapMode: 1 nPOTScale: 0 lightmap: 0 + rGBM: 0 compressionQuality: 50 + allowsAlphaSplitting: 0 spriteMode: 1 spriteExtrude: 1 spriteMeshType: 1 @@ -43,5 +48,7 @@ TextureImporter: buildTargetSettings: [] spriteSheet: sprites: [] - spritePackingTag: GestureIcons + spritePackingTag: ui userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_hand_rotate_gestureworks.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_hand_rotate_gestureworks.png.meta index f814cde10..92bc22993 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_hand_rotate_gestureworks.png.meta +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_hand_rotate_gestureworks.png.meta @@ -20,6 +20,9 @@ TextureImporter: isReadable: 0 grayScaleToAlpha: 0 generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 128 @@ -30,7 +33,9 @@ TextureImporter: wrapMode: 1 nPOTScale: 0 lightmap: 0 + rGBM: 0 compressionQuality: 50 + allowsAlphaSplitting: 0 spriteMode: 1 spriteExtrude: 1 spriteMeshType: 1 @@ -43,5 +48,7 @@ TextureImporter: buildTargetSettings: [] spriteSheet: sprites: [] - spritePackingTag: GestureIcons + spritePackingTag: ui userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_hand_two_finger_rotate_gestureworks.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_hand_two_finger_rotate_gestureworks.png.meta index 242e8189e..56e55f087 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_hand_two_finger_rotate_gestureworks.png.meta +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Icons/two_hand_two_finger_rotate_gestureworks.png.meta @@ -20,6 +20,9 @@ TextureImporter: isReadable: 0 grayScaleToAlpha: 0 generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 128 @@ -30,7 +33,9 @@ TextureImporter: wrapMode: 1 nPOTScale: 0 lightmap: 0 + rGBM: 0 compressionQuality: 50 + allowsAlphaSplitting: 0 spriteMode: 1 spriteExtrude: 1 spriteMeshType: 1 @@ -43,5 +48,7 @@ TextureImporter: buildTargetSettings: [] spriteSheet: sprites: [] - spritePackingTag: GestureIcons + spritePackingTag: ui userData: + assetBundleName: + assetBundleVariant: From f8a579e374786a80d0525a13fa30dae947e7c784 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 9 Aug 2016 14:22:47 +0300 Subject: [PATCH 084/211] Screenspace UI seems to be working. --- .../Behaviors/TouchScriptInputModule.cs | 591 ------------------ .../Behaviors/TouchScriptInputModule.cs.meta | 12 - .../TouchScript/Scripts/Layers/TouchLayer.cs | 14 + .../Layers/UI/TouchScriptInputModule.cs | 312 +++++++-- .../Scripts/TouchManagerInstance.cs | 32 +- 5 files changed, 317 insertions(+), 644 deletions(-) delete mode 100644 Source/Assets/TouchScript/Scripts/Behaviors/TouchScriptInputModule.cs delete mode 100644 Source/Assets/TouchScript/Scripts/Behaviors/TouchScriptInputModule.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/TouchScriptInputModule.cs b/Source/Assets/TouchScript/Scripts/Behaviors/TouchScriptInputModule.cs deleted file mode 100644 index f8e1bb4c8..000000000 --- a/Source/Assets/TouchScript/Scripts/Behaviors/TouchScriptInputModule.cs +++ /dev/null @@ -1,591 +0,0 @@ -/* - * @author Valentin Simonov / http://va.lent.in/ - */ - -using System.Collections.Generic; -using System.Text; -using TouchScript.Pointers; -using UnityEngine; -using UnityEngine.EventSystems; - -namespace TouchScript.Behaviors -{ - /// - /// Unity UI compatible Input Module which sends all TouchScript data to UI EventSystem. - /// It works without any layers or gestures but can be used with for examle a CameraLayer and BoxColliders on UI elements to attach gestures to them. - /// - [AddComponentMenu("TouchScript/TouchScript Input Module")] - [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Behaviors_TouchScriptInputModule.htm")] - public class TouchScriptInputModule : BaseInputModule - { - #region Public properties - - /// - /// Gets or sets the name of Unity horizontal axis. Required to be compatible with other input. - /// - /// The name of Unity horizontal axis. - public string HorizontalAxis - { - get { return horizontalAxis; } - set { horizontalAxis = value; } - } - - /// - /// Gets or sets the name of Unity vertical axis. Required to be compatible with other input. - /// - /// The name of Unity vertical axis. - public string VerticalAxis - { - get { return verticalAxis; } - set { verticalAxis = value; } - } - - /// - /// Gets or sets the name of Unity submit button. Required to be compatible with other input. - /// - /// The name of Unity submit button. - public string SubmitButton - { - get { return submitButton; } - set { submitButton = value; } - } - - /// - /// Gets or sets the name of Unity cancel button. Required to be compatible with other input. - /// - /// The name of Unity cancel button. - public string CancelButton - { - get { return cancelButton; } - set { cancelButton = value; } - } - - #endregion - - #region Private variables - - /// - /// id to event data. - /// - protected Dictionary pointerEvents = new Dictionary(); - - [SerializeField] - private string horizontalAxis = "Horizontal"; - - [SerializeField] - private string verticalAxis = "Vertical"; - - [SerializeField] - private string submitButton = "Submit"; - - [SerializeField] - private string cancelButton = "Cancel"; - - [SerializeField] - private float inputActionsPerSecond = 10f; - - [SerializeField] - private float repeatDelay = 0.5f; - - private float nextActionTime; - private MoveDirection lastMoveDirection; - private float lastMoveStartTime; - - #endregion - - #region Public methods - - /// - public override bool IsModuleSupported() - { - return true; - } - - /// - public override bool ShouldActivateModule() - { - if (!base.ShouldActivateModule()) - return false; - - //var shouldActivate = Input.GetButtonDown(submitButton); - //shouldActivate |= Input.GetButtonDown(cancelButton); - //shouldActivate |= !Mathf.Approximately(Input.GetAxisRaw(horizontalAxis), 0.0f); - //shouldActivate |= !Mathf.Approximately(Input.GetAxisRaw(verticalAxis), 0.0f); - //return shouldActivate; - - return true; - } - - /// - public override bool IsPointerOverGameObject(int pointerId) - { - var lastPointer = getLastPointerEventData(pointerId); - if (lastPointer != null) - return lastPointer.pointerEnter != null; - return false; - } - - /// - public override void ActivateModule() - { - base.ActivateModule(); - - var touchManager = TouchManager.Instance; - if (touchManager != null) - { - touchManager.PointersPressed += pointersPressedHandler; - touchManager.PointersUpdated += PointersUpdatedHandler; - touchManager.PointersReleased += pointersReleasedHandler; - touchManager.PointersCancelled += pointersCancelledHandler; - } - - var toSelect = eventSystem.currentSelectedGameObject; - if (toSelect == null) - toSelect = eventSystem.firstSelectedGameObject; - - eventSystem.SetSelectedGameObject(toSelect, GetBaseEventData()); - } - - /// - public override void DeactivateModule() - { - base.DeactivateModule(); - - var touchManager = TouchManager.Instance; - if (touchManager != null) - { - touchManager.PointersPressed -= pointersPressedHandler; - touchManager.PointersUpdated -= PointersUpdatedHandler; - touchManager.PointersReleased -= pointersReleasedHandler; - touchManager.PointersCancelled -= pointersCancelledHandler; - } - - clearSelection(); - } - - /// - public override void Process() - { - bool usedEvent = sendUpdateEventToSelectedObject(); - - if (eventSystem.sendNavigationEvents) - { - if (!usedEvent) - usedEvent |= sendMoveEventToSelectedObject(); - - if (!usedEvent) - sendSubmitEventToSelectedObject(); - } - } - - /// - public override string ToString() - { - var sb = new StringBuilder("Pointer Input Module of type: " + GetType()); - sb.AppendLine(); - foreach (var pointer in pointerEvents) - { - if (pointer.Value == null) - continue; - sb.AppendLine("Pointer: " + pointer.Key); - sb.AppendLine(pointer.Value.ToString()); - } - return sb.ToString(); - } - - #endregion - - #region Protected functions - - /// - /// Does a raycast with pointer data. - /// - /// Pointer data. - protected void raycastPointer(PointerEventData pointerEvent) - { - eventSystem.RaycastAll(pointerEvent, m_RaycastResultCache); - var raycast = FindFirstRaycast(m_RaycastResultCache); - pointerEvent.pointerCurrentRaycast = raycast; - m_RaycastResultCache.Clear(); - } - - /// - /// Initializes pointer data for a pointer. - /// - /// The pointer to initialize pointer data from. - /// Pointer data for the pointer. - protected PointerEventData initPointerData(Pointer pointer) - { - PointerEventData pointerEvent; - getPointerData(pointer.Id, out pointerEvent, true); - - pointerEvent.position = pointer.Position; - pointerEvent.button = PointerEventData.InputButton.Left; - pointerEvent.eligibleForClick = true; - pointerEvent.delta = Vector2.zero; - pointerEvent.dragging = false; - pointerEvent.useDragThreshold = true; - pointerEvent.pressPosition = pointerEvent.position; - - return pointerEvent; - } - - /// - /// Injects the pointer into UI. - /// - /// The pointer data to inject. - protected void injectPointer(PointerEventData pointerEvent) - { - pointerEvent.pointerPressRaycast = pointerEvent.pointerCurrentRaycast; - var currentOverGo = pointerEvent.pointerCurrentRaycast.gameObject; - - deselectIfSelectionChanged(currentOverGo, pointerEvent); - - if (pointerEvent.pointerEnter != currentOverGo) - { - // send a pointer enter to the touched element if it isn't the one to select... - HandlePointerExitAndEnter(pointerEvent, currentOverGo); - pointerEvent.pointerEnter = currentOverGo; - } - - // search for the control that will receive the press - // if we can't find a press handler set the press - // handler to be what would receive a click. - var newPressed = ExecuteEvents.ExecuteHierarchy(currentOverGo, pointerEvent, - ExecuteEvents.pointerDownHandler); - - // didnt find a press handler... search for a click handler - if (newPressed == null) - newPressed = ExecuteEvents.GetEventHandler(currentOverGo); - - // TODO: double-tap - pointerEvent.clickCount = 1; - pointerEvent.pointerPress = newPressed; - pointerEvent.rawPointerPress = currentOverGo; - pointerEvent.clickTime = Time.unscaledTime; - - // Save the drag handler as well - pointerEvent.pointerDrag = ExecuteEvents.GetEventHandler(currentOverGo); - - if (pointerEvent.pointerDrag != null) - ExecuteEvents.Execute(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.initializePotentialDrag); - } - - /// - /// Updates pointer data for pointer. - /// - /// The pointer. - /// Updated pointer data. - protected PointerEventData updatePointerData(Pointer pointer) - { - PointerEventData pointerEvent; - getPointerData(pointer.Id, out pointerEvent, true); - - pointerEvent.position = pointer.Position; - pointerEvent.delta = pointer.Position - pointer.PreviousPosition; - - return pointerEvent; - } - - /// - /// Moves injected pointer in UI. - /// - /// The pointer data. - protected void movePointer(PointerEventData pointerEvent) - { - var targetGO = pointerEvent.pointerCurrentRaycast.gameObject; - HandlePointerExitAndEnter(pointerEvent, targetGO); - - bool moving = pointerEvent.IsPointerMoving(); - - if (moving && pointerEvent.pointerDrag != null - && !pointerEvent.dragging - && - shouldStartDrag(pointerEvent.pressPosition, pointerEvent.position, eventSystem.pixelDragThreshold, - pointerEvent.useDragThreshold)) - { - ExecuteEvents.Execute(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.beginDragHandler); - pointerEvent.dragging = true; - } - - // Drag notification - if (pointerEvent.dragging && moving && pointerEvent.pointerDrag != null) - { - // Before doing drag we should cancel any pointer down state - // And clear selection! - if (pointerEvent.pointerPress != pointerEvent.pointerDrag) - { - ExecuteEvents.Execute(pointerEvent.pointerPress, pointerEvent, ExecuteEvents.pointerUpHandler); - - pointerEvent.eligibleForClick = false; - pointerEvent.pointerPress = null; - pointerEvent.rawPointerPress = null; - } - ExecuteEvents.Execute(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.dragHandler); - } - } - - /// - /// Sends ended event for injected pointer. - /// - /// The pointer data. - protected void endPointer(PointerEventData pointerEvent) - { - var currentOverGo = pointerEvent.pointerCurrentRaycast.gameObject; - - ExecuteEvents.Execute(pointerEvent.pointerPress, pointerEvent, ExecuteEvents.pointerUpHandler); - - // see if we mouse up on the same element that we clicked on... - var pointerUpHandler = ExecuteEvents.GetEventHandler(currentOverGo); - - // PointerClick and Drop events - if (pointerEvent.pointerPress == pointerUpHandler && pointerEvent.eligibleForClick) - { - ExecuteEvents.Execute(pointerEvent.pointerPress, pointerEvent, ExecuteEvents.pointerClickHandler); - } - else if (pointerEvent.pointerDrag != null) - { - ExecuteEvents.ExecuteHierarchy(currentOverGo, pointerEvent, ExecuteEvents.dropHandler); - } - - pointerEvent.eligibleForClick = false; - pointerEvent.pointerPress = null; - pointerEvent.rawPointerPress = null; - - if (pointerEvent.pointerDrag != null && pointerEvent.dragging) - ExecuteEvents.Execute(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.endDragHandler); - - pointerEvent.dragging = false; - pointerEvent.pointerDrag = null; - - // send exit events as we need to simulate this on pointer up on pointer device - ExecuteEvents.ExecuteHierarchy(pointerEvent.pointerEnter, pointerEvent, ExecuteEvents.pointerExitHandler); - pointerEvent.pointerEnter = null; - - removePointerData(pointerEvent); - } - - /// - /// Gets pointer data for a pointer. - /// - /// Pointer id. - /// Pointer data. - /// If set to true not found pointer data is created. - /// true if pointer data is found or created; false otherwise. - protected bool getPointerData(int id, out PointerEventData data, bool create) - { - if (!pointerEvents.TryGetValue(id, out data) && create) - { - data = new PointerEventData(eventSystem) - { - pointerId = id, - }; - pointerEvents.Add(id, data); - return true; - } - return false; - } - - /// - /// Removes pointer data. - /// - /// The data. - protected void removePointerData(PointerEventData data) - { - pointerEvents.Remove(data.pointerId); - } - - /// - /// Gets the last pointer event data. - /// - /// Pointer id. - /// Pointer data. - protected PointerEventData getLastPointerEventData(int id) - { - PointerEventData data; - getPointerData(id, out data, false); - return data; - } - - /// - /// Clears UI selection. - /// - protected void clearSelection() - { - var baseEventData = GetBaseEventData(); - - foreach (var pointer in pointerEvents.Values) - { - // clear all selection - HandlePointerExitAndEnter(pointer, null); - } - - pointerEvents.Clear(); - eventSystem.SetSelectedGameObject(null, baseEventData); - } - - /// - /// Deselects if selection changed. - /// - /// GameObject which has the pointer over it. - /// Pointer data for the pointer. - protected void deselectIfSelectionChanged(GameObject currentOverGo, BaseEventData pointerEvent) - { - // Selection tracking - var selectHandlerGO = ExecuteEvents.GetEventHandler(currentOverGo); - // if we have clicked something new, deselect the old thing - // leave 'selection handling' up to the press event though. - if (selectHandlerGO != eventSystem.currentSelectedGameObject) - eventSystem.SetSelectedGameObject(null, pointerEvent); - } - - #endregion - - #region Private functions - - private void processPressed(Pointer pointer) - { - PointerEventData pointerEvent = initPointerData(pointer); - raycastPointer(pointerEvent); - injectPointer(pointerEvent); - } - - private void processMoved(Pointer pointer) - { - PointerEventData pointerEvent = updatePointerData(pointer); - raycastPointer(pointerEvent); - movePointer(pointerEvent); - } - - private void processReleased(Pointer pointer) - { - PointerEventData pointerEvent = updatePointerData(pointer); - raycastPointer(pointerEvent); - endPointer(pointerEvent); - } - - private bool allowMoveEventProcessing(float time) - { - bool allow = Input.GetButtonDown(horizontalAxis); - allow |= Input.GetButtonDown(verticalAxis); - allow |= (time > nextActionTime); - return allow; - } - - private static bool shouldStartDrag(Vector2 pressPos, Vector2 currentPos, float threshold, bool useDragThreshold) - { - if (!useDragThreshold) - return true; - - return (pressPos - currentPos).sqrMagnitude >= threshold * threshold; - } - - private bool sendSubmitEventToSelectedObject() - { - if (eventSystem.currentSelectedGameObject == null) - return false; - - var data = GetBaseEventData(); - if (Input.GetButtonDown(submitButton)) - ExecuteEvents.Execute(eventSystem.currentSelectedGameObject, data, ExecuteEvents.submitHandler); - - if (Input.GetButtonDown(cancelButton)) - ExecuteEvents.Execute(eventSystem.currentSelectedGameObject, data, ExecuteEvents.cancelHandler); - return data.used; - } - - private Vector2 getRawMoveVector() - { - Vector2 move = Vector2.zero; - move.x = Input.GetAxisRaw(horizontalAxis); - move.y = Input.GetAxisRaw(verticalAxis); - - if (Input.GetButtonDown(horizontalAxis)) - { - if (move.x < 0) - move.x = -1f; - if (move.x > 0) - move.x = 1f; - } - if (Input.GetButtonDown(verticalAxis)) - { - if (move.y < 0) - move.y = -1f; - if (move.y > 0) - move.y = 1f; - } - return move; - } - - private bool sendMoveEventToSelectedObject() - { - float time = Time.unscaledTime; - - if (!allowMoveEventProcessing(time)) - return false; - - Vector2 movement = getRawMoveVector(); - var axisEventData = GetAxisEventData(movement.x, movement.y, 0.6f); - MoveDirection moveDir = axisEventData.moveDir; - - // Repeat delay - if (moveDir != lastMoveDirection) - { - lastMoveDirection = moveDir; - lastMoveStartTime = time; - } - else - { - if (time < lastMoveStartTime + repeatDelay) - return false; - } - - if (moveDir != MoveDirection.None) - { - ExecuteEvents.Execute(eventSystem.currentSelectedGameObject, axisEventData, ExecuteEvents.moveHandler); - } - nextActionTime = time + 1f / inputActionsPerSecond; - return axisEventData.used; - } - - private bool sendUpdateEventToSelectedObject() - { - if (eventSystem.currentSelectedGameObject == null) - return false; - - var data = GetBaseEventData(); - ExecuteEvents.Execute(eventSystem.currentSelectedGameObject, data, ExecuteEvents.updateSelectedHandler); - return data.used; - } - - #endregion - - #region Pointer event callbacks - - private void pointersPressedHandler(object sender, PointerEventArgs pointerEventArgs) - { - var pointers = pointerEventArgs.Pointers; - for (var i = 0; i < pointers.Count; i++) processPressed(pointers[i]); - } - - private void PointersUpdatedHandler(object sender, PointerEventArgs pointerEventArgs) - { - var pointers = pointerEventArgs.Pointers; - for (var i = 0; i < pointers.Count; i++) processMoved(pointers[i]); - } - - private void pointersReleasedHandler(object sender, PointerEventArgs pointerEventArgs) - { - var pointers = pointerEventArgs.Pointers; - for (var i = 0; i < pointers.Count; i++) processReleased(pointers[i]); - } - - private void pointersCancelledHandler(object sender, PointerEventArgs pointerEventArgs) - { - var pointers = pointerEventArgs.Pointers; - for (var i = 0; i < pointers.Count; i++) processReleased(pointers[i]); - } - - #endregion - } -} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/TouchScriptInputModule.cs.meta b/Source/Assets/TouchScript/Scripts/Behaviors/TouchScriptInputModule.cs.meta deleted file mode 100644 index 5f2aa4e5a..000000000 --- a/Source/Assets/TouchScript/Scripts/Behaviors/TouchScriptInputModule.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 797eed971a75647609ca044e7924beb7 -timeCreated: 1447582130 -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 2e53cf660..36977e6e6 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/TouchLayer.cs @@ -150,6 +150,11 @@ protected virtual void OnDestroy() #region Internal methods + internal void INTERNAL_AddPointer(Pointer pointer) + { + addPointer(pointer); + } + internal void INTERNAL_UpdatePointer(Pointer pointer) { updatePointer(pointer); @@ -167,6 +172,11 @@ internal void INTERNAL_ReleasePointer(Pointer pointer) endPointer(pointer); } + internal void INTERNAL_RemovePointer(Pointer pointer) + { + removePointer(pointer); + } + internal void INTERNAL_CancelPointer(Pointer pointer) { cancelPointer(pointer); @@ -202,6 +212,8 @@ protected virtual void setName() if (string.IsNullOrEmpty(Name)) Name = "Layer"; } + protected virtual void addPointer(Pointer pointer) { } + /// /// Called when a layer is touched to query the layer if this pointer hits something. /// @@ -223,6 +235,8 @@ protected virtual void updatePointer(Pointer 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 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 9a1a47933..efef49566 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs @@ -33,6 +33,13 @@ public static TouchScriptInputModule Instance } } + public string HorizontalAxis = "Horizontal"; + public string VerticalAxis = "Vertical"; + public string SubmitButton = "Submit"; + public string CancelButton = "Cancel"; + public float InputActionsPerSecond = 10; + public float RepeatDelay = 0.5f; + #endregion #region Private variables @@ -63,6 +70,12 @@ private TouchScriptInputModule() #region Unity methods + protected override void Awake() + { + base.Awake(); + ui = new UITouchInputModule(this, eventSystem); + } + protected override void OnEnable() { base.OnEnable(); @@ -78,17 +91,12 @@ protected override void OnEnable() return; } } - - ui = new UIStandardInputModule(this, eventSystem); - - TouchManager.Instance.PointersUpdated += pointerUpdatedHandler; } protected override void OnDisable() { - if (TouchManager.Instance != null) TouchManager.Instance.PointersUpdated -= pointerUpdatedHandler; + disable(); instance = null; - base.OnDisable(); } @@ -146,11 +154,12 @@ public override void UpdateModule() {} internal void INTERNAL_Retain() { refCount++; + if (refCount == 1) enable(); } internal int INTERNAL_Release() { - if (--refCount <= 0) Destroy(this); + if (--refCount <= 0) disable(); return refCount; } @@ -158,15 +167,50 @@ internal int INTERNAL_Release() #region Private functions + private void enable() + { + TouchManager.Instance.PointersUpdated += pointersUpdatedHandler; + TouchManager.Instance.PointersPressed += pointersPressedHandler; + TouchManager.Instance.PointersReleased += pointersReleasedHandler; + TouchManager.Instance.PointersCancelled += pointersCancelledHandler; + } + + private void disable() + { + if (TouchManager.Instance != null) + { + TouchManager.Instance.PointersUpdated -= pointersUpdatedHandler; + TouchManager.Instance.PointersPressed -= pointersPressedHandler; + TouchManager.Instance.PointersReleased -= pointersReleasedHandler; + TouchManager.Instance.PointersCancelled -= pointersCancelledHandler; + } + refCount = 0; + } + #endregion #region Event handlers - private void pointerUpdatedHandler(object sender, PointerEventArgs pointerEventArgs) + private void pointersUpdatedHandler(object sender, PointerEventArgs pointerEventArgs) { ui.ProcessUpdated(pointerEventArgs.Pointers); } + private void pointersPressedHandler(object sender, PointerEventArgs pointerEventArgs) + { + ui.ProcessPressed(pointerEventArgs.Pointers); + } + + private void pointersReleasedHandler(object sender, PointerEventArgs pointerEventArgs) + { + ui.ProcessReleased(pointerEventArgs.Pointers); + } + + private void pointersCancelledHandler(object sender, PointerEventArgs pointerEventArgs) + { + ui.ProcessCancelled(pointerEventArgs.Pointers); + } + #endregion #region Copypasted code from UI @@ -176,13 +220,11 @@ private abstract class UIPointerInputModule { protected TouchScriptInputModule input; - protected EventSystem eventSystem; protected Dictionary m_PointerData = new Dictionary(); - public UIPointerInputModule(TouchScriptInputModule input, EventSystem eventSystem) + public UIPointerInputModule(TouchScriptInputModule input) { - this.eventSystem = eventSystem; this.input = input; } @@ -192,7 +234,7 @@ protected bool GetPointerData(int id, out PointerEventData data, bool create) { if (!m_PointerData.TryGetValue(id, out data) && create) { - data = new PointerEventData(eventSystem) + data = new PointerEventData(input.eventSystem) { pointerId = id, }; @@ -202,6 +244,24 @@ protected bool GetPointerData(int id, out PointerEventData data, bool create) return false; } + protected void DeselectIfSelectionChanged(GameObject currentOverGo, BaseEventData pointerEvent) + { + // Selection tracking + var selectHandlerGO = ExecuteEvents.GetEventHandler(currentOverGo); + // if we have clicked something new, deselect the old thing + // leave 'selection handling' up to the press event though. + if (selectHandlerGO != input.eventSystem.currentSelectedGameObject) + input.eventSystem.SetSelectedGameObject(null, pointerEvent); + } + + private static bool ShouldStartDrag(Vector2 pressPos, Vector2 currentPos, float threshold, bool useDragThreshold) + { + if (!useDragThreshold) + return true; + + return (pressPos - currentPos).sqrMagnitude >= threshold * threshold; + } + #endregion #region Changed @@ -218,21 +278,202 @@ public virtual void ProcessUpdated(IList pointers) var pointer = pointers[i]; PointerEventData data; GetPointerData(pointer.Id, out data, true); + data.Reset(); data.position = pointer.Position; data.delta = pointer.Position - pointer.PreviousPosition; var target = pointer.GetOverData().Target; - input.HandlePointerExitAndEnter(data, target == null ? null : target.gameObject); + var currentOverGo = target == null ? null : target.gameObject; + input.HandlePointerExitAndEnter(data, currentOverGo); + + bool moving = data.IsPointerMoving(); + + if (moving && data.pointerDrag != null + && !data.dragging + && ShouldStartDrag(data.pressPosition, data.position, input.eventSystem.pixelDragThreshold, data.useDragThreshold)) + { + ExecuteEvents.Execute(data.pointerDrag, data, ExecuteEvents.beginDragHandler); + data.dragging = true; + } + + // Drag notification + if (data.dragging && moving && data.pointerDrag != null) + { + // Before doing drag we should cancel any pointer down state + // And clear selection! + if (data.pointerPress != data.pointerDrag) + { + ExecuteEvents.Execute(data.pointerPress, data, ExecuteEvents.pointerUpHandler); + + data.eligibleForClick = false; + data.pointerPress = null; + data.rawPointerPress = null; + } + ExecuteEvents.Execute(data.pointerDrag, data, ExecuteEvents.dragHandler); + } + } + } + + public virtual void ProcessPressed(IList pointers) + { + var count = pointers.Count; + for (var i = 0; i < count; i++) + { + var pointer = pointers[i]; + PointerEventData data; + GetPointerData(pointer.Id, out data, true); + + var target = pointer.GetOverData().Target; + var currentOverGo = target == null ? null : target.gameObject; + + data.eligibleForClick = true; + data.delta = Vector2.zero; + data.dragging = false; + data.useDragThreshold = true; + data.pressPosition = pointer.Position; + data.pointerPressRaycast = data.pointerCurrentRaycast; // ?? + + DeselectIfSelectionChanged(currentOverGo, data); + + if (data.pointerEnter != currentOverGo) + { + // send a pointer enter to the touched element if it isn't the one to select... + input.HandlePointerExitAndEnter(data, currentOverGo); + data.pointerEnter = currentOverGo; + } + + // search for the control that will receive the press + // if we can't find a press handler set the press + // handler to be what would receive a click. + var newPressed = ExecuteEvents.ExecuteHierarchy(currentOverGo, data, ExecuteEvents.pointerDownHandler); + + // didnt find a press handler... search for a click handler + if (newPressed == null) + newPressed = ExecuteEvents.GetEventHandler(currentOverGo); + + // Debug.Log("Pressed: " + newPressed); + + float time = Time.unscaledTime; + + if (newPressed == data.lastPress) // ? + { + var diffTime = time - data.clickTime; + if (diffTime < 0.3f) + ++data.clickCount; + else + data.clickCount = 1; + + data.clickTime = time; + } + else + { + data.clickCount = 1; + } + + data.pointerPress = newPressed; + data.rawPointerPress = currentOverGo; + + data.clickTime = time; + + // Save the drag handler as well + data.pointerDrag = ExecuteEvents.GetEventHandler(currentOverGo); + + if (data.pointerDrag != null) + ExecuteEvents.Execute(data.pointerDrag, data, ExecuteEvents.initializePotentialDrag); + } + } + + public virtual void ProcessReleased(IList pointers) + { + var count = pointers.Count; + for (var i = 0; i < count; i++) + { + var pointer = pointers[i]; + PointerEventData data; + GetPointerData(pointer.Id, out data, true); + + var target = pointer.GetOverData().Target; + var currentOverGo = target == null ? null : target.gameObject; + + ExecuteEvents.Execute(data.pointerPress, data, ExecuteEvents.pointerUpHandler); + var pointerUpHandler = ExecuteEvents.GetEventHandler(currentOverGo); + if (data.pointerPress == pointerUpHandler && data.eligibleForClick) + { + ExecuteEvents.Execute(data.pointerPress, data, ExecuteEvents.pointerClickHandler); + } + else if (data.pointerDrag != null && data.dragging) + { + ExecuteEvents.ExecuteHierarchy(currentOverGo, data, ExecuteEvents.dropHandler); + } + + data.eligibleForClick = false; + data.pointerPress = null; + data.rawPointerPress = null; + + if (data.pointerDrag != null && data.dragging) + ExecuteEvents.Execute(data.pointerDrag, data, ExecuteEvents.endDragHandler); + + data.dragging = false; + data.pointerDrag = null; + + // send exit events as we need to simulate this on touch up on touch device + ExecuteEvents.ExecuteHierarchy(data.pointerEnter, data, ExecuteEvents.pointerExitHandler); + data.pointerEnter = null; + + // redo pointer enter / exit to refresh state + // so that if we moused over somethign that ignored it before + // due to having pressed on something else + // it now gets it. + if (currentOverGo != data.pointerEnter) + { + input.HandlePointerExitAndEnter(data, null); + input.HandlePointerExitAndEnter(data, currentOverGo); + } + } + } + + public virtual void ProcessCancelled(IList pointers) + { + var count = pointers.Count; + for (var i = 0; i < count; i++) + { + var pointer = pointers[i]; + PointerEventData data; + GetPointerData(pointer.Id, out data, true); + + var target = pointer.GetOverData().Target; + var currentOverGo = target == null ? null : target.gameObject; + + ExecuteEvents.Execute(data.pointerPress, data, ExecuteEvents.pointerUpHandler); + + if (data.pointerDrag != null && data.dragging) + { + ExecuteEvents.ExecuteHierarchy(currentOverGo, data, ExecuteEvents.dropHandler); + } + + data.eligibleForClick = false; + data.pointerPress = null; + data.rawPointerPress = null; + + if (data.pointerDrag != null && data.dragging) + ExecuteEvents.Execute(data.pointerDrag, data, ExecuteEvents.endDragHandler); + + data.dragging = false; + data.pointerDrag = null; + + // send exit events as we need to simulate this on touch up on touch device + ExecuteEvents.ExecuteHierarchy(data.pointerEnter, data, ExecuteEvents.pointerExitHandler); + data.pointerEnter = null; } } } - private abstract class UITouchInputModule : UIPointerInputModule + private class UITouchInputModule : UIPointerInputModule { - public UITouchInputModule(TouchScriptInputModule input, EventSystem eventSystem) : base(input, eventSystem) + public UITouchInputModule(TouchScriptInputModule input, EventSystem eventSystem) : base(input) { } public override void Process() @@ -242,18 +483,11 @@ public override void Process() private sealed class UIStandardInputModule : UIPointerInputModule { - public UIStandardInputModule(TouchScriptInputModule input, EventSystem eventSystem) : base(input, eventSystem) + public UIStandardInputModule(TouchScriptInputModule input, EventSystem eventSystem) : base(input) { } #region Unchanged - private string m_HorizontalAxis = "Horizontal"; - private string m_VerticalAxis = "Vertical"; - private string m_SubmitButton = "Submit"; - private string m_CancelButton = "Cancel"; - private float m_InputActionsPerSecond = 10; - private float m_RepeatDelay = 0.5f; - private int m_ConsecutiveMoveCount = 0; private Vector2 m_LastMoveVector; private float m_PrevActionTime; @@ -262,7 +496,7 @@ public override void Process() { bool usedEvent = SendUpdateEventToSelectedObject(); - if (eventSystem.sendNavigationEvents) + if (input.eventSystem.sendNavigationEvents) { if (!usedEvent) usedEvent |= SendMoveEventToSelectedObject(); @@ -278,11 +512,11 @@ public override void Process() private bool SendUpdateEventToSelectedObject() { - if (eventSystem.currentSelectedGameObject == null) + if (input.eventSystem.currentSelectedGameObject == null) return false; var data = input.GetBaseEventData(); - ExecuteEvents.Execute(eventSystem.currentSelectedGameObject, data, ExecuteEvents.updateSelectedHandler); + ExecuteEvents.Execute(input.eventSystem.currentSelectedGameObject, data, ExecuteEvents.updateSelectedHandler); return data.used; } @@ -298,17 +532,17 @@ private bool SendMoveEventToSelectedObject() } // If user pressed key again, always allow event - bool allow = Input.GetButtonDown(m_HorizontalAxis) || Input.GetButtonDown(m_VerticalAxis); + bool allow = Input.GetButtonDown(input.HorizontalAxis) || Input.GetButtonDown(input.VerticalAxis); bool similarDir = (Vector2.Dot(movement, m_LastMoveVector) > 0); if (!allow) { // Otherwise, user held down key or axis. // If direction didn't change at least 90 degrees, wait for delay before allowing consequtive event. if (similarDir && m_ConsecutiveMoveCount == 1) - allow = (time > m_PrevActionTime + m_RepeatDelay); + allow = (time > m_PrevActionTime + input.RepeatDelay); // If direction changed at least 90 degree, or we already had the delay, repeat at repeat rate. else - allow = (time > m_PrevActionTime + 1f / m_InputActionsPerSecond); + allow = (time > m_PrevActionTime + 1f / input.InputActionsPerSecond); } if (!allow) return false; @@ -318,7 +552,7 @@ private bool SendMoveEventToSelectedObject() if (axisEventData.moveDir != MoveDirection.None) { - ExecuteEvents.Execute(eventSystem.currentSelectedGameObject, axisEventData, ExecuteEvents.moveHandler); + ExecuteEvents.Execute(input.eventSystem.currentSelectedGameObject, axisEventData, ExecuteEvents.moveHandler); if (!similarDir) m_ConsecutiveMoveCount = 0; m_ConsecutiveMoveCount++; @@ -335,32 +569,32 @@ private bool SendMoveEventToSelectedObject() private bool SendSubmitEventToSelectedObject() { - if (eventSystem.currentSelectedGameObject == null) + if (input.eventSystem.currentSelectedGameObject == null) return false; var data = input.GetBaseEventData(); - if (Input.GetButtonDown(m_SubmitButton)) - ExecuteEvents.Execute(eventSystem.currentSelectedGameObject, data, ExecuteEvents.submitHandler); + if (Input.GetButtonDown(input.SubmitButton)) + ExecuteEvents.Execute(input.eventSystem.currentSelectedGameObject, data, ExecuteEvents.submitHandler); - if (Input.GetButtonDown(m_CancelButton)) - ExecuteEvents.Execute(eventSystem.currentSelectedGameObject, data, ExecuteEvents.cancelHandler); + if (Input.GetButtonDown(input.CancelButton)) + ExecuteEvents.Execute(input.eventSystem.currentSelectedGameObject, data, ExecuteEvents.cancelHandler); return data.used; } private Vector2 GetRawMoveVector() { Vector2 move = Vector2.zero; - move.x = Input.GetAxisRaw(m_HorizontalAxis); - move.y = Input.GetAxisRaw(m_VerticalAxis); + move.x = Input.GetAxisRaw(input.HorizontalAxis); + move.y = Input.GetAxisRaw(input.VerticalAxis); - if (Input.GetButtonDown(m_HorizontalAxis)) + if (Input.GetButtonDown(input.HorizontalAxis)) { if (move.x < 0) move.x = -1f; if (move.x > 0) move.x = 1f; } - if (Input.GetButtonDown(m_VerticalAxis)) + if (Input.GetButtonDown(input.VerticalAxis)) { if (move.y < 0) move.y = -1f; diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs index 3bd464082..47e1726d5 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs @@ -662,6 +662,13 @@ private void updateAdded(List pointers) this.pointers.Add(pointer); idToPointer.Add(pointer.Id, pointer); + for (var j = 0; j < layerCount; j++) + { + var touchLayer = layers[j]; + if (touchLayer == null) continue; + touchLayer.INTERNAL_AddPointer(pointer); + } + #if TOUCHSCRIPT_DEBUG if (DebugMode) addDebugFigureForPointer(pointer); #endif @@ -691,6 +698,15 @@ private void updateUpdated(List pointers) list.Add(pointer); var layer = pointer.GetPressData().Layer; 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); + } + } #if TOUCHSCRIPT_DEBUG if (DebugMode) addDebugFigureForPointer(pointer); @@ -794,6 +810,13 @@ private void updateRemoved(List pointers) pressedPointers.Remove(pointer); list.Add(pointer); + for (var j = 0; j < layerCount; j++) + { + var touchLayer = layers[j]; + if (touchLayer == null) continue; + touchLayer.INTERNAL_RemovePointer(pointer); + } + #if TOUCHSCRIPT_DEBUG if (DebugMode) removeDebugFigureForPointer(pointer); #endif @@ -831,8 +854,13 @@ private void updateCancelled(List pointers) this.pointers.Remove(pointer); pressedPointers.Remove(pointer); list.Add(pointer); - var layer = pointer.GetPressData().Layer; - if (layer != null) layer.INTERNAL_CancelPointer(pointer); + + for (var j = 0; j < layerCount; j++) + { + var touchLayer = layers[j]; + if (touchLayer == null) continue; + touchLayer.INTERNAL_CancelPointer(pointer); + } #if TOUCHSCRIPT_DEBUG if (DebugMode) removeDebugFigureForPointer(pointer); From e5326f1de5d3ec9bbe0f0244cf53bd4d5643863d Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 9 Aug 2016 14:23:26 +0300 Subject: [PATCH 085/211] Added an UI list of examples. --- .../TouchScript/Examples/Examples.unity | 5005 ++++++++++++++++- .../TouchScript/Examples/_misc/Fonts.meta | 9 + .../Examples/_misc/Fonts/LuckiestGuy.ttf | Bin 0 -> 73728 bytes .../Examples/_misc/Fonts/LuckiestGuy.ttf.meta | 19 + .../Examples/_misc/Scripts/Runner.cs | 27 +- .../Examples/_misc/Textures/UI.meta | 9 + .../_misc/Textures/UI/button_blue.png | Bin 0 -> 22190 bytes .../_misc/Textures/UI/button_blue.png.meta | 56 + .../_misc/Textures/UI/button_green.png | Bin 0 -> 21654 bytes .../_misc/Textures/UI/button_green.png.meta | 56 + .../_misc/Textures/UI/button_text.png | Bin 0 -> 20851 bytes .../_misc/Textures/UI/button_text.png.meta | 56 + .../Examples/_misc/Textures/UI/button_x.png | Bin 0 -> 25300 bytes .../_misc/Textures/UI/button_x.png.meta | 56 + .../Examples/_misc/Textures/UI/list_bg.png | Bin 0 -> 28266 bytes .../_misc/Textures/UI/list_bg.png.meta | 56 + .../_misc/Textures/UI/list_header.png | Bin 0 -> 21923 bytes .../_misc/Textures/UI/list_header.png.meta | 56 + .../Examples/_misc/Textures/UI/list_item.png | Bin 0 -> 10801 bytes .../_misc/Textures/UI/list_item.png.meta | 56 + 20 files changed, 5161 insertions(+), 300 deletions(-) create mode 100644 Source/Assets/TouchScript/Examples/_misc/Fonts.meta create mode 100644 Source/Assets/TouchScript/Examples/_misc/Fonts/LuckiestGuy.ttf create mode 100644 Source/Assets/TouchScript/Examples/_misc/Fonts/LuckiestGuy.ttf.meta create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/UI.meta create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/UI/button_blue.png create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/UI/button_blue.png.meta create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/UI/button_green.png create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/UI/button_green.png.meta create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/UI/button_text.png create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/UI/button_text.png.meta create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/UI/button_x.png create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/UI/button_x.png.meta create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/UI/list_bg.png create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/UI/list_bg.png.meta create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/UI/list_header.png create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/UI/list_header.png.meta create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/UI/list_item.png create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/UI/list_item.png.meta diff --git a/Source/Assets/TouchScript/Examples/Examples.unity b/Source/Assets/TouchScript/Examples/Examples.unity index 79d949c60..dbb857913 100644 --- a/Source/Assets/TouchScript/Examples/Examples.unity +++ b/Source/Assets/TouchScript/Examples/Examples.unity @@ -85,6 +85,185 @@ NavMeshSettings: cellSize: .166666657 manualCellSize: 0 m_NavMeshData: {fileID: 0} +--- !u!1 &15691937 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 15691938} + - 222: {fileID: 15691940} + - 114: {fileID: 15691939} + m_Layer: 5 + m_Name: Description + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &15691938 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 15691937} + m_LocalRotation: {x: 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: 1037999862} + m_RootOrder: 1 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 15.6999969, y: -4.89999962} + m_SizeDelta: {x: -131.899994, y: -51.2000008} + m_Pivot: {x: .5, y: .5} +--- !u!114 &15691939 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 15691937} + 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: 10 + m_MaxSize: 40 + m_Alignment: 3 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Shows how to use CameraLayer2D and Gesture.Cancel() to "give" touches to + another gesture. +--- !u!222 &15691940 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 15691937} +--- !u!1 &16824281 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 16824282} + - 222: {fileID: 16824284} + - 114: {fileID: 16824283} + m_Layer: 5 + m_Name: Description + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &16824282 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 16824281} + m_LocalRotation: {x: 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: 758236082} + m_RootOrder: 1 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 15.6999969, y: -4.89999962} + m_SizeDelta: {x: -131.899994, y: -51.2000008} + m_Pivot: {x: .5, y: .5} +--- !u!114 &16824283 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 16824281} + 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: 10 + m_MaxSize: 40 + m_Alignment: 3 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Shows how to use TransformGesture and PinnedTransformGesture. +--- !u!222 &16824284 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 16824281} +--- !u!1 &37557108 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 37557109} + m_Layer: 5 + m_Name: Examples + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &37557109 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 37557108} + m_LocalRotation: {x: 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: 1317055114} + - {fileID: 767854197} + m_Father: {fileID: 2032927211} + m_RootOrder: 1 + m_AnchorMin: {x: .5, y: 0} + m_AnchorMax: {x: .5, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 360, y: -60} + m_Pivot: {x: .5, y: .5} --- !u!1 &62216951 GameObject: m_ObjectHideFlags: 0 @@ -171,6 +350,146 @@ Camera: m_StereoConvergence: 10 m_StereoSeparation: .0219999999 m_StereoMirrorMode: 0 +--- !u!1 &96104531 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 96104532} + - 222: {fileID: 96104536} + - 114: {fileID: 96104535} + - 114: {fileID: 96104534} + - 114: {fileID: 96104533} + m_Layer: 5 + m_Name: Previous + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &96104532 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 96104531} + m_LocalRotation: {x: 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: 1784197137} + m_Father: {fileID: 666412329} + m_RootOrder: 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: 1, y: 0} +--- !u!114 &96104533 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 96104531} + 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: -1 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 +--- !u!114 &96104534 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 96104531} + 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: .158620954, g: 1, b: 0, a: 1} + m_PressedColor: {r: .904411793, g: .904411793, b: .904411793, a: 1} + m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + m_ColorMultiplier: 1 + m_FadeDuration: .100000001 + 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: 96104535} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1654745588} + m_MethodName: LoadPreviousLevel + 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 &96104535 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 96104531} + 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: 8c24c9fccfbf94ef08c2da39f7245967, 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 &96104536 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 96104531} --- !u!1 &174295520 GameObject: m_ObjectHideFlags: 0 @@ -180,6 +499,7 @@ GameObject: m_Component: - 4: {fileID: 174295523} - 114: {fileID: 174295522} + - 114: {fileID: 174295521} m_Layer: 0 m_Name: EventSystem m_TagString: Untagged @@ -187,6 +507,23 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 +--- !u!114 &174295521 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 174295520} + 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: .5 --- !u!114 &174295522 MonoBehaviour: m_ObjectHideFlags: 0 @@ -213,61 +550,4323 @@ Transform: m_Children: [] m_Father: {fileID: 1654745587} m_RootOrder: 0 ---- !u!1 &309713870 +--- !u!1 &201561626 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} serializedVersion: 4 m_Component: - - 224: {fileID: 309713871} - - 222: {fileID: 309713874} - - 114: {fileID: 309713873} - - 114: {fileID: 309713872} + - 224: {fileID: 201561627} + - 222: {fileID: 201561630} + - 114: {fileID: 201561629} + - 114: {fileID: 201561628} m_Layer: 5 - m_Name: Text + m_Name: Button m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &309713871 +--- !u!224 &201561627 RectTransform: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 309713870} + m_GameObject: {fileID: 201561626} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1.63333333, y: 1.63333333, z: 1.63333333} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 870787322} + m_RootOrder: 2 + m_AnchorMin: {x: .5, y: .5} + m_AnchorMax: {x: .5, y: .5} + m_AnchoredPosition: {x: 100, y: -4.9000001} + m_SizeDelta: {x: 36.7000008, y: 36.5999985} + m_Pivot: {x: .5, y: .5} +--- !u!114 &201561628 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 201561626} + 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: .757352948, g: 1, b: .769066989, a: 1} + m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} + m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + m_ColorMultiplier: 1 + m_FadeDuration: .100000001 + 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: 201561629} + 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: Camera + 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 &201561629 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 201561626} + 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 &201561630 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 201561626} +--- !u!1 &309713870 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 309713871} + - 222: {fileID: 309713874} + - 114: {fileID: 309713873} + - 114: {fileID: 309713872} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &309713871 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 309713870} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1.63333333, y: 1.63333333, z: 1.63333333} m_Children: [] m_Father: {fileID: 1402896514} m_RootOrder: 0 m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -405.204102, y: -304} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -405.204102, y: -304} + m_Pivot: {x: .5, y: .5} +--- !u!114 &309713872 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 309713870} + 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: 1} + m_EffectDistance: {x: 2, y: 2} + m_UseGraphicAlpha: 1 +--- !u!114 &309713873 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 309713870} + 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: 53 + m_FontStyle: 0 + m_BestFit: 1 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Make sure that you add example scenes to build settings! +--- !u!222 &309713874 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 309713870} +--- !u!1 &321008077 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 321008078} + - 222: {fileID: 321008081} + - 114: {fileID: 321008080} + - 114: {fileID: 321008079} + m_Layer: 5 + m_Name: Portal + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &321008078 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 321008077} + m_LocalRotation: {x: 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: 1449561975} + - {fileID: 1241691652} + - {fileID: 1894139120} + m_Father: {fileID: 2098255038} + m_RootOrder: 6 + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 128.5, y: -532} + m_SizeDelta: {x: 257, y: 80} + m_Pivot: {x: .5, y: .5} +--- !u!114 &321008079 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 321008077} + 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 &321008080 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 321008077} + 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 &321008081 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 321008077} +--- !u!1 &341179472 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 341179473} + - 222: {fileID: 341179476} + - 114: {fileID: 341179475} + - 114: {fileID: 341179474} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &341179473 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 341179472} + m_LocalRotation: {x: 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: 574950114} + m_RootOrder: 2 + m_AnchorMin: {x: .5, y: .5} + m_AnchorMax: {x: .5, y: .5} + m_AnchoredPosition: {x: 100, y: -4.9000001} + m_SizeDelta: {x: 36.7000008, y: 36.5999985} + m_Pivot: {x: .5, y: .5} +--- !u!114 &341179474 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 341179472} + 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: .757352948, g: 1, b: .769066989, a: 1} + m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} + m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + m_ColorMultiplier: 1 + m_FadeDuration: .100000001 + 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: 341179475} + 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: Taps + 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 &341179475 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 341179472} + 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 &341179476 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 341179472} +--- !u!1 &357107824 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 357107825} + - 222: {fileID: 357107828} + - 114: {fileID: 357107827} + - 114: {fileID: 357107826} + m_Layer: 5 + m_Name: Title + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &357107825 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 357107824} + m_LocalRotation: {x: 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: 1037999862} + m_RootOrder: 0 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 33.6999969, y: 21.6000004} + m_SizeDelta: {x: -94.8000031, y: -68.1999969} + m_Pivot: {x: .5, y: .5} +--- !u!114 &357107826 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 357107824} + 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: .5} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 0 +--- !u!114 &357107827 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 357107824} + 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_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: colors +--- !u!222 &357107828 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 357107824} +--- !u!1 &363049654 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 363049655} + - 222: {fileID: 363049658} + - 114: {fileID: 363049657} + - 114: {fileID: 363049656} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &363049655 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 363049654} + m_LocalRotation: {x: 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: 758236082} + m_RootOrder: 2 + m_AnchorMin: {x: .5, y: .5} + m_AnchorMax: {x: .5, y: .5} + m_AnchoredPosition: {x: 100, y: -4.9000001} + m_SizeDelta: {x: 36.7000008, y: 36.5999985} + m_Pivot: {x: .5, y: .5} +--- !u!114 &363049656 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 363049654} + 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: .757352948, g: 1, b: .769066989, a: 1} + m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} + m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + m_ColorMultiplier: 1 + m_FadeDuration: .100000001 + 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: 363049657} + 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: Checkers + 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 &363049657 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 363049654} + 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 &363049658 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 363049654} +--- !u!1 &385551182 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 385551183} + - 222: {fileID: 385551185} + - 114: {fileID: 385551184} + m_Layer: 5 + m_Name: Description + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &385551183 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 385551182} + m_LocalRotation: {x: 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: 1 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 15.6999969, y: -4.89999962} + m_SizeDelta: {x: -131.899994, y: -51.2000008} + m_Pivot: {x: .5, y: .5} +--- !u!114 &385551184 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 385551182} + 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: 10 + m_MaxSize: 40 + m_Alignment: 3 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Shows how to use 3D and 2D layers simultaneously. +--- !u!222 &385551185 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 385551182} +--- !u!1 &406504770 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 406504771} + - 222: {fileID: 406504774} + - 114: {fileID: 406504773} + - 114: {fileID: 406504772} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &406504771 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 406504770} + m_LocalRotation: {x: 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: 1037999862} + m_RootOrder: 2 + m_AnchorMin: {x: .5, y: .5} + m_AnchorMax: {x: .5, y: .5} + m_AnchoredPosition: {x: 100, y: -4.9000001} + m_SizeDelta: {x: 36.7000008, y: 36.5999985} + m_Pivot: {x: .5, y: .5} +--- !u!114 &406504772 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 406504770} + 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: .757352948, g: 1, b: .769066989, a: 1} + m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} + m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + m_ColorMultiplier: 1 + m_FadeDuration: .100000001 + 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: 406504773} + 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: Colors + 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 &406504773 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 406504770} + 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 &406504774 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 406504770} +--- !u!1 &507770917 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 507770921} + - 222: {fileID: 507770920} + - 114: {fileID: 507770919} + - 114: {fileID: 507770918} + m_Layer: 5 + m_Name: Title + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &507770918 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 507770917} + 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: .5} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 0 +--- !u!114 &507770919 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 507770917} + 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_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: cube +--- !u!222 &507770920 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 507770917} +--- !u!224 &507770921 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 507770917} + m_LocalRotation: {x: 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: 621592926} + m_RootOrder: 0 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 33.6999969, y: 21.6000004} + m_SizeDelta: {x: -94.8000031, y: -68.1999969} + m_Pivot: {x: .5, y: .5} +--- !u!1 &574950113 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 574950114} + - 222: {fileID: 574950117} + - 114: {fileID: 574950116} + - 114: {fileID: 574950115} + m_Layer: 5 + m_Name: Taps + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &574950114 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 574950113} + m_LocalRotation: {x: 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: 1800191864} + - {fileID: 745674114} + - {fileID: 341179473} + m_Father: {fileID: 2098255038} + m_RootOrder: 0 + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 128.5, y: -40} + m_SizeDelta: {x: 257, y: 80} + m_Pivot: {x: .5, y: .5} +--- !u!114 &574950115 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 574950113} + 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 &574950116 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 574950113} + 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 &574950117 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 574950113} +--- !u!1 &595145114 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 595145115} + - 222: {fileID: 595145117} + - 114: {fileID: 595145116} + m_Layer: 5 + m_Name: Description + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &595145115 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 595145114} + m_LocalRotation: {x: 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: 601448587} + m_RootOrder: 1 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 15.6999969, y: -4.89999962} + m_SizeDelta: {x: -131.899994, y: -51.2000008} + m_Pivot: {x: .5, y: .5} +--- !u!114 &595145116 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 595145114} + 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: 10 + m_MaxSize: 40 + m_Alignment: 3 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Shows how to use TouchScript simply as a source of touches with no gestures + in scene. +--- !u!222 &595145117 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 595145114} +--- !u!1 &601448586 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 601448587} + - 222: {fileID: 601448590} + - 114: {fileID: 601448589} + - 114: {fileID: 601448588} + m_Layer: 5 + m_Name: Raw Input + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &601448587 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 601448586} + m_LocalRotation: {x: 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: 1260024592} + - {fileID: 595145115} + - {fileID: 2001542684} + m_Father: {fileID: 2098255038} + m_RootOrder: 8 + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 128.5, y: -696} + m_SizeDelta: {x: 257, y: 80} + m_Pivot: {x: .5, y: .5} +--- !u!114 &601448588 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 601448586} + 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 &601448589 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 601448586} + 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 &601448590 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 601448586} +--- !u!1 &606054178 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 606054179} + - 114: {fileID: 606054182} + - 222: {fileID: 606054181} + - 114: {fileID: 606054180} + m_Layer: 5 + m_Name: Viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &606054179 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 606054178} + m_LocalRotation: {x: 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: 2098255038} + m_Father: {fileID: 1317055114} + m_RootOrder: 0 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 25, y: -43} + m_SizeDelta: {x: -62, y: -104} + m_Pivot: {x: 0, y: 1} +--- !u!114 &606054180 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 606054178} + 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: 10917, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &606054181 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 606054178} +--- !u!114 &606054182 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 606054178} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -1200242548, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 0 +--- !u!1 &621592925 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 621592926} + - 222: {fileID: 621592929} + - 114: {fileID: 621592928} + - 114: {fileID: 621592927} + m_Layer: 5 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &621592926 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 621592925} + m_LocalRotation: {x: 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: 507770921} + - {fileID: 749901011} + - {fileID: 842217637} + m_Father: {fileID: 2098255038} + m_RootOrder: 5 + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 128.5, y: -450} + m_SizeDelta: {x: 257, y: 80} + m_Pivot: {x: .5, y: .5} +--- !u!114 &621592927 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 621592925} + 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 &621592928 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 621592925} + 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 &621592929 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 621592925} +--- !u!1 &666412328 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 666412329} + - 114: {fileID: 666412330} + m_Layer: 5 + m_Name: Buttons + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &666412329 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 666412328} + m_LocalRotation: {x: 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: 96104532} + - {fileID: 1412835668} + - {fileID: 1778454010} + m_Father: {fileID: 2032927211} + m_RootOrder: 0 + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: -141, y: 35} + m_SizeDelta: {x: 259, y: 49} + m_Pivot: {x: .500000358, y: .5} +--- !u!114 &666412330 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 666412328} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -405508275, 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: 2 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 +--- !u!1 &700544018 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 700544019} + - 222: {fileID: 700544021} + - 114: {fileID: 700544020} + m_Layer: 5 + m_Name: Ribbon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &700544019 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 700544018} + m_LocalRotation: {x: 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: 1924054934} + m_Father: {fileID: 1317055114} + m_RootOrder: 1 + m_AnchorMin: {x: .5, y: .960771918} + m_AnchorMax: {x: .5, y: .960771918} + m_AnchoredPosition: {x: 2.09810023e-05, y: 7.39990234} + m_SizeDelta: {x: 262.600006, y: 73.2419968} + m_Pivot: {x: .5, y: .49999997} +--- !u!114 &700544020 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 700544018} + 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: 795edb780ddd9406493b04bb9b8ed002, 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 &700544021 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 700544018} +--- !u!1 &745674113 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 745674114} + - 222: {fileID: 745674116} + - 114: {fileID: 745674115} + m_Layer: 5 + m_Name: Description + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &745674114 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 745674113} + m_LocalRotation: {x: 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: 574950114} + m_RootOrder: 1 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 15.6999969, y: -4.89999962} + m_SizeDelta: {x: -131.899994, y: -51.2000008} + m_Pivot: {x: .5, y: .5} +--- !u!114 &745674115 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 745674113} + 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: 10 + m_MaxSize: 40 + m_Alignment: 3 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: How to use TapGesture and LongPressGesture. +--- !u!222 &745674116 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 745674113} +--- !u!1 &749901010 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 749901011} + - 222: {fileID: 749901013} + - 114: {fileID: 749901012} + m_Layer: 5 + m_Name: Description + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &749901011 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 749901010} + m_LocalRotation: {x: 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: 621592926} + m_RootOrder: 1 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 15.6999969, y: -4.89999962} + m_SizeDelta: {x: -131.899994, y: -51.2000008} + m_Pivot: {x: .5, y: .5} +--- !u!114 &749901012 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 749901010} + 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: 10 + m_MaxSize: 40 + m_Alignment: 3 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Shows how to use a custom input source and TouchLayer.Delegate. +--- !u!222 &749901013 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 749901010} +--- !u!1 &758236081 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 758236082} + - 222: {fileID: 758236085} + - 114: {fileID: 758236084} + - 114: {fileID: 758236083} + m_Layer: 5 + m_Name: Checkers + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &758236082 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 758236081} + m_LocalRotation: {x: 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: 1280257797} + - {fileID: 16824282} + - {fileID: 363049655} + m_Father: {fileID: 2098255038} + m_RootOrder: 2 + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 128.5, y: -204} + m_SizeDelta: {x: 257, y: 80} + m_Pivot: {x: .5, y: .5} +--- !u!114 &758236083 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 758236081} + 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 &758236084 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 758236081} + 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 &758236085 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 758236081} +--- !u!1 &767854196 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 767854197} + - 222: {fileID: 767854200} + - 114: {fileID: 767854199} + - 114: {fileID: 767854198} + m_Layer: 5 + m_Name: Close + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &767854197 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 767854196} + m_LocalRotation: {x: 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: 37557109} + m_RootOrder: 1 + m_AnchorMin: {x: 1, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -31.1999969, y: -39.7001953} + m_SizeDelta: {x: 54.5, y: 54.4000015} + m_Pivot: {x: .5, y: .5} +--- !u!114 &767854198 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 767854196} + 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: 1, g: .75, b: .75, a: 1} + m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} + m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + m_ColorMultiplier: 1 + m_FadeDuration: .100000001 + 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: 767854199} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 37557108} + m_MethodName: SetActive + m_Mode: 6 + 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 &767854199 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 767854196} + 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: da634550c6a1c4ff38304b1c8566d809, 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 &767854200 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 767854196} +--- !u!1 &801696178 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 801696179} + - 222: {fileID: 801696182} + - 114: {fileID: 801696181} + - 114: {fileID: 801696180} + m_Layer: 5 + m_Name: Title + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &801696179 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 801696178} + m_LocalRotation: {x: 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: 2076713667} + m_RootOrder: 0 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 33.6999969, y: 21.6000004} + m_SizeDelta: {x: -94.8000031, y: -68.1999969} + m_Pivot: {x: .5, y: .5} +--- !u!114 &801696180 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 801696178} + 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: .5} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 0 +--- !u!114 &801696181 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 801696178} + 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_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: photos +--- !u!222 &801696182 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 801696178} +--- !u!1 &842217636 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 842217637} + - 222: {fileID: 842217640} + - 114: {fileID: 842217639} + - 114: {fileID: 842217638} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &842217637 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 842217636} + m_LocalRotation: {x: 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: 621592926} + m_RootOrder: 2 + m_AnchorMin: {x: .5, y: .5} + m_AnchorMax: {x: .5, y: .5} + m_AnchoredPosition: {x: 100, y: -4.9000001} + m_SizeDelta: {x: 36.7000008, y: 36.5999985} + m_Pivot: {x: .5, y: .5} +--- !u!114 &842217638 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 842217636} + 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: .757352948, g: 1, b: .769066989, a: 1} + m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} + m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + m_ColorMultiplier: 1 + m_FadeDuration: .100000001 + 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: 842217639} + 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: Cube + 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 &842217639 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 842217636} + 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 &842217640 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 842217636} +--- !u!1 &870787321 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 870787322} + - 222: {fileID: 870787325} + - 114: {fileID: 870787324} + - 114: {fileID: 870787323} + m_Layer: 5 + m_Name: Camera + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &870787322 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 870787321} + m_LocalRotation: {x: 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: 879805661} + - {fileID: 1030186641} + - {fileID: 201561627} + m_Father: {fileID: 2098255038} + m_RootOrder: 1 + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 128.5, y: -122} + m_SizeDelta: {x: 257, y: 80} + m_Pivot: {x: .5, y: .5} +--- !u!114 &870787323 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 870787321} + 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 &870787324 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 870787321} + 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 &870787325 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 870787321} +--- !u!1 &879805660 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 879805661} + - 222: {fileID: 879805664} + - 114: {fileID: 879805663} + - 114: {fileID: 879805662} + m_Layer: 5 + m_Name: Title + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &879805661 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 879805660} + m_LocalRotation: {x: 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: 870787322} + m_RootOrder: 0 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 33.6999969, y: 21.6000004} + m_SizeDelta: {x: -94.8000031, y: -68.1999969} + m_Pivot: {x: .5, y: .5} +--- !u!114 &879805662 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 879805660} + 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: .5} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 0 +--- !u!114 &879805663 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 879805660} + 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_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: camera +--- !u!222 &879805664 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 879805660} +--- !u!1 &962873576 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 962873577} + - 222: {fileID: 962873580} + - 114: {fileID: 962873579} + - 114: {fileID: 962873578} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &962873577 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 962873576} + m_LocalRotation: {x: 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: 2 + m_AnchorMin: {x: .5, y: .5} + m_AnchorMax: {x: .5, y: .5} + m_AnchoredPosition: {x: 100, y: -4.9000001} + m_SizeDelta: {x: 36.7000008, y: 36.5999985} + m_Pivot: {x: .5, y: .5} +--- !u!114 &962873578 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 962873576} + 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: .757352948, g: 1, b: .769066989, a: 1} + m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} + m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + m_ColorMultiplier: 1 + m_FadeDuration: .100000001 + 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: 962873579} + 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: Multiuser + 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 &962873579 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 962873576} + 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 &962873580 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 962873576} +--- !u!1 &1004776689 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 1004776690} + - 222: {fileID: 1004776693} + - 114: {fileID: 1004776692} + - 114: {fileID: 1004776691} + m_Layer: 5 + m_Name: Multiuser + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1004776690 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1004776689} + m_LocalRotation: {x: 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: 2008717908} + - {fileID: 385551183} + - {fileID: 962873577} + m_Father: {fileID: 2098255038} + m_RootOrder: 4 + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 128.5, y: -368} + m_SizeDelta: {x: 257, y: 80} + m_Pivot: {x: .5, y: .5} +--- !u!114 &1004776691 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1004776689} + 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 &1004776692 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1004776689} + 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 &1004776693 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1004776689} +--- !u!1 &1030186640 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 1030186641} + - 222: {fileID: 1030186643} + - 114: {fileID: 1030186642} + m_Layer: 5 + m_Name: Description + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1030186641 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1030186640} + m_LocalRotation: {x: 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: 870787322} + m_RootOrder: 1 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 15.6999969, y: -4.89999962} + m_SizeDelta: {x: -131.899994, y: -51.2000008} + m_Pivot: {x: .5, y: .5} +--- !u!114 &1030186642 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1030186640} + 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: 10 + m_MaxSize: 40 + m_Alignment: 3 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: How to use TransformGesture to make a camera which can orbit and move around + an object. +--- !u!222 &1030186643 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1030186640} +--- !u!1 &1037999861 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 1037999862} + - 222: {fileID: 1037999865} + - 114: {fileID: 1037999864} + - 114: {fileID: 1037999863} + m_Layer: 5 + m_Name: Colors + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1037999862 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1037999861} + m_LocalRotation: {x: 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: 357107825} + - {fileID: 15691938} + - {fileID: 406504771} + m_Father: {fileID: 2098255038} + m_RootOrder: 7 + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 128.5, y: -614} + m_SizeDelta: {x: 257, y: 80} + m_Pivot: {x: .5, y: .5} +--- !u!114 &1037999863 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1037999861} + 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 &1037999864 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1037999861} + 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 &1037999865 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1037999861} +--- !u!1 &1168732682 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 1168732683} + - 222: {fileID: 1168732685} + - 114: {fileID: 1168732684} + m_Layer: 5 + m_Name: Description + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1168732683 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1168732682} + m_LocalRotation: {x: 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: 2076713667} + m_RootOrder: 1 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 15.6999969, y: -4.89999962} + m_SizeDelta: {x: -131.899994, y: -51.2000008} + m_Pivot: {x: .5, y: .5} +--- !u!114 &1168732684 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1168732682} + 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: 10 + m_MaxSize: 40 + m_Alignment: 3 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Shows how to use UI Layer to interact with UI elements. +--- !u!222 &1168732685 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1168732682} +--- !u!1 &1173809305 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 1173809306} + - 222: {fileID: 1173809309} + - 114: {fileID: 1173809308} + - 114: {fileID: 1173809307} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1173809306 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1173809305} + m_LocalRotation: {x: 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: 1778454010} + m_RootOrder: 0 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -1} + m_SizeDelta: {x: 0, y: -11} + m_Pivot: {x: .5, y: .5} +--- !u!114 &1173809307 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1173809305} + 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: .296999991} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 1 +--- !u!114 &1173809308 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1173809305} + 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: 12800000, guid: e423173afdece4d3fa49ed8e89391fce, type: 3} + m_FontSize: 28 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: '>>' +--- !u!222 &1173809309 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1173809305} +--- !u!1 &1241691651 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 1241691652} + - 222: {fileID: 1241691654} + - 114: {fileID: 1241691653} + m_Layer: 5 + m_Name: Description + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1241691652 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1241691651} + m_LocalRotation: {x: 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: 321008078} + m_RootOrder: 1 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 15.6999969, y: -4.89999962} + m_SizeDelta: {x: -131.899994, y: -51.2000008} + m_Pivot: {x: .5, y: .5} +--- !u!114 &1241691653 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1241691651} + 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: 10 + m_MaxSize: 40 + m_Alignment: 3 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Shows how to cancel a gesture. +--- !u!222 &1241691654 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1241691651} +--- !u!1 &1260024591 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 1260024592} + - 222: {fileID: 1260024595} + - 114: {fileID: 1260024594} + - 114: {fileID: 1260024593} + m_Layer: 5 + m_Name: Title + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1260024592 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1260024591} + m_LocalRotation: {x: 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: 601448587} + m_RootOrder: 0 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 33.6999969, y: 21.6000004} + m_SizeDelta: {x: -94.8000031, y: -68.1999969} + m_Pivot: {x: .5, y: .5} +--- !u!114 &1260024593 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1260024591} + 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: .5} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 0 +--- !u!114 &1260024594 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1260024591} + 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_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: raw input +--- !u!222 &1260024595 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1260024591} +--- !u!1 &1280257796 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 1280257797} + - 222: {fileID: 1280257800} + - 114: {fileID: 1280257799} + - 114: {fileID: 1280257798} + m_Layer: 5 + m_Name: Title + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1280257797 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1280257796} + m_LocalRotation: {x: 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: 758236082} + m_RootOrder: 0 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 33.6999969, y: 21.6000004} + m_SizeDelta: {x: -94.8000031, y: -68.1999969} + m_Pivot: {x: .5, y: .5} +--- !u!114 &1280257798 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1280257796} + 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: .5} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 0 +--- !u!114 &1280257799 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1280257796} + 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_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: checkers +--- !u!222 &1280257800 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1280257796} +--- !u!1 &1317055113 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 1317055114} + - 114: {fileID: 1317055117} + - 222: {fileID: 1317055116} + - 114: {fileID: 1317055115} + m_Layer: 5 + m_Name: Examples List + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1317055114 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1317055113} + m_LocalRotation: {x: 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: 606054179} + - {fileID: 700544019} + m_Father: {fileID: 37557109} + m_RootOrder: 0 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -0, y: -10} + m_SizeDelta: {x: -41, y: -60} + m_Pivot: {x: .5, y: .5} +--- !u!114 &1317055115 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1317055113} + 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: 9162f54c0795b4623b5616fc423eec6a, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &1317055116 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1317055113} +--- !u!114 &1317055117 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1317055113} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1367256648, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 2098255038} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 1 + m_Elasticity: .100000001 + m_Inertia: 1 + m_DecelerationRate: .135000005 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 606054179} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 0} + m_HorizontalScrollbarVisibility: 2 + m_VerticalScrollbarVisibility: 2 + m_HorizontalScrollbarSpacing: -3 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.ScrollRect+ScrollRectEvent, UnityEngine.UI, Version=1.0.0.0, + Culture=neutral, PublicKeyToken=null +--- !u!1 &1361172026 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 1361172027} + - 222: {fileID: 1361172030} + - 114: {fileID: 1361172029} + - 114: {fileID: 1361172028} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1361172027 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1361172026} + m_LocalRotation: {x: 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: 2076713667} + m_RootOrder: 2 + m_AnchorMin: {x: .5, y: .5} + m_AnchorMax: {x: .5, y: .5} + m_AnchoredPosition: {x: 100, y: -4.9000001} + m_SizeDelta: {x: 36.7000008, y: 36.5999985} + m_Pivot: {x: .5, y: .5} +--- !u!114 &1361172028 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1361172026} + 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: .757352948, g: 1, b: .769066989, a: 1} + m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} + m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + m_ColorMultiplier: 1 + m_FadeDuration: .100000001 + 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: 1361172029} + 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: Photos + 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 &1361172029 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1361172026} + 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 &1361172030 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1361172026} +--- !u!1 &1402896513 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 1402896514} + - 223: {fileID: 1402896517} + - 114: {fileID: 1402896516} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1402896514 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1402896513} + 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: 309713871} + m_Father: {fileID: 0} + m_RootOrder: 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 &1402896516 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1402896513} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1980459831, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 +--- !u!223 &1402896517 +Canvas: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1402896513} + m_Enabled: 1 + serializedVersion: 2 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!1 &1412835664 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 1412835668} + - 222: {fileID: 1412835667} + - 114: {fileID: 1412835666} + - 114: {fileID: 1412835665} + - 114: {fileID: 1412835669} + m_Layer: 5 + m_Name: List + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1412835665 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1412835664} + 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, g: .958620548, b: 1, a: 1} + m_PressedColor: {r: .904411793, g: .904411793, b: .904411793, a: 1} + m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + m_ColorMultiplier: 1 + m_FadeDuration: .100000001 + 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: 1412835666} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 37557108} + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 + m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0, + Culture=neutral, PublicKeyToken=null +--- !u!114 &1412835666 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1412835664} + 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: 0afc57b6a109d46f6a1168e3fce8d788, 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 &1412835667 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1412835664} +--- !u!224 &1412835668 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1412835664} + m_LocalRotation: {x: 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: 1487808224} + m_Father: {fileID: 666412329} + m_RootOrder: 1 + 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: 1, y: 0} +--- !u!114 &1412835669 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1412835664} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1679637790, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: 100 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 +--- !u!1 &1449561974 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 1449561975} + - 222: {fileID: 1449561978} + - 114: {fileID: 1449561977} + - 114: {fileID: 1449561976} + m_Layer: 5 + m_Name: Title + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1449561975 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1449561974} + m_LocalRotation: {x: 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: 321008078} + m_RootOrder: 0 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 33.6999969, y: 21.6000004} + m_SizeDelta: {x: -94.8000031, y: -68.1999969} + m_Pivot: {x: .5, y: .5} +--- !u!114 &1449561976 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1449561974} + 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: .5} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 0 +--- !u!114 &1449561977 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1449561974} + 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_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: portal +--- !u!222 &1449561978 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1449561974} +--- !u!1 &1487808223 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 1487808224} + - 222: {fileID: 1487808226} + - 114: {fileID: 1487808225} + - 114: {fileID: 1487808227} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1487808224 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1487808223} + m_LocalRotation: {x: 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: 1412835668} + m_RootOrder: 0 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 2} + m_SizeDelta: {x: 0, y: -4} + m_Pivot: {x: .5, y: .5} +--- !u!114 &1487808225 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1487808223} + 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: 12800000, guid: e423173afdece4d3fa49ed8e89391fce, type: 3} + m_FontSize: 16 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: EXAMPLES LIST +--- !u!222 &1487808226 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1487808223} +--- !u!114 &1487808227 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1487808223} + 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: .296999991} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 1 +--- !u!1 &1654745586 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 4: {fileID: 1654745587} + - 114: {fileID: 1654745588} + - 114: {fileID: 1654745589} + m_Layer: 0 + m_Name: Examples + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1654745587 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1654745586} + m_LocalRotation: {x: 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: 174295523} + - {fileID: 2032927211} + m_Father: {fileID: 0} + m_RootOrder: 2 +--- !u!114 &1654745588 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1654745586} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5d0145ec13410624f9b2939e5d5a99be, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &1654745589 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1654745586} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4ad2b146e2cb148fdad573d18694ff59, type: 3} + m_Name: + m_EditorClassIdentifier: + Name: UI Overlay Layer +--- !u!1 &1778454009 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 1778454010} + - 222: {fileID: 1778454014} + - 114: {fileID: 1778454013} + - 114: {fileID: 1778454012} + - 114: {fileID: 1778454011} + m_Layer: 5 + m_Name: Next + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1778454010 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1778454009} + m_LocalRotation: {x: 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: 1173809306} + m_Father: {fileID: 666412329} + m_RootOrder: 2 + 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: 1, y: 0} +--- !u!114 &1778454011 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1778454009} + 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: -1 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 +--- !u!114 &1778454012 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1778454009} + 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: .158620954, g: 1, b: 0, a: 1} + m_PressedColor: {r: .904411793, g: .904411793, b: .904411793, a: 1} + m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + m_ColorMultiplier: 1 + m_FadeDuration: .100000001 + 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: 1778454013} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1654745588} + m_MethodName: LoadNextLevel + 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 &1778454013 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1778454009} + 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: 8c24c9fccfbf94ef08c2da39f7245967, 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 &1778454014 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1778454009} +--- !u!1 &1784197136 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 1784197137} + - 222: {fileID: 1784197140} + - 114: {fileID: 1784197139} + - 114: {fileID: 1784197138} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1784197137 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1784197136} + m_LocalRotation: {x: 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: 96104532} + m_RootOrder: 0 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -2} + m_SizeDelta: {x: 0, y: -12} + m_Pivot: {x: .5, y: .5} +--- !u!114 &1784197138 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1784197136} + 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: .296999991} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 1 +--- !u!114 &1784197139 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1784197136} + 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: 12800000, guid: e423173afdece4d3fa49ed8e89391fce, type: 3} + m_FontSize: 28 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: << +--- !u!222 &1784197140 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1784197136} +--- !u!1 &1800191863 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 1800191864} + - 222: {fileID: 1800191867} + - 114: {fileID: 1800191866} + - 114: {fileID: 1800191865} + m_Layer: 5 + m_Name: Title + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1800191864 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1800191863} + m_LocalRotation: {x: 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: 574950114} + m_RootOrder: 0 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 33.6999969, y: 21.6000004} + m_SizeDelta: {x: -94.8000031, y: -68.1999969} + m_Pivot: {x: .5, y: .5} +--- !u!114 &1800191865 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1800191863} + 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: .5} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 0 +--- !u!114 &1800191866 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1800191863} + 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_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: taps +--- !u!222 &1800191867 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1800191863} +--- !u!1 &1894139119 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 1894139120} + - 222: {fileID: 1894139123} + - 114: {fileID: 1894139122} + - 114: {fileID: 1894139121} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1894139120 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1894139119} + m_LocalRotation: {x: 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: 321008078} + m_RootOrder: 2 + m_AnchorMin: {x: .5, y: .5} + m_AnchorMax: {x: .5, y: .5} + m_AnchoredPosition: {x: 100, y: -4.9000001} + m_SizeDelta: {x: 36.7000008, y: 36.5999985} + m_Pivot: {x: .5, y: .5} +--- !u!114 &1894139121 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1894139119} + 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: .757352948, g: 1, b: .769066989, a: 1} + m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} + m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + m_ColorMultiplier: 1 + m_FadeDuration: .100000001 + 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: 1894139122} + 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: Portal + 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 &1894139122 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1894139119} + 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 &1894139123 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1894139119} +--- !u!1 &1924054933 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 1924054934} + - 222: {fileID: 1924054937} + - 114: {fileID: 1924054936} + - 114: {fileID: 1924054935} + m_Layer: 5 + m_Name: Examples + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1924054934 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1924054933} + m_LocalRotation: {x: 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: 700544019} + m_RootOrder: 0 + m_AnchorMin: {x: .5, y: .5} + m_AnchorMax: {x: .5, y: .5} + m_AnchoredPosition: {x: -2.43190007e-05, y: 7.9000001} + m_SizeDelta: {x: 151.800003, y: 24.7999992} + m_Pivot: {x: .5, y: .5} +--- !u!114 &1924054935 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1924054933} + 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: .515999973} + m_EffectDistance: {x: 1, y: 1} + m_UseGraphicAlpha: 0 +--- !u!114 &1924054936 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1924054933} + 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: .965170264, b: .852941155, 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: 12800000, guid: e423173afdece4d3fa49ed8e89391fce, type: 3} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 1 + m_MinSize: 10 + m_MaxSize: 90 + m_Alignment: 4 + m_RichText: 0 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: EXAMPLES +--- !u!222 &1924054937 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1924054933} +--- !u!1 &2001542683 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 2001542684} + - 222: {fileID: 2001542687} + - 114: {fileID: 2001542686} + - 114: {fileID: 2001542685} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2001542684 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2001542683} + m_LocalRotation: {x: 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: 601448587} + m_RootOrder: 2 + m_AnchorMin: {x: .5, y: .5} + m_AnchorMax: {x: .5, y: .5} + m_AnchoredPosition: {x: 100, y: -4.9000001} + m_SizeDelta: {x: 36.7000008, y: 36.5999985} + m_Pivot: {x: .5, y: .5} +--- !u!114 &2001542685 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2001542683} + 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: .757352948, g: 1, b: .769066989, a: 1} + m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} + m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + m_ColorMultiplier: 1 + m_FadeDuration: .100000001 + 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: 2001542686} + 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: RawInput + 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 &2001542686 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2001542683} + 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 &2001542687 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2001542683} +--- !u!1 &2008717907 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 2008717908} + - 222: {fileID: 2008717911} + - 114: {fileID: 2008717910} + - 114: {fileID: 2008717909} + m_Layer: 5 + m_Name: Title + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2008717908 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2008717907} + m_LocalRotation: {x: 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: 0 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 33.6999969, y: 21.6000004} + m_SizeDelta: {x: -94.8000031, y: -68.1999969} m_Pivot: {x: .5, y: .5} ---- !u!114 &309713872 +--- !u!114 &2008717909 MonoBehaviour: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 309713870} + m_GameObject: {fileID: 2008717907} 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: 1} - m_EffectDistance: {x: 2, y: 2} - m_UseGraphicAlpha: 1 ---- !u!114 &309713873 + m_EffectColor: {r: 0, g: 0, b: 0, a: .5} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 0 +--- !u!114 &2008717910 MonoBehaviour: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 309713870} + m_GameObject: {fileID: 2008717907} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} @@ -275,42 +4874,42 @@ 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: [] 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: 53 + 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: 4 + m_Alignment: 3 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 m_LineSpacing: 1 - m_Text: Make sure that you add example scenes to build settings! ---- !u!222 &309713874 + m_Text: multiuser +--- !u!222 &2008717911 CanvasRenderer: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 309713870} ---- !u!1 &740851131 + m_GameObject: {fileID: 2008717907} +--- !u!1 &2032927210 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} serializedVersion: 4 m_Component: - - 224: {fileID: 740851132} - - 223: {fileID: 740851135} - - 114: {fileID: 740851134} - - 114: {fileID: 740851133} + - 224: {fileID: 2032927211} + - 223: {fileID: 2032927214} + - 114: {fileID: 2032927213} + - 114: {fileID: 2032927212} m_Layer: 5 m_Name: Canvas m_TagString: Untagged @@ -318,17 +4917,18 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &740851132 +--- !u!224 &2032927211 RectTransform: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 740851131} + m_GameObject: {fileID: 2032927210} 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: 1412835668} + - {fileID: 666412329} + - {fileID: 37557109} m_Father: {fileID: 1654745587} m_RootOrder: 1 m_AnchorMin: {x: 0, y: 0} @@ -336,12 +4936,12 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0, y: 0} ---- !u!114 &740851133 +--- !u!114 &2032927212 MonoBehaviour: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 740851131} + m_GameObject: {fileID: 2032927210} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 1301386320, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} @@ -352,12 +4952,12 @@ MonoBehaviour: m_BlockingMask: serializedVersion: 2 m_Bits: 4294967295 ---- !u!114 &740851134 +--- !u!114 &2032927213 MonoBehaviour: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 740851131} + m_GameObject: {fileID: 2032927210} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 1980459831, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} @@ -373,12 +4973,12 @@ MonoBehaviour: m_FallbackScreenDPI: 96 m_DefaultSpriteDPI: 96 m_DynamicPixelsPerUnit: 1 ---- !u!223 &740851135 +--- !u!223 &2032927214 Canvas: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 740851131} + m_GameObject: {fileID: 2032927210} m_Enabled: 1 serializedVersion: 2 m_RenderMode: 0 @@ -389,157 +4989,69 @@ Canvas: m_OverrideSorting: 0 m_OverridePixelPerfect: 0 m_SortingLayerID: 0 - m_SortingOrder: 9001 ---- !u!1 &1402896513 + m_SortingOrder: 0 +--- !u!1 &2076713666 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} serializedVersion: 4 m_Component: - - 224: {fileID: 1402896514} - - 223: {fileID: 1402896517} - - 114: {fileID: 1402896516} + - 224: {fileID: 2076713667} + - 222: {fileID: 2076713670} + - 114: {fileID: 2076713669} + - 114: {fileID: 2076713668} m_Layer: 5 - m_Name: Canvas + m_Name: Photos m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1402896514 +--- !u!224 &2076713667 RectTransform: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1402896513} + m_GameObject: {fileID: 2076713666} 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: - - {fileID: 309713871} - m_Father: {fileID: 0} - m_RootOrder: 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 &1402896516 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1402896513} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!223 &1402896517 -Canvas: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1402896513} - m_Enabled: 1 - serializedVersion: 2 - m_RenderMode: 0 - m_Camera: {fileID: 0} - m_PlaneDistance: 100 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 ---- !u!1 &1412835664 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 4 - m_Component: - - 224: {fileID: 1412835668} - - 222: {fileID: 1412835667} - - 114: {fileID: 1412835666} - - 114: {fileID: 1412835665} - - 114: {fileID: 1412835669} - m_Layer: 5 - m_Name: Button - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1412835665 + - {fileID: 801696179} + - {fileID: 1168732683} + - {fileID: 1361172027} + m_Father: {fileID: 2098255038} + m_RootOrder: 3 + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 128.5, y: -286} + m_SizeDelta: {x: 257, y: 80} + m_Pivot: {x: .5, y: .5} +--- !u!114 &2076713668 MonoBehaviour: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1412835664} + m_GameObject: {fileID: 2076713666} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 1392445389, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Script: {fileID: 1679637790, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} m_Name: m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - 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: .960784316, g: .960784316, b: .960784316, a: 1} - m_PressedColor: {r: .654411793, g: .985699773, b: 1, a: 1} - m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} - m_ColorMultiplier: 1 - m_FadeDuration: .100000001 - 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: 1412835666} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 1654745588} - m_MethodName: LoadNextLevel - 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 &1412835666 + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: 80 + m_PreferredWidth: -1 + m_PreferredHeight: 80 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 +--- !u!114 &2076713669 MonoBehaviour: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1412835664} + m_GameObject: {fileID: 2076713666} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} @@ -553,182 +5065,79 @@ 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: c9526d00e23c94f788b5b0e8833d5941, type: 3} - m_Type: 1 + 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 &1412835667 +--- !u!222 &2076713670 CanvasRenderer: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1412835664} ---- !u!224 &1412835668 -RectTransform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1412835664} - m_LocalRotation: {x: 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: 1487808224} - m_Father: {fileID: 740851132} - m_RootOrder: 0 - m_AnchorMin: {x: 1, y: 0} - m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: -4, y: 4} - m_SizeDelta: {x: 120, y: 40} - m_Pivot: {x: 1, y: 0} ---- !u!114 &1412835669 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1412835664} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c34dc6093a49a481db532b87b45132a4, type: 3} - m_Name: - m_EditorClassIdentifier: - advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: .300000012 - useSendMessage: 0 - sendStateChangeMessages: 0 - sendMessageTarget: {fileID: 0} - requireGestureToFail: {fileID: 0} - friendlyGestures: [] ---- !u!1 &1487808223 + m_GameObject: {fileID: 2076713666} +--- !u!1 &2098255037 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} serializedVersion: 4 m_Component: - - 224: {fileID: 1487808224} - - 222: {fileID: 1487808226} - - 114: {fileID: 1487808225} + - 224: {fileID: 2098255038} + - 114: {fileID: 2098255039} m_Layer: 5 - m_Name: Text + m_Name: Content m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1487808224 +--- !u!224 &2098255038 RectTransform: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1487808223} + m_GameObject: {fileID: 2098255037} m_LocalRotation: {x: 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: 1412835668} + m_Children: + - {fileID: 574950114} + - {fileID: 870787322} + - {fileID: 758236082} + - {fileID: 2076713667} + - {fileID: 1004776690} + - {fileID: 621592926} + - {fileID: 321008078} + - {fileID: 1037999862} + - {fileID: 601448587} + m_Father: {fileID: 606054179} m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} ---- !u!114 &1487808225 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1487808223} - 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: 12 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 10 - m_MaxSize: 40 - m_Alignment: 4 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: NEXT EXAMPLE ---- !u!222 &1487808226 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1487808223} ---- !u!1 &1654745586 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 4 - m_Component: - - 4: {fileID: 1654745587} - - 114: {fileID: 1654745588} - - 114: {fileID: 1654745589} - m_Layer: 0 - m_Name: Examples - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1654745587 -Transform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1654745586} - m_LocalRotation: {x: 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: 174295523} - - {fileID: 740851132} - m_Father: {fileID: 0} - m_RootOrder: 2 ---- !u!114 &1654745588 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1654745586} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5d0145ec13410624f9b2939e5d5a99be, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!114 &1654745589 + m_SizeDelta: {x: 0, y: 734} + m_Pivot: {x: 0, y: 1} +--- !u!114 &2098255039 MonoBehaviour: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1654745586} + m_GameObject: {fileID: 2098255037} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 26a72f9b3b6704180978dbce08cf231e, type: 3} + m_Script: {fileID: 1297475563, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} m_Name: m_EditorClassIdentifier: - Name: UI Layer + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 2 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 diff --git a/Source/Assets/TouchScript/Examples/_misc/Fonts.meta b/Source/Assets/TouchScript/Examples/_misc/Fonts.meta new file mode 100644 index 000000000..1bcb860ad --- /dev/null +++ b/Source/Assets/TouchScript/Examples/_misc/Fonts.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 30b6b9c7cc86046c5b991089c741f63f +folderAsset: yes +timeCreated: 1470733534 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Fonts/LuckiestGuy.ttf b/Source/Assets/TouchScript/Examples/_misc/Fonts/LuckiestGuy.ttf new file mode 100644 index 0000000000000000000000000000000000000000..01b535af2029558af7408f36da67b3602151f8d6 GIT binary patch literal 73728 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

v=CYZB|(d!B~UVQN}oOi>l(nA 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 S7Rltw|KI)|o%(;;{{I_`@C&#A literal 0 HcmV?d00001 diff --git a/Source/Assets/TouchScript/Examples/_misc/Fonts/LuckiestGuy.ttf.meta b/Source/Assets/TouchScript/Examples/_misc/Fonts/LuckiestGuy.ttf.meta new file mode 100644 index 000000000..2e769a68c --- /dev/null +++ b/Source/Assets/TouchScript/Examples/_misc/Fonts/LuckiestGuy.ttf.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: e423173afdece4d3fa49ed8e89391fce +timeCreated: 1470733538 +licenseType: Pro +TrueTypeFontImporter: + serializedVersion: 2 + fontSize: 16 + forceTextureCase: -2 + characterSpacing: 1 + characterPadding: 0 + includeFontData: 1 + use2xBehaviour: 0 + fontNames: [] + fallbackFontReferences: [] + customCharacters: + fontRenderingMode: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs b/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs index b7b61c9b7..52abccb73 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs +++ b/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs @@ -16,7 +16,16 @@ namespace TouchScript.Examples public class Runner : MonoBehaviour { private static Runner instance; - private UILayer layer; + private TouchLayer layer; + + public void LoadLevel(string name) + { +#if UNITY_5_3_OR_NEWER + SceneManager.LoadScene(name); +#else + Application.LoadLevel(name); +#endif + } public void LoadNextLevel() { @@ -27,6 +36,20 @@ public void LoadNextLevel() #endif } + 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); +#else + var newLevel = Application.loadedLevel - 1; + if (newLevel == 0) newLevel = Application.levelCount - 1; + Application.LoadLevel(newLevel); +#endif + } + + private void Awake() { if (instance == null) @@ -35,7 +58,7 @@ private void Awake() DontDestroyOnLoad(gameObject); } - layer = GetComponent(); + layer = GetComponent(); #if UNITY_5_3_OR_NEWER if (SceneManager.GetActiveScene().name == "Examples" && SceneManager.sceneCountInBuildSettings > 1) diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/UI.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/UI.meta new file mode 100644 index 000000000..17718c61f --- /dev/null +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/UI.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 66c01f575ae174ef3b38e9aeb6a2be8f +folderAsset: yes +timeCreated: 1470731059 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/UI/button_blue.png b/Source/Assets/TouchScript/Examples/_misc/Textures/UI/button_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..62280c32424ffdbe36daef6d64cec263647166d9 GIT binary patch literal 22190 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[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 z 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 LNkvXXu0mjfT>YBc literal 0 HcmV?d00001 diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/UI/button_x.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/UI/button_x.png.meta new file mode 100644 index 000000000..5bfffde1a --- /dev/null +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/UI/button_x.png.meta @@ -0,0 +1,56 @@ +fileFormatVersion: 2 +guid: da634550c6a1c4ff38304b1c8566d809 +timeCreated: 1470731060 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 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: 8 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: ui + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/UI/list_bg.png b/Source/Assets/TouchScript/Examples/_misc/Textures/UI/list_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..7edc2b8fd17e18d9d2749c7fd1055955192664f7 GIT binary patch literal 28266 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 literal 0 HcmV?d00001 diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/UI/list_bg.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/UI/list_bg.png.meta new file mode 100644 index 000000000..1d1f2a3f3 --- /dev/null +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/UI/list_bg.png.meta @@ -0,0 +1,56 @@ +fileFormatVersion: 2 +guid: 9162f54c0795b4623b5616fc423eec6a +timeCreated: 1470733131 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 59, y: 126, z: 81, w: 127} + spritePixelsToUnits: 200 + alphaIsTransparency: 1 + textureType: 8 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: ui + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/UI/list_header.png b/Source/Assets/TouchScript/Examples/_misc/Textures/UI/list_header.png new file mode 100644 index 0000000000000000000000000000000000000000..1bae23654f3d5098b8920059633a0f18ef298954 GIT binary patch literal 21923 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�lv7D;NaL1@77M%sC# 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 z z@9g9r22@J6&2wwbT${-gyHE2rmcWz7r!DHj81;z1>ixLEb_-)ri}k#ow`(T3^P&m3 z%Zsb+xXF}cwZyxH_pQ4W`@a=3WS(5Ay)mS^Tl{F^?LJJ1?V;r>S<&@$P4#tEA4YnG zw7@5K)wGnT8%J+a81QUWX)mE9^Oq^tGn=Gx>YUEV!?niB6#2In)8{HhmF7TN~OPQ*Q2Rbr|UuamGNTxhoT@ooKqK(Z|1YX z{5Q!7_x#b=TFqHHjx}`2mbdCE4m`V|BqpSDf$EiVvaCO@af}KYokiv?VJ~R=LCYnX z2KWtwS9(dJe+I<1q<4n4kZE&Mo>E20F&~z>b#dpl5 z0K^wqyA8I}Wxe0t{H%GRri|Wn9fhP;sIH#gz?xPDIquSO3 zmKni11CFgRrJRRO;00Pkh9^jkE%-swsbU_R|6rU(zwvA_@AiDTX<;C4AMQ`l6)M1f zZ08Hh(3CyH$`a->Sa==L032|PXOlmtfle7sAS+bT%zlGnn9Dww&{Mysk8nqHN1P9L zl3@YX%tHWj=r&&hoYut*rsw$0K%(BrK7)!z{&+$bk8z@ff?LtjT04rjUJrahI)i6l z)ilWm)=rll(VUah=XmRMbU;d*@=FsFfy0o)s{%n-*Q1~LOx_F4OFiYW!cra9>qMWk zfjt%NSijZ*GOadAU`vcOZ!0Q>TlF!@{r!qTgXh54_L`>3&) z&_6O-VznLUH#2)%iZs-cRl$>Yd4upwO^ubE($V=1_4kG>J>qcVNO8o@(6uk8l_J|v zOjpT$4sRCsw{?o(iYet*Y(5TVUS0bS&ed#FLpwDjcA8D%0Rt__Os%njI_APk%J_i!KK&h^-7Iq|+*Hja7ymc>Eo zcHg75FbAN6|5EExp%&4R%(p^>CXt8F*3X3JiW76sLKEWBePf8XduYga1rQ}9$^ zbN9@XD9v|+g_4lV-i=!2`cwW7c-uoCTf6nc<<$eOtVV7&LyeN=&ZTI=5%G46UxrfL zp!l0J&UMlsABdv3PLI)kz-Io%IcUOOLn@o`|tfaK8SQb4zi z!sq;oiVLMedDc+Dn<)}4S~)k3PanIr)>)Duqrst*tW)@56t3H2Hs#6qSD3Rcwlnn(Yr&*@Rnou3y~aAmSY9h%U3c=H_G zH!FF*>uECyw86Mh7m~%eeo}HSP zBv%(`JH<~sLo|R9f`;IDY2`oFMN5RB(Q!=e!A@h^rO)BpJVpOcE7#)B^#1=VB3+b( z5X+@VqLP;DiX<^}Ihs2smHVZ+Gf6kiZ6wre9ErK#@0X1tCblBEjbRv*ncL*D`7Wo& z_xJq+et*H|^>}<8of-51x($MvX?Ocm0|Ky0wY63Uc>$JN%?0U-~Q@>u+c|zuYBNBVMU&} zE=VyLz1?5*mj-;xcakX-Va_aiVsPr`iKLr`f`)p4CuHVJ%4WY#rj%8+@lR0#E~|CV zr;Sx{WEfFUVYA|un7v!*Mo*nU)3e^zhj&lG3*2L}Tg9`O3fqv-ddH-3k-oYxTZ3}+ z&-W|Kid&cLSsU{%hV)?)N*s7DefP{azA;YOs^!zKGs(nWUpZ-9dD>I@^W6me-Wgq; z5K&Hx0MId4=$0y&?p!Y9G?KPFuKr5$@!J;g#38GW%7nlHIY(A1P&b6)oqa)8;-r}r zaexR~3}oMNNKg$$V~lfUjZ^q6-1=i7X}7v?!QHvDqkg)&--1v+DO`E+l`wYrY0)D5 zJ$!y_Z~9Rl+UZ7Fd@@%x9bT7KE{`#x;&d1keM*th(t<+okOn6H7H*3mjNG19KmrW$ zZh*B^@Cb0*)M;n_I4&%MIt}?`cN5BOpl7-xWlh!ID^g2lO4& zX3oTGagFmgVs5m#$QUOVwQXF}2xv=hvyJa3_p3F80q(cwby-m_!2 z(&5(f5%c+!I}ThF{Z9}tgB&Ev>b|lbl-V^rs|u-0oUCVzeQUulEk{3I+qi4#T@1D4Jse0o(?Rpn24<4i`S3D3T2qv*d)pO^3eH7r z)|Ap1NX)g>uAq@ZXfZB+HGKUmYeAJxk1!;!sMf$XdXAOD^so0RmY9MVgZhDUu3*b^ z=U(lOcA(yPWG$L_NEl_Tksx-HOm*)VTj`lYAaOf`S^7OzEkBfwtaI2CpBJ3Ekr2m= znNy{Q23YcbIkA#+ZDY7t^Bd$LV8klFloK3KXT|=@Vbhiq2HyRAJ;D1P9WmK_ zFLyNP_R1esc(=hg){b;rrn;Yl!E#8Gksq}?i*4md%EikTEA5{PZHYrisZ9>L zrT#v^2KZxFrH1@C_Zbh=t@I6yzsABtM<9pk5x0q4kq)0r4Pbq$D}75+Ryz23({w1S zfgfVdW0(1X?f-g>kWuraJ& z>R7%R771G_Wei!-8rMwt$IBH|QYDiyAFr%d%v-tWO?KR(o*C%x7NOd?Xm}*Brb3)n z*><%}^&L<=qBH=_b%=k<6aJXE{NVJo){z&zzVdgWZ_`%iHwY&Ri=;J8s{ zi`ygqoKWC?sxU+ePk-Sm#b-L2|B@JjgUJd!E~bVfR3pYiLxLQ>$DB`$Sm3uvvi613 zr<&|4A}GOiIfAbf3cH|pQ zscP>zU8k=%9TxD zV5eWj$$VRpgQsMB=Byp|(gM^G3FrlKHH8$xNa0^+*tll|n)-H1(fs9#F7f)RBStL> z4Fpc7*~ZVnarXq*iv3mKtwejyFf8Bcgcxw~S9Pq_`b&Q+6}6;<#|#p^#=yg1zu?%f zq@FGq(!7NA6@t$@i%gqgh4?OJIq)xr(+`5;Z&`FSI`!_ad}kybW1TEJGcBJeg;l{| zbFl-*5YTq}MryYcg!4QotZywx^Xk2~7q4;W)xJ@em)3ncT!<9XUf~5ptl%~mX zT%>PBp{4a-`iwZEr`W=;linuBZ_g>OyYzktw~5JwH@efZIp=jQm5<*4S{WLv$$k%g zsUw$0z8ArwyPWkpGo#1$_y%`X*`h`ot!6BTTPm>fqd7FsFaRLU{}~6D4)9-xP;hR1 z{c>e$iBsaEf|%?uukftCp^t7)FJ2QRy>R?ILmo&3ImY+b0O<1p3rbquFXtdJ4! zI-%4Q4eAS}QgB()iYkT9Gp%z_cKed`J!)>a?@m>hJhqH;%KVc9B3OB)jBkMH`cJ(s zS@5_HPah0i6E7quDO>jwh?o|AFF5ynwSVtTg5K|Czi3p!htmBXUqXkEX;)5rG#_vm z^^hj^3Cx+lOiYJjD2# zRpnazUa?PUPHC&3gPnsZ!Op{!Va0RCl)z9hLJU#m)$6*SUXZ=cJ|=d66*AyzL1T|j z@Z9HAD+Ylw)8oxr ziZg7I@`c)2^XBpKCr?481#RvE^2*U(zCla_t>E|#qbvX7pCfw{TFD>q zQ{WxrJs%Ub{l}l?9&0?aXYfg$*P^bQ<9bD+gchsYK|g9*`(hO#)($vYB`aO6Y($y8 zKWUzd3D-P8(S7sA@D0uKryJaVJd71{P?N&b7HM>VX-KTSgL`21y}R%)x85FLVpxsP z%EuIQy7{7+*;r7yV^}F0eKRMWk7rb&yS&Nh^r}`mm zf~g_N#{J#A%(S?kOhJ-iOoFE)-qGDaK4SEkvmHu{C!PR&ZM$`lUznlxCV6nrjeqG1 zb=j8k+C!Rq9lTA8Q;!h#5qM}LunQkbBy4-;JHkWj?{#U^T9jX?@2F5I_8D&b-Ha_CP$IMyB7{yasiAm|t8X3Um+}ZQQJZa1`ZEj8?+&~b^HC$B%2TPz>WGYQ zU*ON>JumYPes2CM&rXRs4^z+N6r0#H9Or;{&!+`xY^)Ha?}Xm07Tb5Zr3xB;$NRTU zGgK&1Y<9*w{Z>lcHo_GU(oieeV6SLcVkOoKEj%DjDlF&%o~~%ICyIQ8iYP7puPMs; z25)CpXHI8+oD$9Uv#-s}o!fvu2_u>I9&%!xs39rM>XFg!iTShSe|lY5_PUCJsezAy zK}q#-T&~(gX3BlN8Kb3a8F-+OPKDWjiKg9Hk&Xk2mg1AYD{%(^XH=o@kOGxv>Z2E% z$^1r|yFYLDJ;QZ$itjs7U{3GQiLhrl^p(C{`tDOrZD)%9Y34tPgl7D_oz literal 0 HcmV?d00001 diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/UI/list_header.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/UI/list_header.png.meta new file mode 100644 index 000000000..7d7e181d3 --- /dev/null +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/UI/list_header.png.meta @@ -0,0 +1,56 @@ +fileFormatVersion: 2 +guid: 795edb780ddd9406493b04bb9b8ed002 +timeCreated: 1470731060 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 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: 8 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: ui + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/UI/list_item.png b/Source/Assets/TouchScript/Examples/_misc/Textures/UI/list_item.png new file mode 100644 index 0000000000000000000000000000000000000000..d01705bab4208a103bc6963f68b401c8f01e4f13 GIT binary patch literal 10801 zcmcI~by!s2)<2Ac0)tY*p!ARuGlWvol9Ec-z|bI_Lk|to-H3!mjR;70NP~)$beFU= zyo36^*Y`g6eSUxa<~eiboVC|yuh?ttz0RH!uBt416aOwg78ce`c{!=4SXkI-%ylB} zbdp(bcd~$S3knLt zxOiYZJe(K~PG=807X*^i&Y9tNC;#*#W#(++WaZ#uWp77!)i1)>-ql3}0=W|Oug`Bi zU98OiEy>RLk69Q4VOK3MZYUS*zroCqR{sa=s^$NLnVS5|DhF35n_o7Wn!wC#%xul< zT%0jD?*A$dWrcC*FDvfzV$}MtE&qvpWN%~dq~?GyF}u?27vwL}e{%nl zqw{Y$-1i0kmh)H3Ur19EA!k=(YcmsPYO(ES*TkE`tt+ z5ARNXWIJ29xph1=@ftbOp1^%CnVB4m6!(1}gvQzl3o=!}W!(EjI(Ks?G8Wl{3rEh7 z#1psB-J-t+ck|g=&6*q=8x!<=WpPsUu6N<|A}ub-Rm)XNV`L||Mu?XI^YKk1HoRbf zFk~f=ViObn?<1AKe@5W7e7xzk&ib%v-Xo1@($Hw)-#q@efFwtoGlxz@KzsMm7hX4+ zjEG7o1$Ga&Pc_aocmCJya+gf0^OctP}Y zkLZ26*sD^ML>*jw=CY%-zKbZAjC#sV-nNrIGe%9}k3lQ)Sdt3?yRSf6B}Re{ty8pf zRnrH=gb<_4kS4Kp!tI`;m68ZTJF^z)oo--JOe_wfJ-ATIKzqzdUf+FZNF+slO94wn zn^RgGC}lK-CthddI~F5J4mIR6prD)JZaHI(KIUuvd7DdHLoAT%vL7W4ruCW0J=a?z z1BQdxmJO<0XucU)=Q9m8L=+OzDISplqvkZGPVV1@q&y$0rqI+czf?|m!6$|3UmUm; zhXTVE`hqw%)7Xkt+e&W6&o-h^=R((hlA^_AQl~jOQl-40p1bex)KuS9eLis}DycAz z^%i+6=I9y{71LW~!unqztn5r0%=>ALuc4S#*{U>&Mm zGYabr#dW}T+(6UH~cyLP{$4YS?Xyt3Epoh`vwqtiMPQn0Zl)Pmz9+ zOgy7=<|Mn$UJ*~CrCU3sR<|3-^*O(M=gEgQ&u9UO55~DqA_e)1ug1Emj!2FZs%^lh z4#*q6r%zPG7*20Y5iTcf;;!z|MO}9uQ{ptgXXkMz?{;m~4MLhTpqne0YeRU%)8?s< zDI8%&dJebHb$6ez>w15~gmhS{v1 z9pB#x4isP%6RI)X9(wmHADT8uX6T~StI~_1_bFTU@tq1IzJU$Rm5X7}K>YMu43S@u zXUP+K(=L>ho9BqI1cn>jBzX~!P<#`d;m?SaGdXN{`)k@hZ{KRsAoz^jcsDWakW{Qf z7ialWaSbYj1fQFfBC_tp{Z7hS2+PuReEl=J`Y?HN)lHL@0 zczn0@jRDE9!R~ftggdSA3~P44z7e-|n;Nm9x5F-RqZ@6=8^XtR;LtZ<2Nk9YhF;;$ zvKOKSF@VQaLf$=tto?-o<9H5SGHADNNl@YSfW-=z$Pn=R??{GaMZRn8TP`og^O`?~R?sG)G$bGX{mb@0(`JAb_Vf|M_xXC++l1-4%**geM;ZV3Xr zPdO}Fh|NC+mwwbXD7vr;c2%)&GMB2-E#`w@_w=_npb;|kx)8g|kA*&$hMQgN5i${^ z#B%yhs3gOKw(>A_;Ejffj#_y;@tfp1#@|LW-g5}4BEt?-?+l`u@h>y)Eskbn@Di<2K2si}tvB5FjN z4O_Pw4z)yDZ@Z6|L*B7Q$n74KZ@s7IIgU`Q- z^rA6+{YsjlVn@&N?_LwF5g;ups8D}zE0x9e3Hs)#*K>~b6)xFnu$c6hzTvI2L5+Sm z4boJb$rAZ zzWx{mbOf~_kE=AN+v~zcK7@PvFx>!c&K??U25z}2*^AHWj!9Y^Dq- z-Q={*F~o0VTPhIV;EDeLcgB;!!U@zxcpJ}A%NFQ%^sMWLAOpISW%NhPBooUiLQI0n$HlzR@&Wr~>y>w^Pg&Tmnncl8Df~)rDJ_Mc0 z9|n^X9mraOACFS8%NJ5n%e@0kEh{{i+tefj~NROU~3Ae1X zEJ2$fd>8w@`Y2bx6G|V?{oFEh?+qozaO;KY7~U@3s5vTt#=kDaC@)Tl{RWKF zd#P`X=IT(7|7S*kps0XE4(a}cJ3@bx0-*}>CRxCBqP zy{edDH~9GhnR56MNys^YOTqb}q3nt1g2lTKCY(?h6>WuHy)E(0x#onlunKL2aPsNG zRr!!3haw#16NIthmh9=IyM9WYq`)a+S~Tk&wzwntsx0zBl+#`_=fM0xmDr>rNByx` zZhZ8vd>u}Q&o*Hb|D80H*+|&(o+gEO!M8C*A~gu6aA20l8jh_md`z5&d_Tn%VN(~L znu;3hUHw|HF~SJfIH)M<)FsjEw+Xn&7`8q;mq*r;G!O0NY!&0 z;8KjZcymjjD~V+DQa@nc0?evfPOeRS!YrjnZr#zcc4jbVvJ}QFn1v^TH72K03A2E7 zoTpyK65`Y^-TWYM{UUU42FMJrlW`j=3v`XT{^|`1f+hlL-!MCnB$}^>ow{@%Ig4_G zdad;gcaFQv&*LxJ@tw|&vx|9=cIN(ZWJ(NPZPdgd4xrLW)zBzs0KUoHSS5-bXDr-AMLx#!!T$4$Vyt82DzxdZI43k`Ig z)c2k}K95WzOuQ~~>?gIxS*po?yb#BJ9W#@8FwCs8s8eS$b2-jmYVRxnBa=9IS5ox5 zM$Sb&KRqD*B(QjHII0j$)h2;>NuSKFzZb_cHMfY)h-d#b-w%djtw#{KCJZb1v_u;n zE&zL3zDW_J?I-1N)=!3ue@}kKEI!}u+!IWY(<^rV?w*$HmcuPl^iXFJ1!lmOlCajJ zx)yA60p_kR2U0aYeab&rcIbLBEtu9j(5n;1v~{@~$aU%-jP+nY;_&}M@ld&yp7_Wcp)PYT!K?QmqNC5mJ zY;pmocTMta&(-)FVX}%=8^MVWX82??_pG9$(-G0`08P4m2|POFBMPFuAU_%|kYAlN z+M}O|P)v?c6d7Rkwtp^EN5nd{FPrer(fz8-tLbl_1ts)0`mhmlu}!2ef(|vN0o!G6 z`5nd5-`#Y3M1!20G50B0ON;>Xj|ndw7SyVEze|fi9aqv`+==11!Dn#$@VJNXu6TjM zz^h(jSMU8%rs39o=C-I*_4U=hl??I^`Ihtm%#bJnwPn%$Z}R$Q$~4`(E?V!)d2|I^ zl-|doZSPp%L>s@e(pd-yroIi`I`eGq+0qRwxTAH{Szysj8T7?|>~+nm*j|DjG zEXrqTLsphw%DdeDcs|g6^${$x{bUYLS*1z)&ME$o6zJ{HmwJQ!CBJM^X%12zWZDY< z4dETl)eR=C@wypfVZrv=m_eX}X+YXn2i{lbXco~>Na`)XPVi7G~h z85A6k*GE4}JVNRY(Dq+{SgG~KfsFII(`%I+eaG2uX>gHk_2=McQ0=?Zu7c9oJp#*+ zrBhes7nkaN^IFpD&P>ql-8b@yTSQq8P1FxycUClB~4mALC zb&WfOuFf8XuKG%0kC#p^Qa^F1Fgi*0@hp8-Rs8=$zQ9J*jukdMK2-+s5VraqtA@vc%M63v27T&9*-)aoJ%D z+SsS8sbO~MaF=T`KLbSb9LpbklHT$jX!m-U7pdtO-qb>jE^|3m5+;~(TwH$v!f?9YiYq|CM)-6&g0~j*NO4KLMS}?ahYb|BQu}nq0gS#b157DDxg?*QBRDOi z>)+m89bH+P7mpTb<0lj{4^|5gID;v2n5;GLJhw z@pCm-`qhK(I)x?~dFSi%kF#yu6hb z6J98L6ODY3>9R?WD{REFP_WEm{|Zh3NP*5PY;VA6rU zQ6^M_pf6Yz3NzLWLsyqSPf67S+N>n3pzJX2nEb@?#!nTl3_>u&^-~>mn%inTMjLH> zBqZ)lL@1#&ldD78$r4qeT=&F{gBd|hyNvvN021{3msvw$wx5LYbHPPV`E)=Jdd_%u z(uX$gjX}6b03O^%IuemK?A7UfF*g$G?FH+nWBSh zfkYpkKAznT=ull!5|h9@e=r$cC%+hrHwz&2{N52`)}Fj?A=oThx5B~iiIF?Rn>9({ z94A>Q+TMjv3!>vcbE|oG2|*76i{#KYD1dY?Nb7pAbO?O4zgI0HjuaE9RI5}{pCqm3 zhRgPKdT{!@Ebjq8GEHrG9#CD~SK1uH4(74P;%`$fVzN;{n|;M)1{qSW>B}Ut$9p~B zmKjpIgK?>1P_XM9q_?4@Jf2U>pNdVm){VM;MPa;mEkHNlh|hEiJg9tbR7rU0ohluW zSN9wXFV#_cwxvd76tNmQv~2teAgMm@LV|YuoV8j70xWXEl4VPJ!kcnQ(Z;b!#F(19 z|2l~DJwf#I?$Iq0ywOqOffYRMBd6JJeCsE5Hne-Mo(kn@X?Kb8`SWD^as>I?YfZ1U1O3tD5;lg(=F##wrTk^H%6uz3GihX69Pcmg4_ZjH0 z*JUlA9DcCz%-WsPNd3;g#jl*};Q=RHD_DndV8*YR#eyECom%Li27N*UC^;bxTQE8W<9%9P)Bw17ZdlCprU^+@rMLA&j1nw}%is2o z!#E^Pq|U6R-QwXF&S#QT$9KpOV9dBfjTUYKINorixxmZM;(fm_A3EzP1IhhS2lhi7 zlIA)zRZ(V5OHyh)31!lBj%yx?sH_vF)C*whLA$BvPP~KCrL-D;r)(3=_>qw;aqB=t zauO(fl7!GKj-)~r*Vt^ENuj^Jv5=uapEB_s)r<@4s!E+u9h=8fSQ6h zfUhD&2JiRg)QYq?;9ErW&+uQn#EP7lF22I=GAUl|dP?PhvGKHFLgOq~KnPa_CYIH_ ztP;6?@6^FDxAiNQFMjW+eIW(d!erIB8Fx%9~w`mitkBMWbDVitZ)faaM{QnRve z@r`Gv0>BPdBToEGDX3L3t`5Sj=zdH>lC%)BypE@vPP6>k&m2}=XdHF2A*0k?i{(|; z*f+Ph^M@}-s*G~K@VSpDBjZ}t99V|u#PHOKGJRj7e$8eT{ ze^|@kr+ya&!G4~IN0u@=3sO{vg_IrSEZ!~0!ByC{uI|d!)y3W8>0DnJ7$Xl9#&}MS z4wj;AF}AbFBU5cE$XSz9ZO8E=J;v4W_0i&y(*r(ikmk2^HG_wWurj=q;kq}hjs=^N z{5OU*2>~3e*$7R!qpvCIgz1EA8ky@XMiMIl1qH9>9f@!T;ro>)6Q( zHt&^tXt*9G^`Oj3KI<>tb?j|U*D>@5)sZcwm~@Yi0y*@>MiLi*DnCp5U&kfm3v{#f zyc!%|k!u=lPYVXxad0nmN~%rR3o+_XTaW*!BreLbnv$k3zX3v8K+Fm6>VFIvqte%d zptphAP)M>uBC*%Z-Xh7xaJ{)OM~X?w*9;YbX3n0Jl*DgLMcf;NEoNY7mNUY`hY^qR zJ?FYoM^jS2$o$&Jh7t8urW-Mt?1qZNg67(A7gM$t>wA4Oa!wCo;*dL%67o19!Hn$p zWxZzP!ft}ItG|w}yeH4DUzn41-y`}4_d9A6#MMKoX(L)6JYIA3oRs{Yx~GffjIT@V zkBw)#7;nbSnS#R|h^$CbNc>psg64R_t^Li?%$$8m_8AB6;}Y*BwUTnD2a}+!i zD>qJ70s0%$?}&-64xPNq8(7MvewnsNkPa#y$`o09SY;BeAwsTLF zvVaA()(!XP2Cqr_btI?Lq>93;`N(5Y;8LOMZx#U^Jl#$@?p@8wyopZj!EZ>HOQU;& zBC7j>BYihaEHsE~x~pje7hQ)c&l_{*R5mVA%hTle+G+@aa{pkSsq! zo*k4N`#=pns9NW?MOh08{XD$vNP81$T{R6S zT8qJ@O~E}XAH%hxu?`fhHibCe^E;O!G_Myeddj9*YbGOQLC^bisOZp3Y$Iap@9gV? zZ1s(V;LG(lpphT-%WBg2)OOy|khzk~kH#uJj|?Qsr+%M$85R*B@#N5UT~oX%T*Yhn zQCKfufKmNSON3VOaplag`-AT_8;?~C+=uEjJha(URR+teLK+mcE&UA`Ug22b>!>>V zI2LdCw;P_ESr&&iWsMC?Ly)6*<-au-@|SVKaU4 z>S%^Lo%Ap(Fia5Fpy~B-5p5B1DPjF5g+vPSyZ04Rwcn#q)EOpv2CHWpS{H*BPoG## zj#<=tZ>r(OiMLI4J=*o=h-@a7Q7SeK6hny zw)ZAqKEAxUQKp{+sxkJ2>e)2sI2N}B`A3XKz+OERSEF|&# z7aw%l4{LirkPm0=1)Xp~)7L4l6)IosY56%EKC*#8%V1y`b3{;<>g^Ajq4ax;g<^Bv zGaL5l-{^ckI+ki=pGSg5`fJ9EX=iwL>+8SnP>b?~Z~GD)-2#=yl_YfLE#{J-%fdXP zl}9Lf=@Yuq+8AMVdeYf>eIdnCiBIDhL4Vwxq-5?Mx@@2)27&_C^?Si-E(KMfwk@Dk_XWWXT2-AS- zCs+L}v_6M_6{~*BY}8jeyDFKVoN+Da;Y#2#)*gK%}9UntH*{oFXi_c>&VLqSageU^>0zdxR z)(LCUCk=~E5AH5vFE5w&M%*!OXO^*WmSBdK*wu#R5sn2}LgMhH+lB_N)yx73U`tH0 zmIL}7pPGxd3P<%*Pt25*&`qBgQjZ@PIo5TN#z8i?0I_kA)YQh z!*+hJ@2Ng*Mm3Atv0}4ld3+oG;WwR|AJ$$=xE(*$sbA$u?yIVP2kztW?BlOW4aL&L zO;%BB@3L|DyzEKDYA?-2*wUgZK(l%q&wc-!n9ed~UN~2u>i#!B1UXS}Qt0dfpMTN4 zXM6JHOuxK92av(q(%GRldae~&n&9Gsd{Ef1gP0(5N^gc@bO0su=`ZpyFW2w+DGjxs z;To@l{WByjAN{H*#evruRHx5U6&@FoSLy$Ns!bLY_jn}Rp9wdhhfH*1p`BfNe;7}Q z<+`7hc+PfmQe+UOB-aowQRp@W?7q`GZv%6$puO_XN#30Qb|qv`2CK$te;+oJptQ;X zD=b{eUK`>ZR%o(OL`>k#JejIl3t09WV^W~1qyJsY(g9c)#6<+FPCUS~r$#QfOQNDm zUKn%xtc_PubULO?RosuuNUb>YKh0IBY+Ua?N;gNk(8At4XsF8!`F!chodJ| zS@dYZ;+ng5n{Q)depk-{Bu%|kd=YA1Kl%CjC&$NiPosNZYZh)gR1~6SCk#({>!Gs(^Yt$xVK~~iiX-wG&T8;*BxvCUS3{5lC(AWX50_FJ_6tTlma+jM=YExqjeZU;F89aO*KGcDrb>qu*e&9@ z|7o(`>u{jXT?M<=X|Y>`YF}3Pjc)OYN%`$xJ}2@IC(c2NcpnW?)6g^=CY5?G7GAW8 z;6(ZlP92?6B<}QWZrY~XT?qVo=LGX8VzdFY6rODKn|{f}<+)mr;=8_Xcqzm@tu!f4 zEAHR*^Zu<1Fu~U&fg8^pJPB_pFK{#m5^Qg?e0ln>Fr1Nd`|0jz>h(l^?sVhXZclL_mq60jdIU}+i%6*9$xCv(uHTPtVNDCTQUYYm)2>5~OTI#F{@dzii>z%t1Fdk8=(DBiY_?RoIiUE;8O zr%Yxknvpfjt|+#WZ&jFGsw*aR70}Xlm6s*L>paQ%kE*|O;s0^=w_@48WQdVJYbT}a Rxq69HURqhIMA9hWe*j_vRW1Mk literal 0 HcmV?d00001 diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/UI/list_item.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/UI/list_item.png.meta new file mode 100644 index 000000000..8048ec0fa --- /dev/null +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/UI/list_item.png.meta @@ -0,0 +1,56 @@ +fileFormatVersion: 2 +guid: b8fce26041bc947319fee43a8ec9bb5d +timeCreated: 1470731060 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 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: 8 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: ui + userData: + assetBundleName: + assetBundleVariant: From eac8f6232d1a78cbd0822a001371e8594c557d2f Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 9 Aug 2016 18:11:50 +0300 Subject: [PATCH 086/211] Got rid of UIGesture. --- .../Scripts/Gestures/UI/UIGesture.cs | 214 ------------------ .../Scripts/Gestures/UI/UIGesture.cs.meta | 12 - 2 files changed, 226 deletions(-) delete mode 100644 Source/Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs delete mode 100644 Source/Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs deleted file mode 100644 index 93343b60e..000000000 --- a/Source/Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs +++ /dev/null @@ -1,214 +0,0 @@ -/* - * @author Valentin Simonov / http://va.lent.in/ - */ - -using System.Collections.Generic; -using TouchScript.Utils; -using TouchScript.Pointers; -using UnityEngine; -using UnityEngine.EventSystems; - -namespace TouchScript.Gestures.UI -{ - ///

- /// Gesture which receives pointer input from TouchScript and routes it to Unity UI components on the same GameObject. - /// Mostly needed for UI buttons to work with . - /// - [AddComponentMenu("TouchScript/Gestures/UI Gesture")] - [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Gestures_UI_UIGesture.htm")] - public class UIGesture : Gesture - { - #region Protected variables - - /// - /// Pointer id -> pointer data. - /// - protected Dictionary pointerData = new Dictionary(); - - #endregion - - #region Gesture callbacks - - /// - public override bool CanPreventGesture(Gesture gesture) - { - if (Delegate == null) return false; - return !Delegate.ShouldRecognizeSimultaneously(this, gesture); - } - - /// - public override bool CanBePreventedByGesture(Gesture gesture) - { - if (Delegate == null) return false; - return !Delegate.ShouldRecognizeSimultaneously(this, gesture); - } - - /// - protected override void pointersPressed(IList pointers) - { - base.pointersPressed(pointers); - - if (NumPointers == pointers.Count) setState(GestureState.Began); - - for (var i = 0; i < pointers.Count; i++) - { - var pointer = pointers[i]; - var data = getPointerData(pointer); - ExecuteEvents.Execute(gameObject, data.Data, ExecuteEvents.pointerEnterHandler); - ExecuteEvents.Execute(gameObject, data.Data, ExecuteEvents.pointerDownHandler); - } - } - - /// - protected override void pointersUpdated(IList pointers) - { - base.pointersUpdated(pointers); - - for (var i = 0; i < pointers.Count; i++) - { - var pointer = pointers[i]; - var data = getPointerData(pointer); - if (PointerUtils.IsPointerOnTarget(pointer, cachedTransform)) - { - if (!data.OnTarget) - { - data.OnTarget = true; - ExecuteEvents.Execute(gameObject, data.Data, ExecuteEvents.pointerEnterHandler); - } - } - else - { - if (data.OnTarget) - { - data.OnTarget = false; - ExecuteEvents.Execute(gameObject, data.Data, ExecuteEvents.pointerExitHandler); - } - } - setPointerData(pointer, data); - } - } - - /// - protected override void pointersReleased(IList pointers) - { - base.pointersReleased(pointers); - - PointerData onTarget = new PointerData(); - for (var i = 0; i < pointers.Count; i++) - { - var pointer = pointers[i]; - var data = getPointerData(pointer); - ExecuteEvents.Execute(gameObject, data.Data, ExecuteEvents.pointerUpHandler); - if (data.OnTarget) onTarget = data; - removePointerData(pointer); - } - - // One of the pointers was released ontop of the target - if (onTarget.OnTarget) ExecuteEvents.Execute(gameObject, onTarget.Data, ExecuteEvents.pointerClickHandler); - - if (activePointers.Count == 0) setState(GestureState.Ended); - } - - /// - protected override void pointersCancelled(IList pointers) - { - base.pointersCancelled(pointers); - - for (var i = 0; i < pointers.Count; i++) - { - var pointer = pointers[i]; - var data = getPointerData(pointer); - ExecuteEvents.Execute(gameObject, data.Data, ExecuteEvents.pointerUpHandler); - removePointerData(pointer); - } - - if (activePointers.Count == 0) setState(GestureState.Ended); - } - - #endregion - - #region Protected methods - - /// - /// Gets or creates pointer data for pointer. - /// - /// The pointer. - /// Pointer data. - protected virtual PointerData getPointerData(Pointer pointer) - { - PointerData data; - if (!pointerData.TryGetValue(pointer.Id, out data)) - { - var raycast = pointer.GetPressData().RaycastResult; - data = new PointerData - { - OnTarget = true, - Data = new PointerEventData(EventSystem.current) - { - pointerId = pointer.Id, - pointerEnter = gameObject, - pointerPress = gameObject, - eligibleForClick = true, - delta = Vector2.zero, - dragging = false, - useDragThreshold = true, - position = pointer.Position, - pressPosition = pointer.Position, - pointerPressRaycast = raycast, - pointerCurrentRaycast = raycast - } - }; - pointerData.Add(pointer.Id, data); - } - return data; - } - - /// - /// Sets pointer data for pointer. - /// - /// The pointer. - /// The data. - protected virtual void setPointerData(Pointer pointer, PointerData data) - { - if (pointerData.ContainsKey(pointer.Id)) pointerData[pointer.Id] = data; - } - - /// - /// Removes pointer data for pointer. - /// - /// The pointer. - protected virtual void removePointerData(Pointer pointer) - { - pointerData.Remove(pointer.Id); - } - - #endregion - - /// - /// Pointer data value object. - /// - protected struct PointerData - { - /// - /// Is the object over the target it first hit? - /// - public bool OnTarget; - - /// - /// Pointer data for UI. - /// - public PointerEventData Data; - - /// - /// Initializes a new instance of the struct. - /// - /// if set to true pointer is on target. - /// The data. - public PointerData(bool onTarget = false, PointerEventData data = null) - { - OnTarget = onTarget; - Data = data; - } - } - } -} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs.meta b/Source/Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs.meta deleted file mode 100644 index 068f87982..000000000 --- a/Source/Assets/TouchScript/Scripts/Gestures/UI/UIGesture.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: c34dc6093a49a481db532b87b45132a4 -timeCreated: 1447582131 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: From 064a94f42edaf74ff031f3661ba4f840cbc2f9a3 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 9 Aug 2016 18:20:55 +0300 Subject: [PATCH 087/211] Fixed WorldSpace/CameraSpace UI and Photos example. --- ...ILayerEditor.cs => UICameraLayerEditor.cs} | 4 +- ...or.cs.meta => UICameraLayerEditor.cs.meta} | 0 .../TouchScript/Examples/Photos/Photos.unity | 376 +++--------------- .../Assets/TouchScript/Scripts/Hit/HitData.cs | 27 +- .../TouchScript/Scripts/Hit/RaycastHitUI.cs | 26 ++ .../Scripts/Hit/RaycastHitUI.cs.meta | 12 + .../TouchScript/Scripts/Layers/Base.meta | 9 + .../Scripts/Layers/Base/UILayerBase.cs | 182 +++++++++ .../Scripts/Layers/Base/UILayerBase.cs.meta | 12 + .../Scripts/Layers/ProjectionParams.cs | 23 +- .../Scripts/Layers/UICameraLayer.cs | 62 +++ ...{UILayer.cs.meta => UICameraLayer.cs.meta} | 0 .../TouchScript/Scripts/Layers/UILayer.cs | 154 ------- .../Scripts/Layers/UIOverlayLayer.cs | 146 +------ 14 files changed, 386 insertions(+), 647 deletions(-) rename Source/Assets/TouchScript/Editor/Layers/{UILayerEditor.cs => UICameraLayerEditor.cs} (72%) rename Source/Assets/TouchScript/Editor/Layers/{UILayerEditor.cs.meta => UICameraLayerEditor.cs.meta} (100%) create mode 100644 Source/Assets/TouchScript/Scripts/Hit/RaycastHitUI.cs create mode 100644 Source/Assets/TouchScript/Scripts/Hit/RaycastHitUI.cs.meta create mode 100644 Source/Assets/TouchScript/Scripts/Layers/Base.meta create mode 100644 Source/Assets/TouchScript/Scripts/Layers/Base/UILayerBase.cs create mode 100644 Source/Assets/TouchScript/Scripts/Layers/Base/UILayerBase.cs.meta create mode 100644 Source/Assets/TouchScript/Scripts/Layers/UICameraLayer.cs rename Source/Assets/TouchScript/Scripts/Layers/{UILayer.cs.meta => UICameraLayer.cs.meta} (100%) delete mode 100644 Source/Assets/TouchScript/Scripts/Layers/UILayer.cs diff --git a/Source/Assets/TouchScript/Editor/Layers/UILayerEditor.cs b/Source/Assets/TouchScript/Editor/Layers/UICameraLayerEditor.cs similarity index 72% rename from Source/Assets/TouchScript/Editor/Layers/UILayerEditor.cs rename to Source/Assets/TouchScript/Editor/Layers/UICameraLayerEditor.cs index 0fc7f5f0f..674c385b8 100644 --- a/Source/Assets/TouchScript/Editor/Layers/UILayerEditor.cs +++ b/Source/Assets/TouchScript/Editor/Layers/UICameraLayerEditor.cs @@ -7,8 +7,8 @@ namespace TouchScript.Editor.Layers { - [CustomEditor(typeof (UILayer))] - internal sealed class UILayerEditor : UnityEditor.Editor + [CustomEditor(typeof (UICameraLayer))] + internal sealed class UICameraLayerEditor : UnityEditor.Editor { private void OnEnable() {} diff --git a/Source/Assets/TouchScript/Editor/Layers/UILayerEditor.cs.meta b/Source/Assets/TouchScript/Editor/Layers/UICameraLayerEditor.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Editor/Layers/UILayerEditor.cs.meta rename to Source/Assets/TouchScript/Editor/Layers/UICameraLayerEditor.cs.meta diff --git a/Source/Assets/TouchScript/Examples/Photos/Photos.unity b/Source/Assets/TouchScript/Examples/Photos/Photos.unity index f15c35c93..fc71df373 100644 --- a/Source/Assets/TouchScript/Examples/Photos/Photos.unity +++ b/Source/Assets/TouchScript/Examples/Photos/Photos.unity @@ -192,13 +192,10 @@ MonoBehaviour: m_GameObject: {fileID: 62216951} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4c21776f7e73345948c045618b3fad6f, type: 3} + m_Script: {fileID: 11500000, guid: 26a72f9b3b6704180978dbce08cf231e, type: 3} m_Name: m_EditorClassIdentifier: - Name: Main Camera - layerMask: - serializedVersion: 2 - m_Bits: 4294967295 + Name: UI Camera Layer --- !u!81 &62216954 AudioListener: m_ObjectHideFlags: 0 @@ -265,7 +262,6 @@ GameObject: - 222: {fileID: 94606781} - 114: {fileID: 94606780} - 114: {fileID: 94606779} - - 114: {fileID: 94606782} m_Layer: 0 m_Name: Add Button m_TagString: Untagged @@ -312,7 +308,7 @@ MonoBehaviour: m_Transition: 1 m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: .960784316, g: .960784316, b: .960784316, a: 1} + m_HighlightedColor: {r: 0, g: 1, b: 1, a: 1} m_PressedColor: {r: 0, g: 1, b: .00689649582, a: 1} m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} m_ColorMultiplier: 1 @@ -377,28 +373,6 @@ CanvasRenderer: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 94606777} ---- !u!114 &94606782 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 94606777} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c34dc6093a49a481db532b87b45132a4, type: 3} - m_Name: - m_EditorClassIdentifier: - debugMode: 0 - advancedProps: 0 - minPointers: 0 - maxPointers: 0 - combinePointers: 0 - combinePointersInterval: .300000012 - useSendMessage: 0 - sendStateChangeMessages: 0 - sendMessageTarget: {fileID: 0} - requireGestureToFail: {fileID: 0} - friendlyGestures: [] --- !u!1 &101996206 GameObject: m_ObjectHideFlags: 0 @@ -1261,46 +1235,6 @@ CanvasRenderer: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 346878480} ---- !u!1 &366022211 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 4 - m_Component: - - 4: {fileID: 366022213} - - 114: {fileID: 366022212} - m_Layer: 0 - m_Name: TouchScript UI Layer - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &366022212 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 366022211} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 26a72f9b3b6704180978dbce08cf231e, type: 3} - m_Name: - m_EditorClassIdentifier: - Name: UI Layer ---- !u!4 &366022213 -Transform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 366022211} - m_LocalRotation: {x: 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 --- !u!1 &411870814 GameObject: m_ObjectHideFlags: 0 @@ -1312,7 +1246,6 @@ GameObject: - 222: {fileID: 411870818} - 114: {fileID: 411870817} - 114: {fileID: 411870816} - - 114: {fileID: 411870815} m_Layer: 5 m_Name: Button m_TagString: Untagged @@ -1320,28 +1253,6 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &411870815 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 411870814} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c34dc6093a49a481db532b87b45132a4, type: 3} - m_Name: - m_EditorClassIdentifier: - debugMode: 0 - advancedProps: 0 - minPointers: 0 - maxPointers: 0 - combinePointers: 0 - combinePointersInterval: .300000012 - useSendMessage: 0 - sendStateChangeMessages: 0 - sendMessageTarget: {fileID: 0} - requireGestureToFail: {fileID: 0} - friendlyGestures: [] --- !u!114 &411870816 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1354,7 +1265,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Navigation: - m_Mode: 3 + m_Mode: 0 m_SelectOnUp: {fileID: 0} m_SelectOnDown: {fileID: 0} m_SelectOnLeft: {fileID: 0} @@ -1362,7 +1273,7 @@ MonoBehaviour: m_Transition: 1 m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: .960784316, g: .960784316, b: .960784316, a: 1} + m_HighlightedColor: {r: 1, g: 1, b: 0, a: 1} m_PressedColor: {r: 1, g: 0, b: 0, a: 1} m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} m_ColorMultiplier: 1 @@ -1476,7 +1387,7 @@ RectTransform: - {fileID: 660229293} - {fileID: 1414219394} m_Father: {fileID: 0} - m_RootOrder: 5 + m_RootOrder: 4 m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} @@ -1919,14 +1830,34 @@ Prefab: - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: layers.Array.data[0] value: - objectReference: {fileID: 366022212} + objectReference: {fileID: 543251038} - 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: 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: 4ad2b146e2cb148fdad573d18694ff59, type: 3} + m_Name: + m_EditorClassIdentifier: + Name: UI Overlay Layer --- !u!1 &551049734 GameObject: m_ObjectHideFlags: 0 @@ -2332,6 +2263,7 @@ GameObject: m_Component: - 4: {fileID: 651643064} - 114: {fileID: 651643063} + - 114: {fileID: 651643061} m_Layer: 0 m_Name: EventSystem m_TagString: Untagged @@ -2339,6 +2271,23 @@ 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: .5 --- !u!114 &651643063 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2543,7 +2492,6 @@ GameObject: - 222: {fileID: 701351983} - 114: {fileID: 701351982} - 114: {fileID: 701351981} - - 114: {fileID: 701351980} m_Layer: 5 m_Name: Button m_TagString: Untagged @@ -2570,28 +2518,6 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: .5, y: .5} ---- !u!114 &701351980 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 701351978} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c34dc6093a49a481db532b87b45132a4, type: 3} - m_Name: - m_EditorClassIdentifier: - debugMode: 0 - advancedProps: 0 - minPointers: 0 - maxPointers: 0 - combinePointers: 0 - combinePointersInterval: .300000012 - useSendMessage: 0 - sendStateChangeMessages: 0 - sendMessageTarget: {fileID: 0} - requireGestureToFail: {fileID: 0} - friendlyGestures: [] --- !u!114 &701351981 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2604,7 +2530,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Navigation: - m_Mode: 3 + m_Mode: 0 m_SelectOnUp: {fileID: 0} m_SelectOnDown: {fileID: 0} m_SelectOnLeft: {fileID: 0} @@ -2612,7 +2538,7 @@ MonoBehaviour: m_Transition: 1 m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: .960784316, g: .960784316, b: .960784316, a: 1} + m_HighlightedColor: {r: 1, g: 1, b: 0, a: 1} m_PressedColor: {r: 0, g: 1, b: 1, a: 1} m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} m_ColorMultiplier: 1 @@ -3105,7 +3031,6 @@ GameObject: - 222: {fileID: 994844647} - 114: {fileID: 994844646} - 114: {fileID: 994844645} - - 114: {fileID: 994844644} m_Layer: 0 m_Name: Close m_TagString: Untagged @@ -3130,28 +3055,6 @@ RectTransform: m_AnchoredPosition: {x: 18, y: -18} m_SizeDelta: {x: 80, y: 80} m_Pivot: {x: .5, y: .5} ---- !u!114 &994844644 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 994844642} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c34dc6093a49a481db532b87b45132a4, type: 3} - m_Name: - m_EditorClassIdentifier: - debugMode: 0 - advancedProps: 0 - minPointers: 0 - maxPointers: 0 - combinePointers: 0 - combinePointersInterval: .300000012 - useSendMessage: 0 - sendStateChangeMessages: 0 - sendMessageTarget: {fileID: 0} - requireGestureToFail: {fileID: 0} - friendlyGestures: [] --- !u!114 &994844645 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3164,7 +3067,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Navigation: - m_Mode: 3 + m_Mode: 0 m_SelectOnUp: {fileID: 0} m_SelectOnDown: {fileID: 0} m_SelectOnLeft: {fileID: 0} @@ -3172,7 +3075,7 @@ MonoBehaviour: m_Transition: 1 m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: .960784316, g: .960784316, b: .960784316, a: 1} + m_HighlightedColor: {r: 1, g: .669117689, b: .669117689, a: 1} m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} m_ColorMultiplier: 1 @@ -3459,7 +3362,6 @@ GameObject: - 222: {fileID: 1101956167} - 114: {fileID: 1101956166} - 114: {fileID: 1101956165} - - 114: {fileID: 1101956164} m_Layer: 5 m_Name: Button m_TagString: Untagged @@ -3486,28 +3388,6 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: .5, y: .5} ---- !u!114 &1101956164 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1101956162} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c34dc6093a49a481db532b87b45132a4, type: 3} - m_Name: - m_EditorClassIdentifier: - debugMode: 0 - advancedProps: 0 - minPointers: 0 - maxPointers: 0 - combinePointers: 0 - combinePointersInterval: .300000012 - useSendMessage: 0 - sendStateChangeMessages: 0 - sendMessageTarget: {fileID: 0} - requireGestureToFail: {fileID: 0} - friendlyGestures: [] --- !u!114 &1101956165 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3520,7 +3400,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Navigation: - m_Mode: 3 + m_Mode: 0 m_SelectOnUp: {fileID: 0} m_SelectOnDown: {fileID: 0} m_SelectOnLeft: {fileID: 0} @@ -3528,7 +3408,7 @@ MonoBehaviour: m_Transition: 1 m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: .960784316, g: .960784316, b: .960784316, a: 1} + m_HighlightedColor: {r: 1, g: 1, b: 0, a: 1} m_PressedColor: {r: 1, g: 0, b: 1, a: 1} m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} m_ColorMultiplier: 1 @@ -3943,7 +3823,6 @@ GameObject: - 222: {fileID: 1402680840} - 114: {fileID: 1402680839} - 114: {fileID: 1402680838} - - 114: {fileID: 1402680837} m_Layer: 0 m_Name: Close m_TagString: Untagged @@ -3968,28 +3847,6 @@ RectTransform: m_AnchoredPosition: {x: 18, y: -18} m_SizeDelta: {x: 80, y: 80} m_Pivot: {x: .5, y: .5} ---- !u!114 &1402680837 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1402680835} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c34dc6093a49a481db532b87b45132a4, type: 3} - m_Name: - m_EditorClassIdentifier: - debugMode: 0 - advancedProps: 0 - minPointers: 0 - maxPointers: 0 - combinePointers: 0 - combinePointersInterval: .300000012 - useSendMessage: 0 - sendStateChangeMessages: 0 - sendMessageTarget: {fileID: 0} - requireGestureToFail: {fileID: 0} - friendlyGestures: [] --- !u!114 &1402680838 MonoBehaviour: m_ObjectHideFlags: 0 @@ -4010,7 +3867,7 @@ MonoBehaviour: m_Transition: 1 m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: .960784316, g: .960784316, b: .960784316, a: 1} + m_HighlightedColor: {r: 1, g: .666666687, b: .666666687, a: 1} m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} m_ColorMultiplier: 1 @@ -4086,7 +3943,6 @@ GameObject: - 222: {fileID: 1406281481} - 114: {fileID: 1406281480} - 114: {fileID: 1406281479} - - 114: {fileID: 1406281478} m_Layer: 5 m_Name: Button m_TagString: Untagged @@ -4113,28 +3969,6 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: .5, y: .5} ---- !u!114 &1406281478 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1406281476} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c34dc6093a49a481db532b87b45132a4, type: 3} - m_Name: - m_EditorClassIdentifier: - debugMode: 0 - advancedProps: 0 - minPointers: 0 - maxPointers: 0 - combinePointers: 0 - combinePointersInterval: .300000012 - useSendMessage: 0 - sendStateChangeMessages: 0 - sendMessageTarget: {fileID: 0} - requireGestureToFail: {fileID: 0} - friendlyGestures: [] --- !u!114 &1406281479 MonoBehaviour: m_ObjectHideFlags: 0 @@ -4147,7 +3981,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Navigation: - m_Mode: 3 + m_Mode: 0 m_SelectOnUp: {fileID: 0} m_SelectOnDown: {fileID: 0} m_SelectOnLeft: {fileID: 0} @@ -4155,7 +3989,7 @@ MonoBehaviour: m_Transition: 1 m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: .960784316, g: .960784316, b: .960784316, a: 1} + m_HighlightedColor: {r: 1, g: 1, b: 0, a: 1} m_PressedColor: {r: 0, g: 1, b: 0, a: 1} m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} m_ColorMultiplier: 1 @@ -4319,7 +4153,6 @@ GameObject: - 222: {fileID: 1423800612} - 114: {fileID: 1423800611} - 114: {fileID: 1423800610} - - 114: {fileID: 1423800609} m_Layer: 0 m_Name: Close m_TagString: Untagged @@ -4344,28 +4177,6 @@ RectTransform: m_AnchoredPosition: {x: 18, y: -18} m_SizeDelta: {x: 80, y: 80} m_Pivot: {x: .5, y: .5} ---- !u!114 &1423800609 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1423800607} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c34dc6093a49a481db532b87b45132a4, type: 3} - m_Name: - m_EditorClassIdentifier: - debugMode: 0 - advancedProps: 0 - minPointers: 0 - maxPointers: 0 - combinePointers: 0 - combinePointersInterval: .300000012 - useSendMessage: 0 - sendStateChangeMessages: 0 - sendMessageTarget: {fileID: 0} - requireGestureToFail: {fileID: 0} - friendlyGestures: [] --- !u!114 &1423800610 MonoBehaviour: m_ObjectHideFlags: 0 @@ -4386,7 +4197,7 @@ MonoBehaviour: m_Transition: 1 m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: .960784316, g: .960784316, b: .960784316, a: 1} + m_HighlightedColor: {r: 1, g: .666666687, b: .666666687, a: 1} m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} m_ColorMultiplier: 1 @@ -4978,7 +4789,6 @@ GameObject: - 222: {fileID: 1772489005} - 114: {fileID: 1772489004} - 114: {fileID: 1772489003} - - 114: {fileID: 1772489002} m_Layer: 0 m_Name: Close m_TagString: Untagged @@ -5003,28 +4813,6 @@ RectTransform: m_AnchoredPosition: {x: 18, y: -18} m_SizeDelta: {x: 80, y: 80} m_Pivot: {x: .5, y: .5} ---- !u!114 &1772489002 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1772489000} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c34dc6093a49a481db532b87b45132a4, type: 3} - m_Name: - m_EditorClassIdentifier: - debugMode: 0 - advancedProps: 0 - minPointers: 0 - maxPointers: 0 - combinePointers: 0 - combinePointersInterval: .300000012 - useSendMessage: 0 - sendStateChangeMessages: 0 - sendMessageTarget: {fileID: 0} - requireGestureToFail: {fileID: 0} - friendlyGestures: [] --- !u!114 &1772489003 MonoBehaviour: m_ObjectHideFlags: 0 @@ -5045,7 +4833,7 @@ MonoBehaviour: m_Transition: 1 m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: .960784316, g: .960784316, b: .960784316, a: 1} + m_HighlightedColor: {r: 1, g: .666666687, b: .666666687, a: 1} m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} m_ColorMultiplier: 1 @@ -5266,7 +5054,7 @@ Canvas: m_Enabled: 1 serializedVersion: 2 m_RenderMode: 2 - m_Camera: {fileID: 0} + m_Camera: {fileID: 62216957} m_PlaneDistance: 100 m_PixelPerfect: 0 m_ReceivesEvents: 1 @@ -5601,7 +5389,6 @@ GameObject: - 222: {fileID: 2041974591} - 114: {fileID: 2041974590} - 114: {fileID: 2041974589} - - 114: {fileID: 2041974588} m_Layer: 0 m_Name: Close m_TagString: Untagged @@ -5626,28 +5413,6 @@ RectTransform: m_AnchoredPosition: {x: 18, y: -18} m_SizeDelta: {x: 80, y: 80} m_Pivot: {x: .5, y: .5} ---- !u!114 &2041974588 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2041974586} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c34dc6093a49a481db532b87b45132a4, type: 3} - m_Name: - m_EditorClassIdentifier: - debugMode: 0 - advancedProps: 0 - minPointers: 0 - maxPointers: 0 - combinePointers: 0 - combinePointersInterval: .300000012 - useSendMessage: 0 - sendStateChangeMessages: 0 - sendMessageTarget: {fileID: 0} - requireGestureToFail: {fileID: 0} - friendlyGestures: [] --- !u!114 &2041974589 MonoBehaviour: m_ObjectHideFlags: 0 @@ -5668,7 +5433,7 @@ MonoBehaviour: m_Transition: 1 m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: .960784316, g: .960784316, b: .960784316, a: 1} + m_HighlightedColor: {r: 1, g: .666666687, b: .666666687, a: 1} m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} m_ColorMultiplier: 1 @@ -5816,7 +5581,6 @@ GameObject: - 222: {fileID: 2082518922} - 114: {fileID: 2082518921} - 114: {fileID: 2082518920} - - 114: {fileID: 2082518919} m_Layer: 0 m_Name: Close m_TagString: Untagged @@ -5841,28 +5605,6 @@ RectTransform: m_AnchoredPosition: {x: 18, y: -18} m_SizeDelta: {x: 80, y: 80} m_Pivot: {x: .5, y: .5} ---- !u!114 &2082518919 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 2082518917} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c34dc6093a49a481db532b87b45132a4, type: 3} - m_Name: - m_EditorClassIdentifier: - debugMode: 0 - advancedProps: 0 - minPointers: 0 - maxPointers: 0 - combinePointers: 0 - combinePointersInterval: .300000012 - useSendMessage: 0 - sendStateChangeMessages: 0 - sendMessageTarget: {fileID: 0} - requireGestureToFail: {fileID: 0} - friendlyGestures: [] --- !u!114 &2082518920 MonoBehaviour: m_ObjectHideFlags: 0 @@ -5883,7 +5625,7 @@ MonoBehaviour: m_Transition: 1 m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: .960784316, g: .960784316, b: .960784316, a: 1} + m_HighlightedColor: {r: 1, g: .666666687, b: .666666687, a: 1} m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} m_ColorMultiplier: 1 diff --git a/Source/Assets/TouchScript/Scripts/Hit/HitData.cs b/Source/Assets/TouchScript/Scripts/Hit/HitData.cs index 5323c4f48..b9e89fc64 100644 --- a/Source/Assets/TouchScript/Scripts/Hit/HitData.cs +++ b/Source/Assets/TouchScript/Scripts/Hit/HitData.cs @@ -5,7 +5,6 @@ using System; using TouchScript.Layers; using UnityEngine; -using UnityEngine.EventSystems; namespace TouchScript.Hit { @@ -93,9 +92,9 @@ public RaycastHit2D RaycastHit2D /// Gets raycast hit for a UI hit. ///
/// UI raycast hit object. - public RaycastResult RaycastResult + public RaycastHitUI RaycastHitUI { - get { return raycastResult; } + get { return raycastHitUI; } } public bool ScreenSpace @@ -114,11 +113,11 @@ public Vector3 Point switch (type) { case HitType.World3D: - return RaycastHit.point; + return raycastHit.point; case HitType.World2D: - return RaycastHit2D.point; + return raycastHit2D.point; case HitType.UI: - return RaycastResult.worldPosition; + return raycastHitUI.WorldPosition; } return Vector3.zero; } @@ -135,11 +134,11 @@ public Vector3 Normal switch (type) { case HitType.World3D: - return RaycastHit.normal; + return raycastHit.normal; case HitType.World2D: - return RaycastHit2D.normal; + return raycastHit2D.normal; case HitType.UI: - return RaycastResult.worldNormal; + return raycastHitUI.WorldNormal; } return Vector3.forward; } @@ -155,7 +154,7 @@ public Vector3 Normal private TouchLayer layer; private RaycastHit raycastHit; private RaycastHit2D raycastHit2D; - private RaycastResult raycastResult; + private RaycastHitUI raycastHitUI; #endregion @@ -172,7 +171,7 @@ public HitData(Transform target, TouchLayer layer, bool screenSpace = false) this.screenSpace = screenSpace; raycastHit = default(RaycastHit); raycastHit2D = default(RaycastHit2D); - raycastResult = default(RaycastResult); + raycastHitUI = default(RaycastHitUI); type = HitType.ScreenSpace; } @@ -201,10 +200,10 @@ public HitData(RaycastHit2D value, TouchLayer layer, bool screenSpace = false) : /// Initializes a new instance of the struct from a UI raycast. ///
/// UI raycast value. - public HitData(RaycastResult value, TouchLayer layer, bool screenSpace = false) : - this(value.gameObject.transform, layer, screenSpace) + public HitData(RaycastHitUI value, TouchLayer layer, bool screenSpace = false) : + this(value.GameObject.transform, layer, screenSpace) { - raycastResult = value; + raycastHitUI = value; type = HitType.UI; } diff --git a/Source/Assets/TouchScript/Scripts/Hit/RaycastHitUI.cs b/Source/Assets/TouchScript/Scripts/Hit/RaycastHitUI.cs new file mode 100644 index 000000000..858c8acec --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Hit/RaycastHitUI.cs @@ -0,0 +1,26 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using UnityEngine; +using UnityEngine.EventSystems; +using UnityEngine.UI; + +namespace TouchScript.Hit +{ + public struct RaycastHitUI + { + + public GameObject GameObject; + public BaseRaycaster Raycaster; + public float GraphicIndex; + public int Depth; + public int SortingLayer; + public int SortingOrder; + public Graphic Graphic; + public Vector3 WorldPosition; + public Vector3 WorldNormal; + + } +} + diff --git a/Source/Assets/TouchScript/Scripts/Hit/RaycastHitUI.cs.meta b/Source/Assets/TouchScript/Scripts/Hit/RaycastHitUI.cs.meta new file mode 100644 index 000000000..398052d5e --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Hit/RaycastHitUI.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3342b71bedf9249f3bd60e73830ed1bf +timeCreated: 1470754412 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Layers/Base.meta b/Source/Assets/TouchScript/Scripts/Layers/Base.meta new file mode 100644 index 000000000..8ed4467c2 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Layers/Base.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: d33cc6e37c8ec4d5cb3e63d9665b7eb3 +folderAsset: yes +timeCreated: 1470744577 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Layers/Base/UILayerBase.cs b/Source/Assets/TouchScript/Scripts/Layers/Base/UILayerBase.cs new file mode 100644 index 000000000..bd884f72e --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Layers/Base/UILayerBase.cs @@ -0,0 +1,182 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using System; +using System.Collections.Generic; +using TouchScript.Hit; +using TouchScript.Layers.UI; +using TouchScript.Pointers; +using UnityEngine; +using UnityEngine.EventSystems; +using UnityEngine.UI; + +namespace TouchScript.Layers.Base +{ + public class UILayerBase : TouchLayer + { + #region Private variables + + private List graphicList = new List(20); + private Comparison _raycastComparerFunc; + + #endregion + + #region Public methods + + public override HitResult Hit(IPointer pointer, out HitData hit) + { + if (base.Hit(pointer, out hit) != HitResult.Hit) return HitResult.Miss; + + graphicList.Clear(); + + hit = default(HitData); + var position = pointer.Position; + var raycasters = TouchScriptInputModule.Instance.GetRaycasters(); + var count = raycasters.Count; + + for (var i = 0; i < count; i++) + { + var raycaster = raycasters[i] as GraphicRaycaster; + if (raycaster == null) continue; + var canvas = TouchScriptInputModule.Instance.GetCanvasForRaycaster(raycaster); + if (filterCanvas(canvas)) continue; + + var eventCamera = canvas.worldCamera; + var foundGraphics = GraphicRegistry.GetGraphicsForCanvas(canvas); + var count2 = foundGraphics.Count; + for (int j = 0; j < count2; j++) + { + Graphic graphic = foundGraphics[j]; + + // -1 means it hasn't been processed by the canvas, which means it isn't actually drawn + if (graphic.depth == -1 || !graphic.raycastTarget) + continue; + + if (!RectTransformUtility.RectangleContainsScreenPoint(graphic.rectTransform, position, eventCamera)) + continue; + + if (graphic.Raycast(position, null)) + { + var appendGraphic = true; + if (raycaster.ignoreReversedGraphics) + { + if (eventCamera == null) + { + // If we dont have a camera we know that we should always be facing forward + var dir = graphic.transform.rotation * Vector3.forward; + appendGraphic = Vector3.Dot(Vector3.forward, dir) > 0; + } + else + { + // If we have a camera compare the direction against the cameras forward. + var cameraFoward = eventCamera.transform.rotation * Vector3.forward; + var dir = graphic.transform.rotation * Vector3.forward; + appendGraphic = Vector3.Dot(cameraFoward, dir) > 0; + } + } + if (appendGraphic) + graphicList.Add( + new RaycastHitUI() + { + GameObject = graphic.gameObject, + Raycaster = raycaster, + Graphic = graphic, +// distance = 0, +// screenPosition = position, + GraphicIndex = graphicList.Count, + Depth = graphic.depth, + SortingLayer = canvas.sortingLayerID, + SortingOrder = canvas.sortingOrder + }); + } + } + } + + count = graphicList.Count; + if (count == 0) return HitResult.Miss; + if (count > 1) + { + graphicList.Sort(_raycastComparerFunc); + for (var i = 0; i < count; ++i) + { + var result = doHit(pointer, graphicList[i], out hit); + if (result != HitResult.Miss) return result; + } + return HitResult.Miss; + } + return doHit(pointer, graphicList[0], out hit); + } + + #endregion + + #region Unity methods + + protected override void Awake() + { + base.Awake(); + _raycastComparerFunc = raycastComparerFunc; + } + + protected void OnEnable() + { + if (!Application.isPlaying) return; + if (TouchScriptInputModule.Instance != null) TouchScriptInputModule.Instance.INTERNAL_Retain(); + } + + protected void OnDisable() + { + if (!Application.isPlaying) return; + if (TouchScriptInputModule.Instance != null) TouchScriptInputModule.Instance.INTERNAL_Release(); + } + + #endregion + + #region Protected functions + + protected virtual bool filterCanvas(Canvas canvas) + { + return true; + } + + #endregion + + #region Private functions + + private HitResult doHit(IPointer pointer, RaycastHitUI raycastHit, out HitData hit) + { + hit = new HitData(raycastHit, this, true); + return checkHitFilters(pointer, hit); + } + + private static int raycastComparerFunc(RaycastHitUI lhs, RaycastHitUI rhs) + { + if (lhs.Raycaster != rhs.Raycaster) + { + if (lhs.Raycaster.sortOrderPriority != rhs.Raycaster.sortOrderPriority) + return rhs.Raycaster.sortOrderPriority.CompareTo(lhs.Raycaster.sortOrderPriority); + + if (lhs.Raycaster.renderOrderPriority != rhs.Raycaster.renderOrderPriority) + return rhs.Raycaster.renderOrderPriority.CompareTo(lhs.Raycaster.renderOrderPriority); + } + + if (lhs.SortingLayer != rhs.SortingLayer) + { + // Uses the layer value to properly compare the relative order of the layers. + var rid = SortingLayer.GetLayerValueFromID(rhs.SortingLayer); + var lid = SortingLayer.GetLayerValueFromID(lhs.SortingLayer); + return rid.CompareTo(lid); + } + + if (lhs.SortingOrder != rhs.SortingOrder) + return rhs.SortingOrder.CompareTo(lhs.SortingOrder); + + if (lhs.Depth != rhs.Depth) + return rhs.Depth.CompareTo(lhs.Depth); + + return lhs.GraphicIndex.CompareTo(rhs.GraphicIndex); + } + + #endregion + } +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Layers/Base/UILayerBase.cs.meta b/Source/Assets/TouchScript/Scripts/Layers/Base/UILayerBase.cs.meta new file mode 100644 index 000000000..4220934fc --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Layers/Base/UILayerBase.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b4f10ec06d7b5492dbb0bf5c2abe6c8c +timeCreated: 1470744584 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Layers/ProjectionParams.cs b/Source/Assets/TouchScript/Scripts/Layers/ProjectionParams.cs index 8e5ec0cfb..7c5addf77 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/ProjectionParams.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/ProjectionParams.cs @@ -1,4 +1,4 @@ -/* +/* * @author Valentin Simonov / http://va.lent.in/ */ @@ -69,18 +69,13 @@ public override Vector2 ProjectFrom(Vector3 worldPosition) /// /// Projection parameters for a UI based . /// - public class CanvasProjectionParams : ProjectionParams + public class WorldSpaceCanvasProjectionParams : ProjectionParams { /// /// The canvas. /// protected Canvas canvas; - /// - /// Canvas RectTransform. - /// - protected RectTransform rect; - /// /// Canvas mode. /// @@ -95,32 +90,22 @@ public class CanvasProjectionParams : ProjectionParams /// Initializes a new instance of the class. ///
/// The canvas. - public CanvasProjectionParams(Canvas canvas) + public WorldSpaceCanvasProjectionParams(Canvas canvas) { this.canvas = canvas; mode = canvas.renderMode; - - if (mode == RenderMode.ScreenSpaceOverlay) - { - rect = canvas.GetComponent(); - } - else - { - camera = canvas.worldCamera ?? Camera.main; - } + camera = canvas.worldCamera ?? Camera.main; } /// public override Vector3 ProjectTo(Vector2 screenPosition, Plane projectionPlane) { - if (mode == RenderMode.ScreenSpaceOverlay) return base.ProjectTo(screenPosition, projectionPlane); return ProjectionUtils.CameraToPlaneProjection(screenPosition, camera, projectionPlane); } /// public override Vector2 ProjectFrom(Vector3 worldPosition) { - if (mode == RenderMode.ScreenSpaceOverlay) return base.ProjectFrom(worldPosition); return camera.WorldToScreenPoint(worldPosition); } } diff --git a/Source/Assets/TouchScript/Scripts/Layers/UICameraLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/UICameraLayer.cs new file mode 100644 index 000000000..7ce68509b --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Layers/UICameraLayer.cs @@ -0,0 +1,62 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using System.Collections.Generic; +using TouchScript.Layers.Base; +using TouchScript.Pointers; +using UnityEngine; + +namespace TouchScript.Layers +{ + /// + /// Pointer layer which handles Unity UI and interface objects in a Canvas. + /// + [AddComponentMenu("TouchScript/Layers/UI Layer")] + [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Layers_UILayer.htm")] + public class UICameraLayer : UILayerBase + { + #region Private variables + + private Dictionary projectionParamsCache = new Dictionary(); + + #endregion + + #region Public methods + + /// + public override ProjectionParams GetProjectionParams(Pointer pointer) + { + var graphic = pointer.GetPressData().RaycastHitUI.Graphic; + if (graphic == null) return layerProjectionParams; + var canvas = graphic.canvas; + if (canvas == null) return layerProjectionParams; + + ProjectionParams pp; + if (!projectionParamsCache.TryGetValue(canvas.GetInstanceID(), out pp)) + { + // TODO: memory leak + pp = new WorldSpaceCanvasProjectionParams(canvas); + projectionParamsCache.Add(canvas.GetInstanceID(), pp); + } + return pp; + } + + #endregion + + #region Protected functions + + /// + protected override void setName() + { + Name = "UI Camera Layer"; + } + + protected override bool filterCanvas(Canvas canvas) + { + return canvas == null || canvas.renderMode == RenderMode.ScreenSpaceOverlay; + } + + #endregion + } +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs.meta b/Source/Assets/TouchScript/Scripts/Layers/UICameraLayer.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/Layers/UILayer.cs.meta rename to Source/Assets/TouchScript/Scripts/Layers/UICameraLayer.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs b/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs deleted file mode 100644 index 967d953d6..000000000 --- a/Source/Assets/TouchScript/Scripts/Layers/UILayer.cs +++ /dev/null @@ -1,154 +0,0 @@ -/* - * @author Valentin Simonov / http://va.lent.in/ - */ - -using System; -using System.Collections; -using System.Collections.Generic; -using TouchScript.Hit; -using TouchScript.Pointers; -using UnityEngine; -using UnityEngine.EventSystems; -using UnityEngine.UI; - -namespace TouchScript.Layers -{ - /// - /// Pointer layer which handles Unity UI and interface objects in a Canvas. - /// - [AddComponentMenu("TouchScript/Layers/UI Layer")] - [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Layers_UILayer.htm")] - public class UILayer : TouchLayer - { - #region Public properties - - #endregion - - #region Private variables - - private static UILayer instance; - - [NonSerialized] - private List raycastResultCache = new List(20); - - private PointerEventData pointerDataCache; - private EventSystem eventSystem; - private Dictionary projectionParamsCache = new Dictionary(); - - #endregion - - #region Public methods - - /// - public override HitResult Hit(IPointer pointer, out HitData hit) - { - if (base.Hit(pointer, out hit) != HitResult.Hit) return HitResult.Miss; - if (eventSystem == null) return HitResult.Miss; - - var result = castRay(pointer, out hit); - if (result != HitResult.Hit) hit = default(HitData); - return result; - } - - /// - public override ProjectionParams GetProjectionParams(Pointer pointer) - { - var graphic = pointer.GetPressData().Target.GetComponent(); - if (graphic == null) return layerProjectionParams; - var canvas = graphic.canvas; - if (canvas == null) return layerProjectionParams; - - ProjectionParams pp; - if (!projectionParamsCache.TryGetValue(canvas, out pp)) - { - // TODO: memory leak - pp = new CanvasProjectionParams(canvas); - projectionParamsCache.Add(canvas, pp); - } - return pp; - } - - #endregion - - #region Unity methods - - /// - protected override void Awake() - { - if (Application.isPlaying) - { - if (instance == null) instance = this; - if (instance != this) - { - Debug.LogWarning("[TouchScript] Only one instance of UILayer should exist in a scene. Destroying."); - Destroy(this); - return; - } - } - - base.Awake(); - if (!Application.isPlaying) return; - - StartCoroutine(lateAwake()); - } - - /// - protected IEnumerator lateAwake() - { - yield return new WaitForEndOfFrame(); - eventSystem = EventSystem.current; - if (eventSystem == null) - { - eventSystem = gameObject.AddComponent(); - eventSystem.hideFlags = HideFlags.DontSave; - } - } - - #endregion - - #region Protected functions - - /// - protected override void setName() - { - Name = "UI Layer"; - } - - protected HitResult castRay(IPointer pointer, out HitData hit) - { - hit = default(HitData); - if (pointerDataCache == null) pointerDataCache = new PointerEventData(eventSystem); - pointerDataCache.position = pointer.Position; - eventSystem.RaycastAll(pointerDataCache, raycastResultCache); - - var count = raycastResultCache.Count; - if (count == 0) return HitResult.Miss; - if (count > 1) - { - for (var i = 0; i < count; ++i) - { - var raycastHit = raycastResultCache[i]; - if (!(raycastHit.module is GraphicRaycaster)) continue; - var result = doHit(pointer, raycastHit, out hit); - if (result != HitResult.Miss) return result; - } - return HitResult.Miss; - } - - if (!(raycastResultCache[0].module is GraphicRaycaster)) return HitResult.Miss; - return doHit(pointer, raycastResultCache[0], out hit); - } - - #endregion - - #region Private functions - - private HitResult doHit(IPointer pointer, RaycastResult raycastHit, out HitData hit) - { - hit = new HitData(raycastHit, this); - return checkHitFilters(pointer, hit); - } - - #endregion - } -} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Layers/UIOverlayLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/UIOverlayLayer.cs index 2c603c317..2f465f5b2 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/UIOverlayLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/UIOverlayLayer.cs @@ -2,116 +2,14 @@ * @author Valentin Simonov / http://va.lent.in/ */ -using System; -using System.Collections.Generic; -using TouchScript.Hit; -using TouchScript.Layers.UI; -using TouchScript.Pointers; +using TouchScript.Layers.Base; using UnityEngine; -using UnityEngine.EventSystems; -using UnityEngine.UI; namespace TouchScript.Layers { [AddComponentMenu("TouchScript/Layers/UI Overlay Layer")] - public class UIOverlayLayer : TouchLayer + public class UIOverlayLayer : UILayerBase { - - #region Private variables - - private List graphicList = new List(20); - private Comparison _raycastComparerFunc; - - #endregion - - #region Public methods - - public override HitResult Hit(IPointer pointer, out HitData hit) - { - if (base.Hit(pointer, out hit) != HitResult.Hit) return HitResult.Miss; - - graphicList.Clear(); - - hit = default(HitData); - var position = pointer.Position; - var raycasters = TouchScriptInputModule.Instance.GetRaycasters(); - var count = raycasters.Count; - - for (var i = 0; i < count; i++) - { - var raycaster = raycasters[i] as GraphicRaycaster; - if (raycaster == null) continue; - var canvas = TouchScriptInputModule.Instance.GetCanvasForRaycaster(raycaster); - if (canvas == null) continue; - if (canvas.renderMode != RenderMode.ScreenSpaceOverlay) continue; - - var foundGraphics = GraphicRegistry.GetGraphicsForCanvas(canvas); - var count2 = foundGraphics.Count; - for (int j = 0; j < count2; j++) - { - Graphic graphic = foundGraphics[j]; - - // -1 means it hasn't been processed by the canvas, which means it isn't actually drawn - if (graphic.depth == -1 || !graphic.raycastTarget) - continue; - - if (!RectTransformUtility.RectangleContainsScreenPoint(graphic.rectTransform, position)) - continue; - - if (graphic.Raycast(position, null)) graphicList.Add( - new RaycastResult() - { - gameObject = graphic.gameObject, - module = raycaster, - distance = 0, - screenPosition = position, - index = graphicList.Count, - depth = graphic.depth, - sortingLayer = canvas.sortingLayerID, - sortingOrder = canvas.sortingOrder - }); - } - } - - count = graphicList.Count; - if (count == 0) return HitResult.Miss; - if (count > 1) - { - graphicList.Sort(_raycastComparerFunc); - for (var i = 0; i < count; ++i) - { - var result = doHit(pointer, graphicList[i], out hit); - if (result != HitResult.Miss) return result; - } - return HitResult.Miss; - } - return doHit(pointer, graphicList[0], out hit); - } - - #endregion - - #region Unity methods - - protected override void Awake() - { - base.Awake(); - _raycastComparerFunc = raycastComparerFunc; - } - - protected void OnEnable() - { - if (!Application.isPlaying) return; - if (TouchScriptInputModule.Instance != null) TouchScriptInputModule.Instance.INTERNAL_Retain(); - } - - protected void OnDisable() - { - if (!Application.isPlaying) return; - if (TouchScriptInputModule.Instance != null) TouchScriptInputModule.Instance.INTERNAL_Release(); - } - - #endregion - #region Protected functions /// @@ -120,45 +18,11 @@ protected override void setName() Name = "UI Overlay Layer"; } - #endregion - - #region Private functions - - private HitResult doHit(IPointer pointer, RaycastResult raycastHit, out HitData hit) + protected override bool filterCanvas(Canvas canvas) { - hit = new HitData(raycastHit, this, true); - return checkHitFilters(pointer, hit); - } - - private static int raycastComparerFunc(RaycastResult lhs, RaycastResult rhs) - { - if (lhs.module != rhs.module) - { - if (lhs.module.sortOrderPriority != rhs.module.sortOrderPriority) - return rhs.module.sortOrderPriority.CompareTo(lhs.module.sortOrderPriority); - - if (lhs.module.renderOrderPriority != rhs.module.renderOrderPriority) - return rhs.module.renderOrderPriority.CompareTo(lhs.module.renderOrderPriority); - } - - if (lhs.sortingLayer != rhs.sortingLayer) - { - // Uses the layer value to properly compare the relative order of the layers. - var rid = SortingLayer.GetLayerValueFromID(rhs.sortingLayer); - var lid = SortingLayer.GetLayerValueFromID(lhs.sortingLayer); - return rid.CompareTo(lid); - } - - if (lhs.sortingOrder != rhs.sortingOrder) - return rhs.sortingOrder.CompareTo(lhs.sortingOrder); - - if (lhs.depth != rhs.depth) - return rhs.depth.CompareTo(lhs.depth); - - return lhs.index.CompareTo(rhs.index); + return canvas == null || canvas.renderMode != RenderMode.ScreenSpaceOverlay; } #endregion - } -} +} \ No newline at end of file From 3de57c5b2ceea8c5e9821f66b24c7134624aad0e Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 9 Aug 2016 18:39:32 +0300 Subject: [PATCH 088/211] Added Cartoon UI pack to license.txt. --- Source/Assets/TouchScript/license.txt | 3 ++- license.txt | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Source/Assets/TouchScript/license.txt b/Source/Assets/TouchScript/license.txt index b8dbae775..1294daf8e 100644 --- a/Source/Assets/TouchScript/license.txt +++ b/Source/Assets/TouchScript/license.txt @@ -25,4 +25,5 @@ Assets used in examples: 2. Planet Earth Free (https://www.assetstore.unity3d.com/en/#!/content/23399) 3. Wooden Table and Chair (https://www.assetstore.unity3d.com/en/#!/content/18996) 4. Touch gesture illustrations provided by GestureWorks® (www.gestureworks.com) -5. Cat images are just random images from Google search. \ No newline at end of file +5. Cartoon UI elements (http://opengameart.org/content/free-game-gui) +6. Cat images are just random images from Google search. \ No newline at end of file diff --git a/license.txt b/license.txt index 7444b5b74..1294daf8e 100644 --- a/license.txt +++ b/license.txt @@ -19,3 +19,11 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Assets used in examples: +1. Skybox Volume 2 (https://www.assetstore.unity3d.com/en/#!/content/3392) +2. Planet Earth Free (https://www.assetstore.unity3d.com/en/#!/content/23399) +3. Wooden Table and Chair (https://www.assetstore.unity3d.com/en/#!/content/18996) +4. Touch gesture illustrations provided by GestureWorks® (www.gestureworks.com) +5. Cartoon UI elements (http://opengameart.org/content/free-game-gui) +6. Cat images are just random images from Google search. \ No newline at end of file From 8d51fe70ed04a5d847de7aeee666a182f2772ad7 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 9 Aug 2016 19:20:44 +0300 Subject: [PATCH 089/211] Removed unused stuff from TouchScriptInputModule. --- .../Layers/UI/TouchScriptInputModule.cs | 294 +++++++++--------- 1 file changed, 145 insertions(+), 149 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs index efef49566..fc4e84515 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Reflection; +using TouchScript.Hit; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; @@ -50,7 +51,7 @@ public static TouchScriptInputModule Instance private static Dictionary raycasterCanvasCache = new Dictionary(); private static int refCount = 0; - private UIPointerInputModule ui; + private UIStandardInputModule ui; #endregion @@ -73,7 +74,7 @@ private TouchScriptInputModule() protected override void Awake() { base.Awake(); - ui = new UITouchInputModule(this, eventSystem); + ui = new UIStandardInputModule(this); } protected override void OnEnable() @@ -216,20 +217,24 @@ private void pointersCancelledHandler(object sender, PointerEventArgs pointerEve #region Copypasted code from UI // last update: df1947cd (5.4f3) - private abstract class UIPointerInputModule + private class UIStandardInputModule { protected TouchScriptInputModule input; - protected Dictionary m_PointerData = new Dictionary(); - - public UIPointerInputModule(TouchScriptInputModule input) + public UIStandardInputModule(TouchScriptInputModule input) { this.input = input; } #region Unchanged + private int m_ConsecutiveMoveCount = 0; + private Vector2 m_LastMoveVector; + private float m_PrevActionTime; + + private Dictionary m_PointerData = new Dictionary(); + protected bool GetPointerData(int id, out PointerEventData data, bool create) { if (!m_PointerData.TryGetValue(id, out data) && create) @@ -262,16 +267,138 @@ private static bool ShouldStartDrag(Vector2 pressPos, Vector2 currentPos, float return (pressPos - currentPos).sqrMagnitude >= threshold * threshold; } + private bool SendUpdateEventToSelectedObject() + { + if (input.eventSystem.currentSelectedGameObject == null) + return false; + + var data = input.GetBaseEventData(); + ExecuteEvents.Execute(input.eventSystem.currentSelectedGameObject, data, ExecuteEvents.updateSelectedHandler); + return data.used; + } + + private bool SendMoveEventToSelectedObject() + { + float time = Time.unscaledTime; + + Vector2 movement = GetRawMoveVector(); + if (Mathf.Approximately(movement.x, 0f) && Mathf.Approximately(movement.y, 0f)) + { + m_ConsecutiveMoveCount = 0; + return false; + } + + // If user pressed key again, always allow event + bool allow = Input.GetButtonDown(input.HorizontalAxis) || Input.GetButtonDown(input.VerticalAxis); + bool similarDir = (Vector2.Dot(movement, m_LastMoveVector) > 0); + if (!allow) + { + // Otherwise, user held down key or axis. + // If direction didn't change at least 90 degrees, wait for delay before allowing consequtive event. + if (similarDir && m_ConsecutiveMoveCount == 1) + allow = (time > m_PrevActionTime + input.RepeatDelay); + // If direction changed at least 90 degree, or we already had the delay, repeat at repeat rate. + else + allow = (time > m_PrevActionTime + 1f / input.InputActionsPerSecond); + } + if (!allow) + return false; + + // Debug.Log(m_ProcessingEvent.rawType + " axis:" + m_AllowAxisEvents + " value:" + "(" + x + "," + y + ")"); + var axisEventData = input.GetAxisEventData(movement.x, movement.y, 0.6f); + + if (axisEventData.moveDir != MoveDirection.None) + { + ExecuteEvents.Execute(input.eventSystem.currentSelectedGameObject, axisEventData, ExecuteEvents.moveHandler); + if (!similarDir) + m_ConsecutiveMoveCount = 0; + m_ConsecutiveMoveCount++; + m_PrevActionTime = time; + m_LastMoveVector = movement; + } + else + { + m_ConsecutiveMoveCount = 0; + } + + return axisEventData.used; + } + + private bool SendSubmitEventToSelectedObject() + { + if (input.eventSystem.currentSelectedGameObject == null) + return false; + + var data = input.GetBaseEventData(); + if (Input.GetButtonDown(input.SubmitButton)) + ExecuteEvents.Execute(input.eventSystem.currentSelectedGameObject, data, ExecuteEvents.submitHandler); + + if (Input.GetButtonDown(input.CancelButton)) + ExecuteEvents.Execute(input.eventSystem.currentSelectedGameObject, data, ExecuteEvents.cancelHandler); + return data.used; + } + + private Vector2 GetRawMoveVector() + { + Vector2 move = Vector2.zero; + move.x = Input.GetAxisRaw(input.HorizontalAxis); + move.y = Input.GetAxisRaw(input.VerticalAxis); + + if (Input.GetButtonDown(input.HorizontalAxis)) + { + if (move.x < 0) + move.x = -1f; + if (move.x > 0) + move.x = 1f; + } + if (Input.GetButtonDown(input.VerticalAxis)) + { + if (move.y < 0) + move.y = -1f; + if (move.y > 0) + move.y = 1f; + } + return move; + } + #endregion + public void Process() + { + bool usedEvent = SendUpdateEventToSelectedObject(); + + if (input.eventSystem.sendNavigationEvents) + { + if (!usedEvent) + usedEvent |= SendMoveEventToSelectedObject(); + + if (!usedEvent) + SendSubmitEventToSelectedObject(); + } + + // touch needs to take precedence because of the mouse emulation layer + // if (!ProcessTouchEvents() && Input.mousePresent) + // ProcessMouseEvent(); + } + #region Changed #endregion - public abstract void Process(); + #region Event processors + private void convertRaycast(RaycastHitUI old, ref RaycastResult current) + { + current.module = old.Raycaster; + current.gameObject = old.GameObject; + current.depth = old.Depth; + current.index = old.GraphicIndex; + current.sortingLayer = old.SortingLayer; + current.sortingOrder = old.SortingOrder; + } public virtual void ProcessUpdated(IList pointers) { + var raycast = new RaycastResult(); var count = pointers.Count; for (var i = 0; i < count; i++) { @@ -280,11 +407,16 @@ public virtual void ProcessUpdated(IList pointers) GetPointerData(pointer.Id, out data, true); data.Reset(); + var over = pointer.GetOverData(); + var target = over.Target; + var currentOverGo = target == null ? null : target.gameObject; + data.position = pointer.Position; data.delta = pointer.Position - pointer.PreviousPosition; - - var target = pointer.GetOverData().Target; - var currentOverGo = target == null ? null : target.gameObject; + convertRaycast(over.RaycastHitUI, ref raycast); + raycast.screenPosition = data.position; + data.pointerCurrentRaycast = raycast; + input.HandlePointerExitAndEnter(data, currentOverGo); bool moving = data.IsPointerMoving(); @@ -323,8 +455,8 @@ public virtual void ProcessPressed(IList pointers) var pointer = pointers[i]; PointerEventData data; GetPointerData(pointer.Id, out data, true); - - var target = pointer.GetOverData().Target; + var over = pointer.GetOverData(); + var target = over.Target; var currentOverGo = target == null ? null : target.gameObject; data.eligibleForClick = true; @@ -332,7 +464,7 @@ public virtual void ProcessPressed(IList pointers) data.dragging = false; data.useDragThreshold = true; data.pressPosition = pointer.Position; - data.pointerPressRaycast = data.pointerCurrentRaycast; // ?? + data.pointerPressRaycast = data.pointerCurrentRaycast; DeselectIfSelectionChanged(currentOverGo, data); @@ -468,142 +600,6 @@ public virtual void ProcessCancelled(IList pointers) } } - } - - private class UITouchInputModule : UIPointerInputModule - { - - public UITouchInputModule(TouchScriptInputModule input, EventSystem eventSystem) : base(input) - { } - - public override void Process() - {} - } - - private sealed class UIStandardInputModule : UIPointerInputModule - { - - public UIStandardInputModule(TouchScriptInputModule input, EventSystem eventSystem) : base(input) - { } - - #region Unchanged - - private int m_ConsecutiveMoveCount = 0; - private Vector2 m_LastMoveVector; - private float m_PrevActionTime; - - public override void Process() - { - bool usedEvent = SendUpdateEventToSelectedObject(); - - if (input.eventSystem.sendNavigationEvents) - { - if (!usedEvent) - usedEvent |= SendMoveEventToSelectedObject(); - - if (!usedEvent) - SendSubmitEventToSelectedObject(); - } - - // touch needs to take precedence because of the mouse emulation layer -// if (!ProcessTouchEvents() && Input.mousePresent) -// ProcessMouseEvent(); - } - - private bool SendUpdateEventToSelectedObject() - { - if (input.eventSystem.currentSelectedGameObject == null) - return false; - - var data = input.GetBaseEventData(); - ExecuteEvents.Execute(input.eventSystem.currentSelectedGameObject, data, ExecuteEvents.updateSelectedHandler); - return data.used; - } - - private bool SendMoveEventToSelectedObject() - { - float time = Time.unscaledTime; - - Vector2 movement = GetRawMoveVector(); - if (Mathf.Approximately(movement.x, 0f) && Mathf.Approximately(movement.y, 0f)) - { - m_ConsecutiveMoveCount = 0; - return false; - } - - // If user pressed key again, always allow event - bool allow = Input.GetButtonDown(input.HorizontalAxis) || Input.GetButtonDown(input.VerticalAxis); - bool similarDir = (Vector2.Dot(movement, m_LastMoveVector) > 0); - if (!allow) - { - // Otherwise, user held down key or axis. - // If direction didn't change at least 90 degrees, wait for delay before allowing consequtive event. - if (similarDir && m_ConsecutiveMoveCount == 1) - allow = (time > m_PrevActionTime + input.RepeatDelay); - // If direction changed at least 90 degree, or we already had the delay, repeat at repeat rate. - else - allow = (time > m_PrevActionTime + 1f / input.InputActionsPerSecond); - } - if (!allow) - return false; - - // Debug.Log(m_ProcessingEvent.rawType + " axis:" + m_AllowAxisEvents + " value:" + "(" + x + "," + y + ")"); - var axisEventData = input.GetAxisEventData(movement.x, movement.y, 0.6f); - - if (axisEventData.moveDir != MoveDirection.None) - { - ExecuteEvents.Execute(input.eventSystem.currentSelectedGameObject, axisEventData, ExecuteEvents.moveHandler); - if (!similarDir) - m_ConsecutiveMoveCount = 0; - m_ConsecutiveMoveCount++; - m_PrevActionTime = time; - m_LastMoveVector = movement; - } - else - { - m_ConsecutiveMoveCount = 0; - } - - return axisEventData.used; - } - - private bool SendSubmitEventToSelectedObject() - { - if (input.eventSystem.currentSelectedGameObject == null) - return false; - - var data = input.GetBaseEventData(); - if (Input.GetButtonDown(input.SubmitButton)) - ExecuteEvents.Execute(input.eventSystem.currentSelectedGameObject, data, ExecuteEvents.submitHandler); - - if (Input.GetButtonDown(input.CancelButton)) - ExecuteEvents.Execute(input.eventSystem.currentSelectedGameObject, data, ExecuteEvents.cancelHandler); - return data.used; - } - - private Vector2 GetRawMoveVector() - { - Vector2 move = Vector2.zero; - move.x = Input.GetAxisRaw(input.HorizontalAxis); - move.y = Input.GetAxisRaw(input.VerticalAxis); - - if (Input.GetButtonDown(input.HorizontalAxis)) - { - if (move.x < 0) - move.x = -1f; - if (move.x > 0) - move.x = 1f; - } - if (Input.GetButtonDown(input.VerticalAxis)) - { - if (move.y < 0) - move.y = -1f; - if (move.y > 0) - move.y = 1f; - } - return move; - } - #endregion } From 310ba0e1d1fe2fdd3df2df2384d6fcc99bceee1a Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 9 Aug 2016 19:20:53 +0300 Subject: [PATCH 090/211] Something. --- .../TouchScript/Examples/Examples.unity | 21 +++++++- .../TouchScript/Examples/Photos/Photos.unity | 53 +++++-------------- .../Examples/_misc/Scripts/Runner.cs | 3 +- 3 files changed, 35 insertions(+), 42 deletions(-) diff --git a/Source/Assets/TouchScript/Examples/Examples.unity b/Source/Assets/TouchScript/Examples/Examples.unity index dbb857913..d5f3f7e68 100644 --- a/Source/Assets/TouchScript/Examples/Examples.unity +++ b/Source/Assets/TouchScript/Examples/Examples.unity @@ -500,6 +500,7 @@ GameObject: - 4: {fileID: 174295523} - 114: {fileID: 174295522} - 114: {fileID: 174295521} + - 114: {fileID: 174295524} m_Layer: 0 m_Name: EventSystem m_TagString: Untagged @@ -550,6 +551,24 @@ Transform: m_Children: [] m_Father: {fileID: 1654745587} m_RootOrder: 0 +--- !u!114 &174295524 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 174295520} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 1077351063, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: .5 + m_ForceModuleActive: 0 --- !u!1 &201561626 GameObject: m_ObjectHideFlags: 0 @@ -3843,7 +3862,7 @@ MonoBehaviour: m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} m_HighlightedColor: {r: 0, g: .958620548, b: 1, a: 1} - m_PressedColor: {r: .904411793, g: .904411793, b: .904411793, a: 1} + m_PressedColor: {r: .90196079, g: .90196079, b: .90196079, a: 1} m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} m_ColorMultiplier: 1 m_FadeDuration: .100000001 diff --git a/Source/Assets/TouchScript/Examples/Photos/Photos.unity b/Source/Assets/TouchScript/Examples/Photos/Photos.unity index fc71df373..feaeb838d 100644 --- a/Source/Assets/TouchScript/Examples/Photos/Photos.unity +++ b/Source/Assets/TouchScript/Examples/Photos/Photos.unity @@ -164,7 +164,6 @@ GameObject: - 92: {fileID: 62216956} - 124: {fileID: 62216955} - 81: {fileID: 62216954} - - 114: {fileID: 62216953} m_Layer: 0 m_Name: Main Camera m_TagString: MainCamera @@ -184,18 +183,6 @@ Transform: m_Children: [] m_Father: {fileID: 930800601} m_RootOrder: 2 ---- !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: 26a72f9b3b6704180978dbce08cf231e, type: 3} - m_Name: - m_EditorClassIdentifier: - Name: UI Camera Layer --- !u!81 &62216954 AudioListener: m_ObjectHideFlags: 0 @@ -1834,7 +1821,7 @@ Prefab: - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: layers.Array.data[1] value: - objectReference: {fileID: 62216953} + objectReference: {fileID: 543251039} - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: layers.Array.data[2] value: @@ -1858,6 +1845,18 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Name: UI Overlay Layer +--- !u!114 &543251039 +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: 26a72f9b3b6704180978dbce08cf231e, type: 3} + m_Name: + m_EditorClassIdentifier: + Name: UI Camera Layer --- !u!1 &551049734 GameObject: m_ObjectHideFlags: 0 @@ -2757,9 +2756,6 @@ GameObject: m_Component: - 4: {fileID: 894414302} - 20: {fileID: 894414306} - - 124: {fileID: 894414305} - - 92: {fileID: 894414304} - - 81: {fileID: 894414303} m_Layer: 0 m_Name: Camera m_TagString: Untagged @@ -2779,27 +2775,6 @@ Transform: m_Children: [] m_Father: {fileID: 1292123036} m_RootOrder: 1 ---- !u!81 &894414303 -AudioListener: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 894414301} - m_Enabled: 0 ---- !u!92 &894414304 -Behaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 894414301} - m_Enabled: 0 ---- !u!124 &894414305 -Behaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 894414301} - m_Enabled: 0 --- !u!20 &894414306 Camera: m_ObjectHideFlags: 0 @@ -3681,7 +3656,7 @@ GameObject: - 64: {fileID: 1292123038} - 23: {fileID: 1292123037} m_Layer: 0 - m_Name: Plane + m_Name: World Space Plane m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 diff --git a/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs b/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs index 52abccb73..e5377af66 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs +++ b/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs @@ -49,8 +49,7 @@ public void LoadPreviousLevel() #endif } - - private void Awake() + private void Start() { if (instance == null) { From 6081945f0fb9bd75d7503ff82b94dedf81c2ad8f Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 9 Aug 2016 22:02:26 +0300 Subject: [PATCH 091/211] Fixed layer list on TouchManager not updating in play mode. --- .../TouchScript/Editor/TouchManagerEditor.cs | 45 ++++++++++++------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs b/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs index 5df096d1a..be04478ae 100644 --- a/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs +++ b/Source/Assets/TouchScript/Editor/TouchManagerEditor.cs @@ -145,26 +145,39 @@ private void drawDebug() private void refresh() { - var allLayers = FindObjectsOfType(typeof(TouchLayer)).Cast().ToList(); - var toRemove = new List(); - for (var i = 0; i < layers.arraySize; i++) + if (Application.isPlaying) { - var layer = layers.GetArrayElementAtIndex(i).objectReferenceValue as TouchLayer; - if (layer == null || allLayers.IndexOf(layer) == -1) toRemove.Add(i); - else allLayers.Remove(layer); + var l = TouchManager.Instance.Layers; + layers.arraySize = 0; + for (var i = 0; i < l.Count; i++) + { + layers.arraySize++; + layers.GetArrayElementAtIndex(layers.arraySize - 1).objectReferenceValue = l[i]; + } } - - for (var i = toRemove.Count - 1; i >= 0; i--) + else { - var index = toRemove[i]; - layers.GetArrayElementAtIndex(index).objectReferenceValue = null; - layers.DeleteArrayElementAtIndex(index); - } + var allLayers = FindObjectsOfType(typeof (TouchLayer)).Cast().ToList(); + var toRemove = new List(); + for (var i = 0; i < layers.arraySize; i++) + { + var layer = layers.GetArrayElementAtIndex(i).objectReferenceValue as TouchLayer; + if (layer == null || allLayers.IndexOf(layer) == -1) toRemove.Add(i); + else allLayers.Remove(layer); + } - for (var i = 0; i < allLayers.Count; i++) - { - layers.arraySize++; - layers.GetArrayElementAtIndex(layers.arraySize - 1).objectReferenceValue = allLayers[i]; + for (var i = toRemove.Count - 1; i >= 0; i--) + { + var index = toRemove[i]; + layers.GetArrayElementAtIndex(index).objectReferenceValue = null; + layers.DeleteArrayElementAtIndex(index); + } + + for (var i = 0; i < allLayers.Count; i++) + { + layers.arraySize++; + layers.GetArrayElementAtIndex(layers.arraySize - 1).objectReferenceValue = allLayers[i]; + } } serializedObject.ApplyModifiedProperties(); From dbdf9ae36c66d8c037153939518f16863dd3d3d4 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 9 Aug 2016 22:03:06 +0300 Subject: [PATCH 092/211] Fixed TouchScriptInputModule destroying itself. --- .../TouchScript/Examples/_misc/Scripts/Runner.cs | 11 ++++++++++- .../Scripts/Layers/UI/TouchScriptInputModule.cs | 11 +++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs b/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs index e5377af66..964b22de5 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs +++ b/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs @@ -4,6 +4,9 @@ using UnityEngine; using TouchScript.Layers; +using System.Collections; + + #if UNITY_5_3_OR_NEWER using UnityEngine.SceneManagement; #endif @@ -71,7 +74,13 @@ private void Start() private void OnLevelWasLoaded(int num) { - TouchManager.Instance.AddLayer(layer, 0); + StartCoroutine(resetUILayer()); } + + private IEnumerator resetUILayer() + { + yield return new WaitForEndOfFrame(); + TouchManager.Instance.AddLayer(layer, 0); + } } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs index fc4e84515..a2fee4aec 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs @@ -49,8 +49,8 @@ public static TouchScriptInputModule Instance private static FieldInfo raycastersProp; private static PropertyInfo canvasProp; private static Dictionary raycasterCanvasCache = new Dictionary(); - private static int refCount = 0; + private int refCount = 0; private UIStandardInputModule ui; #endregion @@ -85,19 +85,14 @@ protected override void OnEnable() else { if (instance == this) return; - if (eventSystem != EventSystem.current) - { - Destroy(this); - instance = null; - return; - } + Destroy(this); } } protected override void OnDisable() { disable(); - instance = null; + if (instance == this) instance = null; base.OnDisable(); } From 4a97019fe35e9e308cb69e7358efefb85a99c24a Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 9 Aug 2016 22:20:17 +0300 Subject: [PATCH 093/211] Fixed an issue of OVER state not restting on iPhone. --- .../Layers/UI/TouchScriptInputModule.cs | 70 ++++++++++--------- 1 file changed, 38 insertions(+), 32 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs index a2fee4aec..1f4175900 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs @@ -165,20 +165,22 @@ internal int INTERNAL_Release() private void enable() { - TouchManager.Instance.PointersUpdated += pointersUpdatedHandler; - TouchManager.Instance.PointersPressed += pointersPressedHandler; - TouchManager.Instance.PointersReleased += pointersReleasedHandler; - TouchManager.Instance.PointersCancelled += pointersCancelledHandler; + TouchManager.Instance.PointersUpdated += ui.ProcessUpdated; + TouchManager.Instance.PointersPressed += ui.ProcessPressed; + TouchManager.Instance.PointersReleased += ui.ProcessReleased; + TouchManager.Instance.PointersRemoved += ui.ProcessRemoved; + TouchManager.Instance.PointersCancelled += ui.ProcessCancelled; } private void disable() { if (TouchManager.Instance != null) { - TouchManager.Instance.PointersUpdated -= pointersUpdatedHandler; - TouchManager.Instance.PointersPressed -= pointersPressedHandler; - TouchManager.Instance.PointersReleased -= pointersReleasedHandler; - TouchManager.Instance.PointersCancelled -= pointersCancelledHandler; + TouchManager.Instance.PointersUpdated -= ui.ProcessUpdated; + TouchManager.Instance.PointersPressed -= ui.ProcessPressed; + TouchManager.Instance.PointersReleased -= ui.ProcessReleased; + TouchManager.Instance.PointersRemoved -= ui.ProcessRemoved; + TouchManager.Instance.PointersCancelled -= ui.ProcessCancelled; } refCount = 0; } @@ -187,26 +189,6 @@ private void disable() #region Event handlers - private void pointersUpdatedHandler(object sender, PointerEventArgs pointerEventArgs) - { - ui.ProcessUpdated(pointerEventArgs.Pointers); - } - - private void pointersPressedHandler(object sender, PointerEventArgs pointerEventArgs) - { - ui.ProcessPressed(pointerEventArgs.Pointers); - } - - private void pointersReleasedHandler(object sender, PointerEventArgs pointerEventArgs) - { - ui.ProcessReleased(pointerEventArgs.Pointers); - } - - private void pointersCancelledHandler(object sender, PointerEventArgs pointerEventArgs) - { - ui.ProcessCancelled(pointerEventArgs.Pointers); - } - #endregion #region Copypasted code from UI @@ -378,6 +360,11 @@ public void Process() #region Changed + protected void RemovePointerData(int id) + { + m_PointerData.Remove(id); + } + #endregion #region Event processors @@ -391,8 +378,9 @@ private void convertRaycast(RaycastHitUI old, ref RaycastResult current) current.sortingLayer = old.SortingLayer; current.sortingOrder = old.SortingOrder; } - public virtual void ProcessUpdated(IList pointers) + public virtual void ProcessUpdated(object sender, PointerEventArgs pointerEventArgs) { + var pointers = pointerEventArgs.Pointers; var raycast = new RaycastResult(); var count = pointers.Count; for (var i = 0; i < count; i++) @@ -442,8 +430,9 @@ public virtual void ProcessUpdated(IList pointers) } } - public virtual void ProcessPressed(IList pointers) + public virtual void ProcessPressed(object sender, PointerEventArgs pointerEventArgs) { + var pointers = pointerEventArgs.Pointers; var count = pointers.Count; for (var i = 0; i < count; i++) { @@ -511,8 +500,9 @@ public virtual void ProcessPressed(IList pointers) } } - public virtual void ProcessReleased(IList pointers) + public virtual void ProcessReleased(object sender, PointerEventArgs pointerEventArgs) { + var pointers = pointerEventArgs.Pointers; var count = pointers.Count; for (var i = 0; i < count; i++) { @@ -560,8 +550,9 @@ public virtual void ProcessReleased(IList pointers) } } - public virtual void ProcessCancelled(IList pointers) + public virtual void ProcessCancelled(object sender, PointerEventArgs pointerEventArgs) { + var pointers = pointerEventArgs.Pointers; var count = pointers.Count; for (var i = 0; i < count; i++) { @@ -595,6 +586,21 @@ public virtual void ProcessCancelled(IList pointers) } } + public virtual void ProcessRemoved(object sender, PointerEventArgs pointerEventArgs) + { + var pointers = pointerEventArgs.Pointers; + var count = pointers.Count; + for (var i = 0; i < count; i++) + { + var pointer = pointers[i]; + PointerEventData data; + GetPointerData(pointer.Id, out data, true); + + if (data.pointerEnter) ExecuteEvents.ExecuteHierarchy(data.pointerEnter, data, ExecuteEvents.pointerExitHandler); + RemovePointerData(pointer.Id); + } + } + #endregion } From 9ffff058148a1b840c92be04aafbc237016eb5ba Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 9 Aug 2016 22:29:48 +0300 Subject: [PATCH 094/211] Fixed a few minor issues in examples list. --- .../TouchScript/Examples/Examples.unity | 107 +++++++++++------- .../TouchScript/Examples/Photos/Photos.unity | 14 +-- .../Examples/_misc/Scripts/ExamplesList.cs | 19 ++++ .../_misc/Scripts/ExamplesList.cs.meta | 12 ++ .../Examples/_misc/Scripts/ShowMe.cs | 13 +++ .../Examples/_misc/Scripts/ShowMe.cs.meta | 12 ++ 6 files changed, 123 insertions(+), 54 deletions(-) create mode 100644 Source/Assets/TouchScript/Examples/_misc/Scripts/ExamplesList.cs create mode 100644 Source/Assets/TouchScript/Examples/_misc/Scripts/ExamplesList.cs.meta create mode 100644 Source/Assets/TouchScript/Examples/_misc/Scripts/ShowMe.cs create mode 100644 Source/Assets/TouchScript/Examples/_misc/Scripts/ShowMe.cs.meta diff --git a/Source/Assets/TouchScript/Examples/Examples.unity b/Source/Assets/TouchScript/Examples/Examples.unity index d5f3f7e68..17dc6b85e 100644 --- a/Source/Assets/TouchScript/Examples/Examples.unity +++ b/Source/Assets/TouchScript/Examples/Examples.unity @@ -238,13 +238,14 @@ GameObject: serializedVersion: 4 m_Component: - 224: {fileID: 37557109} + - 114: {fileID: 37557110} m_Layer: 5 m_Name: Examples m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!224 &37557109 RectTransform: m_ObjectHideFlags: 0 @@ -264,6 +265,18 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 360, y: -60} m_Pivot: {x: .5, y: .5} +--- !u!114 &37557110 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 37557108} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1d184134ce2b24f92834c7bd77c9dcd8, type: 3} + m_Name: + m_EditorClassIdentifier: + Content: {fileID: 2098255038} --- !u!1 &62216951 GameObject: m_ObjectHideFlags: 0 @@ -809,10 +822,10 @@ RectTransform: - {fileID: 1894139120} m_Father: {fileID: 2098255038} m_RootOrder: 6 - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 128.5, y: -532} - m_SizeDelta: {x: 257, y: 80} + 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: .5, y: .5} --- !u!114 &321008079 MonoBehaviour: @@ -1504,10 +1517,10 @@ RectTransform: - {fileID: 341179473} m_Father: {fileID: 2098255038} m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 128.5, y: -40} - m_SizeDelta: {x: 257, y: 80} + 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: .5, y: .5} --- !u!114 &574950115 MonoBehaviour: @@ -1666,10 +1679,10 @@ RectTransform: - {fileID: 2001542684} m_Father: {fileID: 2098255038} m_RootOrder: 8 - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 128.5, y: -696} - m_SizeDelta: {x: 257, y: 80} + 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: .5, y: .5} --- !u!114 &601448588 MonoBehaviour: @@ -1836,10 +1849,10 @@ RectTransform: - {fileID: 842217637} m_Father: {fileID: 2098255038} m_RootOrder: 5 - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 128.5, y: -450} - m_SizeDelta: {x: 257, y: 80} + 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: .5, y: .5} --- !u!114 &621592927 MonoBehaviour: @@ -2193,10 +2206,10 @@ RectTransform: - {fileID: 363049655} m_Father: {fileID: 2098255038} m_RootOrder: 2 - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 128.5, y: -204} - m_SizeDelta: {x: 257, y: 80} + 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: .5, y: .5} --- !u!114 &758236083 MonoBehaviour: @@ -2609,10 +2622,10 @@ RectTransform: - {fileID: 201561627} m_Father: {fileID: 2098255038} m_RootOrder: 1 - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 128.5, y: -122} - m_SizeDelta: {x: 257, y: 80} + 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: .5, y: .5} --- !u!114 &870787323 MonoBehaviour: @@ -2905,10 +2918,10 @@ RectTransform: - {fileID: 962873577} m_Father: {fileID: 2098255038} m_RootOrder: 4 - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 128.5, y: -368} - m_SizeDelta: {x: 257, y: 80} + 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: .5, y: .5} --- !u!114 &1004776691 MonoBehaviour: @@ -3067,10 +3080,10 @@ RectTransform: - {fileID: 406504771} m_Father: {fileID: 2098255038} m_RootOrder: 7 - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 128.5, y: -614} - m_SizeDelta: {x: 257, y: 80} + 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: .5, y: .5} --- !u!114 &1037999863 MonoBehaviour: @@ -3759,6 +3772,7 @@ GameObject: - 224: {fileID: 1402896514} - 223: {fileID: 1402896517} - 114: {fileID: 1402896516} + - 114: {fileID: 1402896515} m_Layer: 5 m_Name: Canvas m_TagString: Untagged @@ -3784,6 +3798,17 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0, y: 0} +--- !u!114 &1402896515 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1402896513} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c534619fb2794426fb1495e64ec4bcb7, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!114 &1402896516 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3811,7 +3836,7 @@ Canvas: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1402896513} - m_Enabled: 1 + m_Enabled: 0 serializedVersion: 2 m_RenderMode: 0 m_Camera: {fileID: 0} @@ -3880,9 +3905,9 @@ MonoBehaviour: m_OnClick: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 37557108} - m_MethodName: SetActive - m_Mode: 6 + - m_Target: {fileID: 37557110} + m_MethodName: ShowHide + m_Mode: 1 m_Arguments: m_ObjectArgument: {fileID: 0} m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine @@ -5042,10 +5067,10 @@ RectTransform: - {fileID: 1361172027} m_Father: {fileID: 2098255038} m_RootOrder: 3 - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 128.5, y: -286} - m_SizeDelta: {x: 257, y: 80} + 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: .5, y: .5} --- !u!114 &2076713668 MonoBehaviour: diff --git a/Source/Assets/TouchScript/Examples/Photos/Photos.unity b/Source/Assets/TouchScript/Examples/Photos/Photos.unity index feaeb838d..6a309d767 100644 --- a/Source/Assets/TouchScript/Examples/Photos/Photos.unity +++ b/Source/Assets/TouchScript/Examples/Photos/Photos.unity @@ -287,7 +287,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Navigation: - m_Mode: 3 + m_Mode: 0 m_SelectOnUp: {fileID: 0} m_SelectOnDown: {fileID: 0} m_SelectOnLeft: {fileID: 0} @@ -898,7 +898,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -925,7 +924,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1481,7 +1479,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1515,7 +1512,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1693,7 +1689,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1727,7 +1722,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -2653,7 +2647,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -2687,7 +2680,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -4443,7 +4435,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -4477,7 +4468,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -5192,7 +5182,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -5226,7 +5215,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 diff --git a/Source/Assets/TouchScript/Examples/_misc/Scripts/ExamplesList.cs b/Source/Assets/TouchScript/Examples/_misc/Scripts/ExamplesList.cs new file mode 100644 index 000000000..6fde3c15c --- /dev/null +++ b/Source/Assets/TouchScript/Examples/_misc/Scripts/ExamplesList.cs @@ -0,0 +1,19 @@ +using UnityEngine; + +public class ExamplesList : MonoBehaviour +{ + + public RectTransform Content; + + void Start () + { + gameObject.SetActive(false); + } + + public void ShowHide() + { + gameObject.SetActive(!gameObject.activeSelf); + Content.localPosition = Vector3.zero; + } + +} diff --git a/Source/Assets/TouchScript/Examples/_misc/Scripts/ExamplesList.cs.meta b/Source/Assets/TouchScript/Examples/_misc/Scripts/ExamplesList.cs.meta new file mode 100644 index 000000000..3ce92d5e7 --- /dev/null +++ b/Source/Assets/TouchScript/Examples/_misc/Scripts/ExamplesList.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1d184134ce2b24f92834c7bd77c9dcd8 +timeCreated: 1470770698 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Scripts/ShowMe.cs b/Source/Assets/TouchScript/Examples/_misc/Scripts/ShowMe.cs new file mode 100644 index 000000000..f7a60cfae --- /dev/null +++ b/Source/Assets/TouchScript/Examples/_misc/Scripts/ShowMe.cs @@ -0,0 +1,13 @@ +using UnityEngine; +using System.Collections; + +public class ShowMe : MonoBehaviour +{ + IEnumerator Start () + { + var canvas = GetComponent(); + canvas.enabled = false; + yield return new WaitForSeconds(.5f); + canvas.enabled = true; + } +} diff --git a/Source/Assets/TouchScript/Examples/_misc/Scripts/ShowMe.cs.meta b/Source/Assets/TouchScript/Examples/_misc/Scripts/ShowMe.cs.meta new file mode 100644 index 000000000..01f169f9a --- /dev/null +++ b/Source/Assets/TouchScript/Examples/_misc/Scripts/ShowMe.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c534619fb2794426fb1495e64ec4bcb7 +timeCreated: 1470770477 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From abbef24ba1bdb843926cf29d9fc62693cdc02336 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 9 Aug 2016 22:51:23 +0300 Subject: [PATCH 095/211] Added scroll support to MousePointer. --- .../InputHandlers/MouseHandler.cs | 7 +++++++ .../Layers/UI/TouchScriptInputModule.cs | 9 +++++++++ .../Scripts/Pointers/MousePointer.cs | 20 +++++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs index 2f468173c..36ee39d06 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs @@ -108,6 +108,13 @@ public void UpdateInput() updatePointer(mousePointer); } + var scroll = Input.mouseScrollDelta; + mousePointer.ScrollDelta = scroll; + if (!Mathf.Approximately(scroll.sqrMagnitude, 0.0f)) + { + updatePointer(mousePointer); + } + var buttons = mousePointer.Buttons; var newButtons = getMouseButtons(); diff --git a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs index 1f4175900..9cd3f8463 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Reflection; using TouchScript.Hit; +using TouchScript.Pointers; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; @@ -427,6 +428,14 @@ public virtual void ProcessUpdated(object sender, PointerEventArgs pointerEventA } ExecuteEvents.Execute(data.pointerDrag, data, ExecuteEvents.dragHandler); } + + var mousePointer = pointer as MousePointer; + if (mousePointer != null && !Mathf.Approximately(mousePointer.ScrollDelta.sqrMagnitude, 0.0f)) + { + data.scrollDelta = mousePointer.ScrollDelta; + var scrollHandler = ExecuteEvents.GetEventHandler(currentOverGo); + ExecuteEvents.ExecuteHierarchy(scrollHandler, data, ExecuteEvents.scrollHandler); + } } } diff --git a/Source/Assets/TouchScript/Scripts/Pointers/MousePointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/MousePointer.cs index d5438cc42..7e18f9cd0 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/MousePointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/MousePointer.cs @@ -3,6 +3,7 @@ */ using TouchScript.InputSources; +using UnityEngine; namespace TouchScript.Pointers { @@ -13,6 +14,12 @@ namespace TouchScript.Pointers public class MousePointer : Pointer { + #region Public properties + + public Vector2 ScrollDelta { get; set; } + + #endregion + #region Constructor /// @@ -25,6 +32,19 @@ public MousePointer(IInputSource input) : base(input) #endregion + #region Public methods + + public override void CopyFrom(Pointer target) + { + base.CopyFrom(target); + + var mouseTarget = target as MousePointer; + if (mouseTarget == null) return; + ScrollDelta = mouseTarget.ScrollDelta; + } + + #endregion + #region Internal functions //internal override void INTERNAL_Reset() From 47461c67465d5e9f6df66e285bb47f33b5797c85 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Wed, 10 Aug 2016 02:58:33 +0300 Subject: [PATCH 096/211] StandardLayer = SSUI + WSUI + 3D + 2D. Updated examples. --- .../Examples/Checkers/Checkers.unity | 8 +- .../TouchScript/Examples/Colors/Colors.unity | 7 +- .../TouchScript/Examples/Cube/Cube.unity | 44 +- .../TouchScript/Examples/Cube/Scripts/Init.cs | 4 +- .../TouchScript/Examples/Examples.unity | 11 +- .../Examples/Multiuser/Multiuser.unity | 26 +- .../TouchScript/Examples/Photos/Photos.unity | 56 +- .../TouchScript/Examples/Portal/Portal.unity | 20 +- .../Examples/RawInput/RawInput.unity | 8 +- .../TouchScript/Examples/Taps/Taps.unity | 15 +- .../Examples/_misc/Scripts/Runner.cs | 2 +- .../Assets/TouchScript/Scripts/Hit/HitData.cs | 78 +++ .../TouchScript/Scripts/Hit/RaycastHitUI.cs | 3 +- .../Scripts/Layers/Base/UILayerBase.cs | 1 - .../Scripts/Layers/StandardLayer.cs | 519 ++++++++++++++++++ .../Scripts/Layers/StandardLayer.cs.meta | 12 + .../Layers/UI/TouchScriptInputModule.cs | 7 +- 17 files changed, 723 insertions(+), 98 deletions(-) create mode 100644 Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs create mode 100644 Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs.meta diff --git a/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity b/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity index e249d9a95..f308fee5d 100644 --- a/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity +++ b/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity @@ -179,10 +179,14 @@ MonoBehaviour: m_GameObject: {fileID: 62216951} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4c21776f7e73345948c045618b3fad6f, type: 3} + m_Script: {fileID: 11500000, guid: 7e5768c36d1bb4acea50bd233372843a, type: 3} m_Name: m_EditorClassIdentifier: Name: Camera + lookFor3DObjects: 1 + lookFor2DObjects: 0 + lookForWorldSpaceUI: 0 + lookForScreenSpaceUI: 0 layerMask: serializedVersion: 2 m_Bits: 4294967295 @@ -478,7 +482,7 @@ Prefab: - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: layers.Array.data[0] value: - objectReference: {fileID: 62216953} + objectReference: {fileID: 0} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} m_IsPrefabParent: 0 diff --git a/Source/Assets/TouchScript/Examples/Colors/Colors.unity b/Source/Assets/TouchScript/Examples/Colors/Colors.unity index 7cf715d42..c15a95731 100644 --- a/Source/Assets/TouchScript/Examples/Colors/Colors.unity +++ b/Source/Assets/TouchScript/Examples/Colors/Colors.unity @@ -125,14 +125,17 @@ MonoBehaviour: m_GameObject: {fileID: 62216951} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a2c791a2415314ea3b9f44592097a9d1, type: 3} + m_Script: {fileID: 11500000, guid: 7e5768c36d1bb4acea50bd233372843a, type: 3} m_Name: m_EditorClassIdentifier: Name: Camera + lookFor3DObjects: 0 + lookFor2DObjects: 1 + lookForWorldSpaceUI: 0 + lookForScreenSpaceUI: 0 layerMask: serializedVersion: 2 m_Bits: 4294967295 - layerIds: 00000000 --- !u!81 &62216954 AudioListener: m_ObjectHideFlags: 0 diff --git a/Source/Assets/TouchScript/Examples/Cube/Cube.unity b/Source/Assets/TouchScript/Examples/Cube/Cube.unity index e08d43dd5..534c13087 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Cube.unity +++ b/Source/Assets/TouchScript/Examples/Cube/Cube.unity @@ -97,7 +97,7 @@ GameObject: - 92: {fileID: 62216956} - 124: {fileID: 62216955} - 81: {fileID: 62216954} - - 114: {fileID: 62216958} + - 114: {fileID: 62216953} m_Layer: 0 m_Name: Camera m_TagString: MainCamera @@ -117,6 +117,25 @@ Transform: m_Children: [] m_Father: {fileID: 930800601} m_RootOrder: 1 +--- !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: Camera + lookFor3DObjects: 1 + lookFor2DObjects: 0 + lookForWorldSpaceUI: 0 + lookForScreenSpaceUI: 0 + layerMask: + serializedVersion: 2 + m_Bits: 4294967295 --- !u!81 &62216954 AudioListener: m_ObjectHideFlags: 0 @@ -172,21 +191,6 @@ Camera: m_StereoConvergence: 10 m_StereoSeparation: .0219999999 m_StereoMirrorMode: 0 ---- !u!114 &62216958 -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: 4c21776f7e73345948c045618b3fad6f, type: 3} - m_Name: - m_EditorClassIdentifier: - Name: Camera - layerMask: - serializedVersion: 2 - m_Bits: 4294967295 --- !u!1 &172819027 GameObject: m_ObjectHideFlags: 0 @@ -341,7 +345,7 @@ Prefab: - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: layers.Array.data[1] value: - objectReference: {fileID: 62216958} + objectReference: {fileID: 62216953} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} m_IsPrefabParent: 0 @@ -960,10 +964,14 @@ MonoBehaviour: m_GameObject: {fileID: 1459600542} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4c21776f7e73345948c045618b3fad6f, type: 3} + m_Script: {fileID: 11500000, guid: 7e5768c36d1bb4acea50bd233372843a, type: 3} m_Name: m_EditorClassIdentifier: Name: RenderTexture Camera + lookFor3DObjects: 1 + lookFor2DObjects: 0 + lookForWorldSpaceUI: 0 + lookForScreenSpaceUI: 0 layerMask: serializedVersion: 2 m_Bits: 4294967295 diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/Init.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/Init.cs index 5ca85f0be..9803930bd 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/Init.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/Init.cs @@ -12,9 +12,9 @@ public class Init : MonoBehaviour void Start () { var d = GetComponent(); var go = GameObject.Find("Scene Camera"); - go.GetComponent().Delegate = d; + 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/Examples.unity b/Source/Assets/TouchScript/Examples/Examples.unity index 17dc6b85e..3dbc2bd49 100644 --- a/Source/Assets/TouchScript/Examples/Examples.unity +++ b/Source/Assets/TouchScript/Examples/Examples.unity @@ -4211,10 +4211,17 @@ MonoBehaviour: m_GameObject: {fileID: 1654745586} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4ad2b146e2cb148fdad573d18694ff59, type: 3} + m_Script: {fileID: 11500000, guid: 7e5768c36d1bb4acea50bd233372843a, type: 3} m_Name: m_EditorClassIdentifier: - Name: UI Overlay Layer + Name: ScreenSpace UI Layer + lookFor3DObjects: 0 + lookFor2DObjects: 0 + lookForWorldSpaceUI: 0 + lookForScreenSpaceUI: 1 + layerMask: + serializedVersion: 2 + m_Bits: 4294967295 --- !u!1 &1778454009 GameObject: m_ObjectHideFlags: 0 diff --git a/Source/Assets/TouchScript/Examples/Multiuser/Multiuser.unity b/Source/Assets/TouchScript/Examples/Multiuser/Multiuser.unity index 75cc9ae9f..e060a6acf 100644 --- a/Source/Assets/TouchScript/Examples/Multiuser/Multiuser.unity +++ b/Source/Assets/TouchScript/Examples/Multiuser/Multiuser.unity @@ -719,7 +719,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 7a878a6ff128243dfb1d89ca0273f059, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -921,7 +920,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 7a878a6ff128243dfb1d89ca0273f059, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1359,7 +1357,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1627,10 +1624,14 @@ MonoBehaviour: m_GameObject: {fileID: 871116138} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4c21776f7e73345948c045618b3fad6f, type: 3} + m_Script: {fileID: 11500000, guid: 7e5768c36d1bb4acea50bd233372843a, type: 3} m_Name: m_EditorClassIdentifier: Name: Right 3D Camera + lookFor3DObjects: 1 + lookFor2DObjects: 0 + lookForWorldSpaceUI: 0 + lookForScreenSpaceUI: 0 layerMask: serializedVersion: 2 m_Bits: 4294967295 @@ -1952,7 +1953,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 7a878a6ff128243dfb1d89ca0273f059, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -2106,7 +2106,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 38e07bff8743d4ee38bf724a7a2b4cbb, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -2572,7 +2571,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 38e07bff8743d4ee38bf724a7a2b4cbb, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -2769,14 +2767,17 @@ MonoBehaviour: m_GameObject: {fileID: 1416507462} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a2c791a2415314ea3b9f44592097a9d1, type: 3} + m_Script: {fileID: 11500000, guid: 7e5768c36d1bb4acea50bd233372843a, type: 3} m_Name: m_EditorClassIdentifier: Name: 2D Camera + lookFor3DObjects: 0 + lookFor2DObjects: 1 + lookForWorldSpaceUI: 0 + lookForScreenSpaceUI: 0 layerMask: serializedVersion: 2 m_Bits: 4294967295 - layerIds: 00000000 --- !u!4 &1442124646 stripped Transform: m_PrefabParentObject: {fileID: 491238, guid: bb0a05fd2c374477cba1d93212b4600c, type: 2} @@ -3476,10 +3477,14 @@ MonoBehaviour: m_GameObject: {fileID: 1969944222} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4c21776f7e73345948c045618b3fad6f, type: 3} + m_Script: {fileID: 11500000, guid: 7e5768c36d1bb4acea50bd233372843a, type: 3} m_Name: m_EditorClassIdentifier: Name: Left 3D Camera + lookFor3DObjects: 1 + lookFor2DObjects: 0 + lookForWorldSpaceUI: 0 + lookForScreenSpaceUI: 0 layerMask: serializedVersion: 2 m_Bits: 4294967295 @@ -3554,7 +3559,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 diff --git a/Source/Assets/TouchScript/Examples/Photos/Photos.unity b/Source/Assets/TouchScript/Examples/Photos/Photos.unity index 6a309d767..96d97b7d3 100644 --- a/Source/Assets/TouchScript/Examples/Photos/Photos.unity +++ b/Source/Assets/TouchScript/Examples/Photos/Photos.unity @@ -164,6 +164,7 @@ GameObject: - 92: {fileID: 62216956} - 124: {fileID: 62216955} - 81: {fileID: 62216954} + - 114: {fileID: 62216953} m_Layer: 0 m_Name: Main Camera m_TagString: MainCamera @@ -183,6 +184,25 @@ Transform: m_Children: [] m_Father: {fileID: 930800601} m_RootOrder: 2 +--- !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: Main Camera + lookFor3DObjects: 0 + lookFor2DObjects: 0 + lookForWorldSpaceUI: 1 + lookForScreenSpaceUI: 1 + layerMask: + serializedVersion: 2 + m_Bits: 4294967295 --- !u!81 &62216954 AudioListener: m_ObjectHideFlags: 0 @@ -1778,7 +1798,7 @@ Prefab: m_Modifications: - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: layers.Array.size - value: 2 + value: 1 objectReference: {fileID: 0} - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: m_LocalPosition.x @@ -1811,46 +1831,18 @@ Prefab: - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: layers.Array.data[0] value: - objectReference: {fileID: 543251038} + objectReference: {fileID: 62216953} - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: layers.Array.data[1] value: - objectReference: {fileID: 543251039} + objectReference: {fileID: 62216953} - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: layers.Array.data[2] value: - objectReference: {fileID: 0} + 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: 4ad2b146e2cb148fdad573d18694ff59, type: 3} - m_Name: - m_EditorClassIdentifier: - Name: UI Overlay Layer ---- !u!114 &543251039 -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: 26a72f9b3b6704180978dbce08cf231e, type: 3} - m_Name: - m_EditorClassIdentifier: - Name: UI Camera Layer --- !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 747740f26..78d5fd75c 100644 --- a/Source/Assets/TouchScript/Examples/Portal/Portal.unity +++ b/Source/Assets/TouchScript/Examples/Portal/Portal.unity @@ -126,10 +126,14 @@ MonoBehaviour: m_GameObject: {fileID: 62216951} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4c21776f7e73345948c045618b3fad6f, type: 3} + m_Script: {fileID: 11500000, guid: 7e5768c36d1bb4acea50bd233372843a, type: 3} m_Name: m_EditorClassIdentifier: Name: Camera + lookFor3DObjects: 1 + lookFor2DObjects: 0 + lookForWorldSpaceUI: 0 + lookForScreenSpaceUI: 0 layerMask: serializedVersion: 2 m_Bits: 4294967295 @@ -357,7 +361,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -384,7 +387,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 141e75b9b7edb42df80a22a14f03ae4b, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -407,7 +409,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -472,7 +473,7 @@ Prefab: m_Modifications: - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: layers.Array.size - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: m_LocalPosition.x @@ -776,7 +777,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -815,7 +815,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 141e75b9b7edb42df80a22a14f03ae4b, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -838,7 +837,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -980,7 +978,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1007,7 +1004,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 141e75b9b7edb42df80a22a14f03ae4b, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1030,7 +1026,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1299,7 +1294,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1326,7 +1320,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 141e75b9b7edb42df80a22a14f03ae4b, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1349,7 +1342,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 diff --git a/Source/Assets/TouchScript/Examples/RawInput/RawInput.unity b/Source/Assets/TouchScript/Examples/RawInput/RawInput.unity index 5fe4ddd45..a50544e26 100644 --- a/Source/Assets/TouchScript/Examples/RawInput/RawInput.unity +++ b/Source/Assets/TouchScript/Examples/RawInput/RawInput.unity @@ -193,10 +193,14 @@ MonoBehaviour: m_GameObject: {fileID: 62216951} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4c21776f7e73345948c045618b3fad6f, type: 3} + m_Script: {fileID: 11500000, guid: 7e5768c36d1bb4acea50bd233372843a, type: 3} m_Name: m_EditorClassIdentifier: Name: Camera + lookFor3DObjects: 0 + lookFor2DObjects: 0 + lookForWorldSpaceUI: 0 + lookForScreenSpaceUI: 0 layerMask: serializedVersion: 2 m_Bits: 4294967295 @@ -263,7 +267,7 @@ Prefab: m_Modifications: - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: layers.Array.size - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: m_LocalPosition.x diff --git a/Source/Assets/TouchScript/Examples/Taps/Taps.unity b/Source/Assets/TouchScript/Examples/Taps/Taps.unity index cf2dd12fe..70a0d3acc 100644 --- a/Source/Assets/TouchScript/Examples/Taps/Taps.unity +++ b/Source/Assets/TouchScript/Examples/Taps/Taps.unity @@ -125,10 +125,14 @@ MonoBehaviour: m_GameObject: {fileID: 62216951} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4c21776f7e73345948c045618b3fad6f, type: 3} + m_Script: {fileID: 11500000, guid: 7e5768c36d1bb4acea50bd233372843a, type: 3} m_Name: m_EditorClassIdentifier: - Name: Camera + Name: Scene Camera + lookFor3DObjects: 1 + lookFor2DObjects: 0 + lookForWorldSpaceUI: 0 + lookForScreenSpaceUI: 0 layerMask: serializedVersion: 2 m_Bits: 4294967295 @@ -418,7 +422,7 @@ Prefab: m_Modifications: - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: layers.Array.size - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: m_LocalPosition.x @@ -451,6 +455,10 @@ Prefab: - 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} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} @@ -474,7 +482,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 7a878a6ff128243dfb1d89ca0273f059, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 diff --git a/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs b/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs index 964b22de5..9919fd8b8 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs +++ b/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs @@ -60,7 +60,7 @@ private void Start() DontDestroyOnLoad(gameObject); } - layer = GetComponent(); + layer = GetComponent(); #if UNITY_5_3_OR_NEWER if (SceneManager.GetActiveScene().name == "Examples" && SceneManager.sceneCountInBuildSettings > 1) diff --git a/Source/Assets/TouchScript/Scripts/Hit/HitData.cs b/Source/Assets/TouchScript/Scripts/Hit/HitData.cs index b9e89fc64..86392329b 100644 --- a/Source/Assets/TouchScript/Scripts/Hit/HitData.cs +++ b/Source/Assets/TouchScript/Scripts/Hit/HitData.cs @@ -144,6 +144,59 @@ public Vector3 Normal } } + public float Distance + { + get + { + switch (type) + { + case HitType.World3D: + return raycastHit.distance; + case HitType.World2D: + return raycastHit2D.distance; + case HitType.UI: + return raycastHitUI.Distance; + } + return 0f; + } + } + + public int SortingLayer + { + get + { + switch (type) + { + case HitType.World3D: + return 0; + case HitType.World2D: + if (sortingLayer == -1) updateSortingValues(); + return sortingLayer; + case HitType.UI: + return raycastHitUI.SortingLayer; + } + return 0; + } + } + + public int SortingOrder + { + get + { + switch (type) + { + case HitType.World3D: + return 0; + case HitType.World2D: + if (sortingLayer == -1) updateSortingValues(); + return sortingOrder; + case HitType.UI: + return raycastHitUI.SortingOrder; + } + return 0; + } + } + #endregion #region Private variables @@ -156,6 +209,9 @@ public Vector3 Normal private RaycastHit2D raycastHit2D; private RaycastHitUI raycastHitUI; + private int sortingLayer; + private int sortingOrder; + #endregion #region Constructors @@ -169,6 +225,9 @@ public HitData(Transform target, TouchLayer layer, bool screenSpace = false) this.target = target; this.layer = layer; this.screenSpace = screenSpace; + + sortingLayer = -1; + sortingOrder = -1; raycastHit = default(RaycastHit); raycastHit2D = default(RaycastHit2D); raycastHitUI = default(RaycastHitUI); @@ -208,5 +267,24 @@ public HitData(RaycastHitUI value, TouchLayer layer, bool screenSpace = false) : } #endregion + + #region Private functions + + private void updateSortingValues() + { + var sprite = target.GetComponent(); + if (sprite == null) + { + sortingLayer = 0; + sortingOrder = 0; + } + else + { + sortingLayer = sprite.sortingLayerID; + sortingOrder = sprite.sortingOrder; + } + } + + #endregion } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Hit/RaycastHitUI.cs b/Source/Assets/TouchScript/Scripts/Hit/RaycastHitUI.cs index 858c8acec..90ddbe90f 100644 --- a/Source/Assets/TouchScript/Scripts/Hit/RaycastHitUI.cs +++ b/Source/Assets/TouchScript/Scripts/Hit/RaycastHitUI.cs @@ -13,13 +13,14 @@ public struct RaycastHitUI public GameObject GameObject; public BaseRaycaster Raycaster; - public float GraphicIndex; + public int GraphicIndex; public int Depth; public int SortingLayer; public int SortingOrder; public Graphic Graphic; public Vector3 WorldPosition; public Vector3 WorldNormal; + public float Distance; } } diff --git a/Source/Assets/TouchScript/Scripts/Layers/Base/UILayerBase.cs b/Source/Assets/TouchScript/Scripts/Layers/Base/UILayerBase.cs index bd884f72e..0aeb7da59 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/Base/UILayerBase.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/Base/UILayerBase.cs @@ -8,7 +8,6 @@ using TouchScript.Layers.UI; using TouchScript.Pointers; using UnityEngine; -using UnityEngine.EventSystems; using UnityEngine.UI; namespace TouchScript.Layers.Base diff --git a/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs new file mode 100644 index 000000000..c14c576bd --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs @@ -0,0 +1,519 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using System; +using TouchScript.Hit; +using UnityEngine; +using System.Collections.Generic; +using TouchScript.Layers.UI; +using TouchScript.Pointers; +using UnityEngine.EventSystems; +using UnityEngine.UI; + +namespace TouchScript.Layers +{ + + [AddComponentMenu("TouchScript/Layers/Standard Layer")] + public class StandardLayer : TouchLayer + { + #region Public properties + + public bool LookFor3DObjects + { + get { return lookFor3DObjects; } + set { lookFor3DObjects = value; } + } + + public bool LookFor2DObjects + { + get { return lookFor2DObjects; } + set { lookFor2DObjects = value; } + } + + public bool LookForWorldSpaceUI + { + get { return lookForWorldSpaceUI; } + set { lookForWorldSpaceUI = value; } + } + + public bool LookForScreenSpaceUI + { + get { return lookForScreenSpaceUI; } + set { lookForScreenSpaceUI = value; } + } + + /// + /// Gets or sets the layer mask which is used to select layers which should be touchable from this layer. + /// + /// A mask to exclude objects from possibly touchable list. + public LayerMask LayerMask + { + get { return layerMask; } + set { layerMask = value; } + } + + /// + public override Vector3 WorldProjectionNormal + { + get + { + if (_camera == null) return Vector3.forward; + return _camera.transform.forward; + } + } + + #endregion + + #region Private variables + + private static Comparison _raycastHitUIComparerFunc = raycastHitUIComparerFunc; + private static Comparison _raycastHitComparerFunc = raycastHitComparerFunc; + private static Comparison _hitDataComparerFunc = hitDataComparerFunc; + + private static Dictionary projectionParamsCache = new Dictionary(); + private static List raycasters; + private static bool performedSSUISearch = false; + + private static List raycastHitUIList = new List(20); + private static List raycastHitList = new List(20); + private static List hitList = new List(20); +#if UNITY_5_3_OR_NEWER + private static RaycastHit[] raycastHits = new RaycastHit[20]; +#endif + private static RaycastHit2D[] raycastHits2D = new RaycastHit2D[20]; + + [SerializeField] + private bool lookFor3DObjects = true; + + [SerializeField] + private bool lookFor2DObjects = false; + + [SerializeField] + private bool lookForWorldSpaceUI = true; + + [SerializeField] + private bool lookForScreenSpaceUI = true; + + [SerializeField] + private LayerMask layerMask = -1; + + /// + /// Camera. + /// + protected Camera _camera; + + #endregion + + #region Public methods + + public override HitResult Hit(IPointer pointer, out HitData hit) + { + if (base.Hit(pointer, out hit) != HitResult.Hit) return HitResult.Miss; + + HitResult result = HitResult.Miss; + + if (lookForScreenSpaceUI && !performedSSUISearch) + { + result = performSSUISearch(pointer, out hit); + switch (result) + { + case HitResult.Hit: + return result; + case HitResult.Discard: + hit = default(HitData); + return result; + } + } + + if (_camera != null && (lookFor3DObjects || lookFor2DObjects || lookForWorldSpaceUI)) + { + result = performWorldSearch(pointer, out hit); + switch (result) + { + case HitResult.Hit: + return result; + case HitResult.Discard: + hit = default(HitData); + return result; + } + } + + hit = default(HitData); + return HitResult.Miss; + } + + /// + public override ProjectionParams GetProjectionParams(Pointer pointer) + { + var press = pointer.GetPressData(); + if (press.Type == HitData.HitType.World2D || + press.Type == HitData.HitType.World3D) + return layerProjectionParams; + + var graphic = press.RaycastHitUI.Graphic; + if (graphic == null) return layerProjectionParams; + var canvas = graphic.canvas; + if (canvas == null) return layerProjectionParams; + + ProjectionParams pp; + if (!projectionParamsCache.TryGetValue(canvas.GetInstanceID(), out pp)) + { + // TODO: memory leak + pp = new WorldSpaceCanvasProjectionParams(canvas); + projectionParamsCache.Add(canvas.GetInstanceID(), pp); + } + return pp; + } + + #endregion + + #region Unity methods + + /// + protected override void Awake() + { + updateCamera(); + base.Awake(); + } + + private void OnEnable() + { + if (!Application.isPlaying) return; + + if (TouchScriptInputModule.Instance != null) TouchScriptInputModule.Instance.INTERNAL_Retain(); + TouchManager.Instance.FrameStarted += frameStartedHandler; + } + + private void OnDisable() + { + if (!Application.isPlaying) return; + if (TouchScriptInputModule.Instance != null) TouchScriptInputModule.Instance.INTERNAL_Release(); + if (TouchManager.Instance != null) TouchManager.Instance.FrameStarted -= frameStartedHandler; + } + + #endregion + + #region Protected functions + + /// + /// Finds a camera. + /// + protected virtual void updateCamera() + { + _camera = GetComponent(); + } + + /// + protected override ProjectionParams createProjectionParams() + { + return new CameraProjectionParams(_camera); + } + + /// + protected override void setName() + { + if (string.IsNullOrEmpty(Name)) + { + if (_camera != null) Name = _camera.name; + else Name = "Layer"; + } + } + + #endregion + + #region Private functions + + private HitResult performSSUISearch(IPointer pointer, out HitData hit) + { + hit = default(HitData); + + performedSSUISearch = true; + raycastHitUIList.Clear(); + + if (raycasters == null) raycasters = TouchScriptInputModule.Instance.GetRaycasters(); + var count = raycasters.Count; + + for (var i = 0; i < count; i++) + { + var raycaster = raycasters[i] as GraphicRaycaster; + if (raycaster == null) continue; + var canvas = TouchScriptInputModule.Instance.GetCanvasForRaycaster(raycaster); // TODO: cache + if (canvas == null || canvas.renderMode != RenderMode.ScreenSpaceOverlay) continue; + performUISearchForCanvas(pointer, canvas, raycaster); + } + + count = raycastHitUIList.Count; + if (count == 0) return HitResult.Miss; + if (count > 1) + { + raycastHitUIList.Sort(_raycastHitUIComparerFunc); + for (var i = 0; i < count; ++i) + { + var result = doHit(pointer, raycastHitUIList[i], out hit); + if (result != HitResult.Miss) return result; + } + return HitResult.Miss; + } + return doHit(pointer, raycastHitUIList[0], out hit); + } + + private HitResult performWorldSearch(IPointer pointer, out HitData hit) + { + hit = default(HitData); + + if (_camera == null) return HitResult.Miss; + if (_camera.enabled == false || _camera.gameObject.activeInHierarchy == false) return HitResult.Miss; + var position = pointer.Position; + if (!_camera.pixelRect.Contains(position)) return HitResult.Miss; + + hitList.Clear(); + var ray = _camera.ScreenPointToRay(position); + + var searchDistance = float.MaxValue; + var result3D = HitResult.Miss; + if (lookFor3DObjects) + { + result3D = perform3DSearch(pointer, ray, out hit); + if (result3D != HitResult.Miss) searchDistance = hit.Distance; + } + if (lookFor2DObjects) perform2DSearch(ray, searchDistance); + if (lookForWorldSpaceUI) performWSUISearch(pointer, ray, searchDistance); + + var count = hitList.Count; + if (hitList.Count == 0) return result3D; + + if (count > 1) + { + hitList.Sort(_hitDataComparerFunc); + for (var i = 0; i < count; ++i) + { + hit = hitList[i]; + var result = checkHitFilters(pointer, hit); + if (result != HitResult.Miss) return result; + } + return HitResult.Miss; + } + hit = hitList[0]; + return checkHitFilters(pointer, hit); + } + + private HitResult perform3DSearch(IPointer pointer, Ray ray, out HitData hit) + { + hit = default(HitData); +#if UNITY_5_3_OR_NEWER + var count = Physics.RaycastNonAlloc(ray, raycastHits, float.PositiveInfinity, layerMask); +#else + var raycastHits = Physics.RaycastAll(ray, float.PositiveInfinity, layerMask); + var count = raycastHits.Length; +#endif + if (count == 0) return HitResult.Miss; + if (count > 1) + { + sortHits(raycastHits, count); + + RaycastHit raycastHit = default(RaycastHit); + for (var i = 0; i < count; i++) + { + raycastHit = raycastHitList[i]; + var result = doHit(pointer, raycastHit, out hit); + if (result != HitResult.Miss) return result; + } + return HitResult.Miss; + } + return doHit(pointer, raycastHits[0], out hit); + } + + private void perform2DSearch(Ray ray, float maxDistance) + { + var count = Physics2D.GetRayIntersectionNonAlloc(ray, raycastHits2D, maxDistance, layerMask); + for (var i = 0; i < count; i++) + { + hitList.Add(new HitData(raycastHits2D[i], this)); + } + } + + private void performWSUISearch(IPointer pointer, Ray ray, float maxDistance) + { + raycastHitUIList.Clear(); + + if (raycasters == null) raycasters = TouchScriptInputModule.Instance.GetRaycasters(); + var count = raycasters.Count; + + for (var i = 0; i < count; i++) + { + var raycaster = raycasters[i] as GraphicRaycaster; + 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, maxDistance, ray); + } + + count = raycastHitUIList.Count; + for (var i = 0; i < count; i++) + { + hitList.Add(new HitData(raycastHitUIList[i], this)); + } + } + + private void performUISearchForCanvas(IPointer pointer, Canvas canvas, GraphicRaycaster raycaster, 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 (int j = 0; j < count2; j++) + { + Graphic graphic = foundGraphics[j]; + + if (layerMask.value != -1 && (layerMask.value & 1 << graphic.gameObject.layer) == 0) continue; + + // -1 means it hasn't been processed by the canvas, which means it isn't actually drawn + if (graphic.depth == -1 || !graphic.raycastTarget) + continue; + + if (!RectTransformUtility.RectangleContainsScreenPoint(graphic.rectTransform, position, eventCamera)) + continue; + + if (graphic.Raycast(position, null)) + { + var t = graphic.transform; + if (raycaster.ignoreReversedGraphics) + { + if (eventCamera == null) + { + // If we dont have a camera we know that we should always be facing forward + var dir = t.rotation * Vector3.forward; + if (Vector3.Dot(Vector3.forward, dir) <= 0) continue; + } + else + { + // If we have a camera compare the direction against the cameras forward. + var cameraFoward = eventCamera.transform.rotation * Vector3.forward; + var dir = t.rotation * Vector3.forward; + if (Vector3.Dot(cameraFoward, dir) <= 0) continue; + } + } + + float distance = 0; + + if (eventCamera == null || canvas.renderMode == RenderMode.ScreenSpaceOverlay) {} + else + { + Vector3 transForward = t.forward; + // http://geomalgorithms.com/a06-_intersect-2.html + distance = (Vector3.Dot(transForward, t.position - ray.origin) / Vector3.Dot(transForward, ray.direction)); + + // Check to see if the go is behind the camera. + if (distance < 0) continue; + if (distance >= maxDistance) continue; + } + + raycastHitUIList.Add( + new RaycastHitUI() + { + GameObject = graphic.gameObject, + Raycaster = raycaster, + Graphic = graphic, + GraphicIndex = raycastHitUIList.Count, + Depth = graphic.depth, + SortingLayer = canvas.sortingLayerID, + SortingOrder = canvas.sortingOrder, + Distance = distance + }); + } + } + } + + private HitResult doHit(IPointer pointer, RaycastHitUI raycastHit, out HitData hit) + { + hit = new HitData(raycastHit, this, true); + return checkHitFilters(pointer, hit); + } + + private HitResult doHit(IPointer pointer, RaycastHit raycastHit, out HitData hit) + { + hit = new HitData(raycastHit, this); + return checkHitFilters(pointer, hit); + } + + #endregion + + #region Compare functions + + private void sortHits(RaycastHit[] hits, int count) + { + raycastHitList.Clear(); + for (var i = 0; i < count; i++) raycastHitList.Add(hits[i]); + raycastHitList.Sort(_raycastHitComparerFunc); + } + + private static int raycastHitUIComparerFunc(RaycastHitUI lhs, RaycastHitUI rhs) + { + if (lhs.SortingLayer != rhs.SortingLayer) + { + // Uses the layer value to properly compare the relative order of the layers. + var rid = SortingLayer.GetLayerValueFromID(rhs.SortingLayer); + var lid = SortingLayer.GetLayerValueFromID(lhs.SortingLayer); + return rid.CompareTo(lid); + } + + if (lhs.SortingOrder != rhs.SortingOrder) + return rhs.SortingOrder.CompareTo(lhs.SortingOrder); + + if (lhs.Depth != rhs.Depth) + return rhs.Depth.CompareTo(lhs.Depth); + + if (!Mathf.Approximately(lhs.Distance, rhs.Distance)) + return lhs.Distance.CompareTo(rhs.Distance); + + return lhs.GraphicIndex.CompareTo(rhs.GraphicIndex); + } + + private static int raycastHitComparerFunc(RaycastHit lhs, RaycastHit rhs) + { + if (lhs.collider.transform == rhs.collider.transform) return 0; + return lhs.distance < rhs.distance ? -1 : 1; + } + + private static int hitDataComparerFunc(HitData lhs, HitData rhs) + { + if (lhs.SortingLayer != rhs.SortingLayer) + { + // Uses the layer value to properly compare the relative order of the layers. + var rid = SortingLayer.GetLayerValueFromID(rhs.SortingLayer); + var lid = SortingLayer.GetLayerValueFromID(lhs.SortingLayer); + return rid.CompareTo(lid); + } + + if (lhs.SortingOrder != rhs.SortingOrder) + return rhs.SortingOrder.CompareTo(lhs.SortingOrder); + + if (lhs.Type == HitData.HitType.UI && rhs.Type == HitData.HitType.UI && + lhs.RaycastHitUI.Depth != rhs.RaycastHitUI.Depth) + return rhs.RaycastHitUI.Depth.CompareTo(lhs.RaycastHitUI.Depth); + + if (!Mathf.Approximately(lhs.Distance, rhs.Distance)) + return lhs.Distance.CompareTo(rhs.Distance); + + if (lhs.Type == HitData.HitType.UI && rhs.Type == HitData.HitType.UI && + lhs.RaycastHitUI.GraphicIndex != rhs.RaycastHitUI.GraphicIndex) + return rhs.RaycastHitUI.GraphicIndex.CompareTo(lhs.RaycastHitUI.GraphicIndex); + + return 0; + } + + #endregion + + #region Event handlers + + private void frameStartedHandler(object sender, EventArgs eventArgs) + { + performedSSUISearch = false; + raycasters = null; + } + + #endregion + + } +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs.meta b/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs.meta new file mode 100644 index 000000000..8c8bbea4e --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 7e5768c36d1bb4acea50bd233372843a +timeCreated: 1470775898 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs index 9cd3f8463..3f069c854 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs @@ -72,12 +72,6 @@ private TouchScriptInputModule() #region Unity methods - protected override void Awake() - { - base.Awake(); - ui = new UIStandardInputModule(this); - } - protected override void OnEnable() { base.OnEnable(); @@ -166,6 +160,7 @@ internal int INTERNAL_Release() private void enable() { + ui = new UIStandardInputModule(this); TouchManager.Instance.PointersUpdated += ui.ProcessUpdated; TouchManager.Instance.PointersPressed += ui.ProcessPressed; TouchManager.Instance.PointersReleased += ui.ProcessReleased; From 25f180d9cadaae4ab66d05af4a6aa798c777f33c Mon Sep 17 00:00:00 2001 From: ManeFunction Date: Thu, 27 Oct 2016 11:42:43 +0300 Subject: [PATCH 097/211] Replaced SpriteRenderer with base Renderer to provide work with custom sprite components and geometry. --- Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs b/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs index 48360e7da..34e6b3e8f 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs @@ -119,8 +119,8 @@ private void sortHits(RaycastHit2D[] hits) { if (a.collider.transform == b.collider.transform) return 0; - var sprite1 = a.transform.GetComponent(); - var sprite2 = b.transform.GetComponent(); + var sprite1 = a.transform.GetComponent(); + var sprite2 = b.transform.GetComponent(); if (sprite1 != null && sprite2 != null) { int s1Id, s2Id; From 49693dedc47e374c3cbd56b30bcb74072be60f4f Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 30 Oct 2016 00:39:00 +0300 Subject: [PATCH 098/211] Upped min version to 3.5.6. --- .../ProjectSettings/ClusterInputManager.asset | 6 ++ Source/ProjectSettings/ProjectSettings.asset | 72 +++++++------------ Source/ProjectSettings/ProjectVersion.txt | 2 +- .../UnityAnalyticsManager.asset | 10 --- .../UnityConnectSettings.asset | 14 ++++ 5 files changed, 48 insertions(+), 56 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/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/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 7a678b272a6b2c1fd7d62f32fb1add0466023f25 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 30 Oct 2016 00:59:46 +0300 Subject: [PATCH 099/211] Removed a faulty SS UI optimization. --- .../TouchScript/Scripts/Layers/StandardLayer.cs | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs index c14c576bd..22b880ab3 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs @@ -73,7 +73,6 @@ public override Vector3 WorldProjectionNormal private static Dictionary projectionParamsCache = new Dictionary(); private static List raycasters; - private static bool performedSSUISearch = false; private static List raycastHitUIList = new List(20); private static List raycastHitList = new List(20); @@ -113,7 +112,7 @@ public override HitResult Hit(IPointer pointer, out HitData hit) HitResult result = HitResult.Miss; - if (lookForScreenSpaceUI && !performedSSUISearch) + if (lookForScreenSpaceUI) { result = performSSUISearch(pointer, out hit); switch (result) @@ -228,7 +227,6 @@ private HitResult performSSUISearch(IPointer pointer, out HitData hit) { hit = default(HitData); - performedSSUISearch = true; raycastHitUIList.Clear(); if (raycasters == null) raycasters = TouchScriptInputModule.Instance.GetRaycasters(); @@ -310,7 +308,9 @@ private HitResult perform3DSearch(IPointer pointer, Ray ray, out HitData hit) if (count == 0) return HitResult.Miss; if (count > 1) { - sortHits(raycastHits, count); + raycastHitList.Clear(); + for (var i = 0; i < count; i++) raycastHitList.Add(raycastHits[i]); + raycastHitList.Sort(_raycastHitComparerFunc); RaycastHit raycastHit = default(RaycastHit); for (var i = 0; i < count; i++) @@ -441,13 +441,6 @@ private HitResult doHit(IPointer pointer, RaycastHit raycastHit, out HitData hit #region Compare functions - private void sortHits(RaycastHit[] hits, int count) - { - raycastHitList.Clear(); - for (var i = 0; i < count; i++) raycastHitList.Add(hits[i]); - raycastHitList.Sort(_raycastHitComparerFunc); - } - private static int raycastHitUIComparerFunc(RaycastHitUI lhs, RaycastHitUI rhs) { if (lhs.SortingLayer != rhs.SortingLayer) @@ -509,7 +502,6 @@ private static int hitDataComparerFunc(HitData lhs, HitData rhs) private void frameStartedHandler(object sender, EventArgs eventArgs) { - performedSSUISearch = false; raycasters = null; } From cfa6d15eea06c5eaff606553020aba207118f743 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 30 Oct 2016 03:28:53 +0300 Subject: [PATCH 100/211] Removed old layers. --- .../Editor/Layers/CameraLayer2DEditor.cs | 78 -------- .../Editor/Layers/CameraLayer2DEditor.cs.meta | 12 -- .../Editor/Layers/UICameraLayerEditor.cs | 20 -- .../Editor/Layers/UICameraLayerEditor.cs.meta | 12 -- .../TouchScript/Scripts/Layers/Base.meta | 9 - .../Scripts/Layers/Base/UILayerBase.cs | 181 ------------------ .../Scripts/Layers/Base/UILayerBase.cs.meta | 12 -- .../TouchScript/Scripts/Layers/CameraLayer.cs | 110 ----------- .../Scripts/Layers/CameraLayer.cs.meta | 12 -- .../Scripts/Layers/CameraLayer2D.cs | 127 ------------ .../Scripts/Layers/CameraLayer2D.cs.meta | 12 -- .../Scripts/Layers/CameraLayerBase.cs | 120 ------------ .../Scripts/Layers/CameraLayerBase.cs.meta | 12 -- .../Scripts/Layers/UICameraLayer.cs | 62 ------ .../Scripts/Layers/UICameraLayer.cs.meta | 12 -- .../Scripts/Layers/UIOverlayLayer.cs | 28 --- .../Scripts/Layers/UIOverlayLayer.cs.meta | 12 -- 17 files changed, 831 deletions(-) delete mode 100644 Source/Assets/TouchScript/Editor/Layers/CameraLayer2DEditor.cs delete mode 100644 Source/Assets/TouchScript/Editor/Layers/CameraLayer2DEditor.cs.meta delete mode 100644 Source/Assets/TouchScript/Editor/Layers/UICameraLayerEditor.cs delete mode 100644 Source/Assets/TouchScript/Editor/Layers/UICameraLayerEditor.cs.meta delete mode 100644 Source/Assets/TouchScript/Scripts/Layers/Base.meta delete mode 100644 Source/Assets/TouchScript/Scripts/Layers/Base/UILayerBase.cs delete mode 100644 Source/Assets/TouchScript/Scripts/Layers/Base/UILayerBase.cs.meta delete mode 100644 Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs delete mode 100644 Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs.meta delete mode 100644 Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs delete mode 100644 Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs.meta delete mode 100644 Source/Assets/TouchScript/Scripts/Layers/CameraLayerBase.cs delete mode 100644 Source/Assets/TouchScript/Scripts/Layers/CameraLayerBase.cs.meta delete mode 100644 Source/Assets/TouchScript/Scripts/Layers/UICameraLayer.cs delete mode 100644 Source/Assets/TouchScript/Scripts/Layers/UICameraLayer.cs.meta delete mode 100644 Source/Assets/TouchScript/Scripts/Layers/UIOverlayLayer.cs delete mode 100644 Source/Assets/TouchScript/Scripts/Layers/UIOverlayLayer.cs.meta diff --git a/Source/Assets/TouchScript/Editor/Layers/CameraLayer2DEditor.cs b/Source/Assets/TouchScript/Editor/Layers/CameraLayer2DEditor.cs deleted file mode 100644 index 455248e2a..000000000 --- a/Source/Assets/TouchScript/Editor/Layers/CameraLayer2DEditor.cs +++ /dev/null @@ -1,78 +0,0 @@ -/* - * @author Valentin Simonov / http://va.lent.in/ - */ - -using System; -using System.Reflection; -using TouchScript.Layers; -using UnityEditor; -using UnityEngine; - -namespace TouchScript.Editor.Layers -{ - [CustomEditor(typeof(CameraLayer2D))] - internal sealed class CameraLayer2DEditor : UnityEditor.Editor - { - public const string TEXT_REBUILD = "Unity doesn't expose actual 2d layers sorting, so if you change 2d layers you must manually rebuild layers by pressing this button."; - - private SerializedProperty layerIds; - - private void OnEnable() - { - layerIds = serializedObject.FindProperty("layerIds"); - if (layerIds.arraySize == 0) rebuildSortingLayers(); - } - - public override void OnInspectorGUI() - { - base.OnInspectorGUI(); - - GUILayout.Space(10); - if (GUILayout.Button(new GUIContent("Update Sorting Layers", TEXT_REBUILD))) - { - rebuildSortingLayers(); - } - } - - private void rebuildSortingLayers() - { - var data = getSortingLayerIdsToSortOrder(); - layerIds.arraySize = data.Length; - for (var i = 0; i < data.Length; i++) - { - layerIds.GetArrayElementAtIndex(i).intValue = data[i]; - } - serializedObject.ApplyModifiedProperties(); - - Debug.Log("CameraLayer2D: sorting layer order was rebuilt."); - } - - // https://github.com/TouchScript/TouchScript/issues/60 - // Based on https://gist.github.com/stuartcarnie/8511903 - private static int[] getSortingLayerIdsToSortOrder() - { - var type = typeof(UnityEditorInternal.InternalEditorUtility); - - var getSortingLayerCount = type.GetMethod("GetSortingLayerCount", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic); - MethodInfo getSortingLayerUserID; - if (Application.unityVersion.StartsWith("4")) - { - getSortingLayerUserID = type.GetMethod("GetSortingLayerUserID", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic); - } - else - { - // was renamed in 5.0 - getSortingLayerUserID = type.GetMethod("GetSortingLayerUniqueID", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic); - } - - int count = (int)getSortingLayerCount.Invoke(null, null); - var layerIds = new int[count]; - for (int i = 0; i < count; i++) - { - layerIds[i] = (int)getSortingLayerUserID.Invoke(null, new object[] { i }); - } - - return layerIds; - } - } -} diff --git a/Source/Assets/TouchScript/Editor/Layers/CameraLayer2DEditor.cs.meta b/Source/Assets/TouchScript/Editor/Layers/CameraLayer2DEditor.cs.meta deleted file mode 100644 index 3f82b9ec1..000000000 --- a/Source/Assets/TouchScript/Editor/Layers/CameraLayer2DEditor.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 63c78cda8eb1f4f188460aa97fc7e207 -timeCreated: 1447582130 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Source/Assets/TouchScript/Editor/Layers/UICameraLayerEditor.cs b/Source/Assets/TouchScript/Editor/Layers/UICameraLayerEditor.cs deleted file mode 100644 index 674c385b8..000000000 --- a/Source/Assets/TouchScript/Editor/Layers/UICameraLayerEditor.cs +++ /dev/null @@ -1,20 +0,0 @@ -/* - * @author Valentin Simonov / http://va.lent.in/ - */ - -using TouchScript.Layers; -using UnityEditor; - -namespace TouchScript.Editor.Layers -{ - [CustomEditor(typeof (UICameraLayer))] - internal sealed class UICameraLayerEditor : UnityEditor.Editor - { - private void OnEnable() {} - - public override void OnInspectorGUI() - { - base.OnInspectorGUI(); - } - } -} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Editor/Layers/UICameraLayerEditor.cs.meta b/Source/Assets/TouchScript/Editor/Layers/UICameraLayerEditor.cs.meta deleted file mode 100644 index b32e72109..000000000 --- a/Source/Assets/TouchScript/Editor/Layers/UICameraLayerEditor.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 7c765df6b51e243c189e129d8edc4a7b -timeCreated: 1447582130 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Layers/Base.meta b/Source/Assets/TouchScript/Scripts/Layers/Base.meta deleted file mode 100644 index 8ed4467c2..000000000 --- a/Source/Assets/TouchScript/Scripts/Layers/Base.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: d33cc6e37c8ec4d5cb3e63d9665b7eb3 -folderAsset: yes -timeCreated: 1470744577 -licenseType: Pro -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Layers/Base/UILayerBase.cs b/Source/Assets/TouchScript/Scripts/Layers/Base/UILayerBase.cs deleted file mode 100644 index 0aeb7da59..000000000 --- a/Source/Assets/TouchScript/Scripts/Layers/Base/UILayerBase.cs +++ /dev/null @@ -1,181 +0,0 @@ -/* - * @author Valentin Simonov / http://va.lent.in/ - */ - -using System; -using System.Collections.Generic; -using TouchScript.Hit; -using TouchScript.Layers.UI; -using TouchScript.Pointers; -using UnityEngine; -using UnityEngine.UI; - -namespace TouchScript.Layers.Base -{ - public class UILayerBase : TouchLayer - { - #region Private variables - - private List graphicList = new List(20); - private Comparison _raycastComparerFunc; - - #endregion - - #region Public methods - - public override HitResult Hit(IPointer pointer, out HitData hit) - { - if (base.Hit(pointer, out hit) != HitResult.Hit) return HitResult.Miss; - - graphicList.Clear(); - - hit = default(HitData); - var position = pointer.Position; - var raycasters = TouchScriptInputModule.Instance.GetRaycasters(); - var count = raycasters.Count; - - for (var i = 0; i < count; i++) - { - var raycaster = raycasters[i] as GraphicRaycaster; - if (raycaster == null) continue; - var canvas = TouchScriptInputModule.Instance.GetCanvasForRaycaster(raycaster); - if (filterCanvas(canvas)) continue; - - var eventCamera = canvas.worldCamera; - var foundGraphics = GraphicRegistry.GetGraphicsForCanvas(canvas); - var count2 = foundGraphics.Count; - for (int j = 0; j < count2; j++) - { - Graphic graphic = foundGraphics[j]; - - // -1 means it hasn't been processed by the canvas, which means it isn't actually drawn - if (graphic.depth == -1 || !graphic.raycastTarget) - continue; - - if (!RectTransformUtility.RectangleContainsScreenPoint(graphic.rectTransform, position, eventCamera)) - continue; - - if (graphic.Raycast(position, null)) - { - var appendGraphic = true; - if (raycaster.ignoreReversedGraphics) - { - if (eventCamera == null) - { - // If we dont have a camera we know that we should always be facing forward - var dir = graphic.transform.rotation * Vector3.forward; - appendGraphic = Vector3.Dot(Vector3.forward, dir) > 0; - } - else - { - // If we have a camera compare the direction against the cameras forward. - var cameraFoward = eventCamera.transform.rotation * Vector3.forward; - var dir = graphic.transform.rotation * Vector3.forward; - appendGraphic = Vector3.Dot(cameraFoward, dir) > 0; - } - } - if (appendGraphic) - graphicList.Add( - new RaycastHitUI() - { - GameObject = graphic.gameObject, - Raycaster = raycaster, - Graphic = graphic, -// distance = 0, -// screenPosition = position, - GraphicIndex = graphicList.Count, - Depth = graphic.depth, - SortingLayer = canvas.sortingLayerID, - SortingOrder = canvas.sortingOrder - }); - } - } - } - - count = graphicList.Count; - if (count == 0) return HitResult.Miss; - if (count > 1) - { - graphicList.Sort(_raycastComparerFunc); - for (var i = 0; i < count; ++i) - { - var result = doHit(pointer, graphicList[i], out hit); - if (result != HitResult.Miss) return result; - } - return HitResult.Miss; - } - return doHit(pointer, graphicList[0], out hit); - } - - #endregion - - #region Unity methods - - protected override void Awake() - { - base.Awake(); - _raycastComparerFunc = raycastComparerFunc; - } - - protected void OnEnable() - { - if (!Application.isPlaying) return; - if (TouchScriptInputModule.Instance != null) TouchScriptInputModule.Instance.INTERNAL_Retain(); - } - - protected void OnDisable() - { - if (!Application.isPlaying) return; - if (TouchScriptInputModule.Instance != null) TouchScriptInputModule.Instance.INTERNAL_Release(); - } - - #endregion - - #region Protected functions - - protected virtual bool filterCanvas(Canvas canvas) - { - return true; - } - - #endregion - - #region Private functions - - private HitResult doHit(IPointer pointer, RaycastHitUI raycastHit, out HitData hit) - { - hit = new HitData(raycastHit, this, true); - return checkHitFilters(pointer, hit); - } - - private static int raycastComparerFunc(RaycastHitUI lhs, RaycastHitUI rhs) - { - if (lhs.Raycaster != rhs.Raycaster) - { - if (lhs.Raycaster.sortOrderPriority != rhs.Raycaster.sortOrderPriority) - return rhs.Raycaster.sortOrderPriority.CompareTo(lhs.Raycaster.sortOrderPriority); - - if (lhs.Raycaster.renderOrderPriority != rhs.Raycaster.renderOrderPriority) - return rhs.Raycaster.renderOrderPriority.CompareTo(lhs.Raycaster.renderOrderPriority); - } - - if (lhs.SortingLayer != rhs.SortingLayer) - { - // Uses the layer value to properly compare the relative order of the layers. - var rid = SortingLayer.GetLayerValueFromID(rhs.SortingLayer); - var lid = SortingLayer.GetLayerValueFromID(lhs.SortingLayer); - return rid.CompareTo(lid); - } - - if (lhs.SortingOrder != rhs.SortingOrder) - return rhs.SortingOrder.CompareTo(lhs.SortingOrder); - - if (lhs.Depth != rhs.Depth) - return rhs.Depth.CompareTo(lhs.Depth); - - return lhs.GraphicIndex.CompareTo(rhs.GraphicIndex); - } - - #endregion - } -} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Layers/Base/UILayerBase.cs.meta b/Source/Assets/TouchScript/Scripts/Layers/Base/UILayerBase.cs.meta deleted file mode 100644 index 4220934fc..000000000 --- a/Source/Assets/TouchScript/Scripts/Layers/Base/UILayerBase.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: b4f10ec06d7b5492dbb0bf5c2abe6c8c -timeCreated: 1470744584 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs deleted file mode 100644 index 19cf8a18a..000000000 --- a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs +++ /dev/null @@ -1,110 +0,0 @@ -/* - * @author Valentin Simonov / http://va.lent.in/ - */ - -using System; -using System.Collections.Generic; -using TouchScript.Hit; -using TouchScript.Pointers; -using UnityEngine; - -namespace TouchScript.Layers -{ - /// - /// Pointer layer which represents a 3d camera looking into the world. Determines which objects may be hit in the view of a camera attached to parent GameObject. - /// - [AddComponentMenu("TouchScript/Layers/Camera Layer")] - [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Layers_CameraLayer.htm")] - public class CameraLayer : CameraLayerBase - { - #region Private variables - -#if UNITY_5_3_OR_NEWER - private RaycastHit[] raycastHits = new RaycastHit[20]; -#endif - private List sortedHits = new List(20); - private Transform cachedTransform; - - private RaycastHitComparer comparer; - - #endregion - - #region Unity methods - - /// - protected override void Awake() - { - base.Awake(); - if (!Application.isPlaying) return; - - cachedTransform = GetComponent(); - comparer = new RaycastHitComparer(cachedTransform); - } - - #endregion - - #region Protected functions - - /// - protected override HitResult castRay(IPointer pointer, Ray ray, out HitData hit) - { - hit = default(HitData); -#if UNITY_5_3_OR_NEWER - var count = Physics.RaycastNonAlloc(ray, raycastHits, float.PositiveInfinity, LayerMask); -#else - var raycastHits = Physics.RaycastAll(ray, float.PositiveInfinity, LayerMask); - var count = raycastHits.Length; -#endif - - if (count == 0) return HitResult.Miss; - if (count > 1) - { - sortHits(raycastHits, count); - - RaycastHit raycastHit = default(RaycastHit); - for (var i = 0; i < count; i++) - { - raycastHit = sortedHits[i]; - var result = doHit(pointer, raycastHit, out hit); - if (result != HitResult.Miss) return result; - } - return HitResult.Miss; - } - return doHit(pointer, raycastHits[0], out hit); - } - - private HitResult doHit(IPointer pointer, RaycastHit raycastHit, out HitData hit) - { - hit = new HitData(raycastHit, this); - return checkHitFilters(pointer, hit); - } - - private void sortHits(RaycastHit[] hits, int count) - { - sortedHits.Clear(); - for (var i = 0; i < count; i++) sortedHits.Add(hits[i]); - sortedHits.Sort(comparer); - } - - #endregion - - private class RaycastHitComparer : IComparer - { - private Transform transform; - - public RaycastHitComparer(Transform transform) - { - this.transform = transform; - } - - public int Compare(RaycastHit a, RaycastHit b) - { - var cameraPos = transform.position; - if (a.collider.transform == b.collider.transform) return 0; - var distA = (a.point - cameraPos).sqrMagnitude; - var distB = (b.point - cameraPos).sqrMagnitude; - return distA < distB ? -1 : 1; - } - } - } -} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs.meta b/Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs.meta deleted file mode 100644 index c5644f73c..000000000 --- a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 4c21776f7e73345948c045618b3fad6f -timeCreated: 1447582130 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs b/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs deleted file mode 100644 index ede75db32..000000000 --- a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs +++ /dev/null @@ -1,127 +0,0 @@ -/* - * @author Valentin Simonov / http://va.lent.in/ - */ - -using System.Collections.Generic; -using TouchScript.Hit; -using TouchScript.Pointers; -using UnityEngine; - -namespace TouchScript.Layers -{ - /// - /// Pointer layer which works with Unity 4.3+ 2d physics. Can pick 2d objects hit by pointers in right order. - /// - [AddComponentMenu("TouchScript/Layers/Camera Layer 2D")] - [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Layers_CameraLayer2D.htm")] - public class CameraLayer2D : CameraLayerBase - { - #region Private variables - - [SerializeField] - [HideInInspector] - private int[] layerIds = new int[0]; - - private RaycastHit2D[] raycastHits = new RaycastHit2D[20]; - - private Dictionary layerById = new Dictionary(); - private List sortedHits = new List(20); - - private RaycastHit2DComparer comparer; - - #endregion - - #region Unity methods - - /// - /// Unity OnEnable callback. - /// - protected virtual void OnEnable() - { - if (!Application.isPlaying) return; - - layerById.Clear(); - for (var i = 0; i < layerIds.Length; i++) - { - var value = layerIds[i]; - if (layerById.ContainsKey(value)) continue; - layerById.Add(value, i); - } - - comparer = new RaycastHit2DComparer(layerById); - } - - #endregion - - #region Protected functions - - /// - protected override HitResult castRay(IPointer pointer, Ray ray, out HitData hit) - { - hit = default(HitData); - var count = Physics2D.GetRayIntersectionNonAlloc(ray, raycastHits, float.PositiveInfinity, LayerMask); - - if (count == 0) return HitResult.Miss; - if (count > 1) - { - sortHits(raycastHits, count); - - RaycastHit2D raycastHit = default(RaycastHit2D); - for (var i = 0; i < count; i++) - { - raycastHit = sortedHits[i]; - var result = doHit(pointer, raycastHit, out hit); - if (result != HitResult.Miss) return result; - } - return HitResult.Miss; - } - return doHit(pointer, raycastHits[0], out hit); - } - - private HitResult doHit(IPointer pointer, RaycastHit2D raycastHit, out HitData hit) - { - hit = new HitData(raycastHit, this); - return checkHitFilters(pointer, hit); - } - - private void sortHits(RaycastHit2D[] hits, int count) - { - sortedHits.Clear(); - for (var i = 0; i < count; i++) sortedHits.Add(hits[i]); - sortedHits.Sort(comparer); - } - - #endregion - - private class RaycastHit2DComparer : IComparer - { - private Dictionary layerById; - - public RaycastHit2DComparer(Dictionary layerById) - { - this.layerById = layerById; - } - - public int Compare(RaycastHit2D a, RaycastHit2D b) - { - if (a.collider.transform == b.collider.transform) return 0; - - var sprite1 = a.transform.GetComponent(); - var sprite2 = b.transform.GetComponent(); - if (sprite1 != null && sprite2 != null) - { - int s1Id, s2Id; - if (!layerById.TryGetValue(sprite1.sortingLayerID, out s1Id)) s1Id = 0; - if (!layerById.TryGetValue(sprite2.sortingLayerID, out s2Id)) s2Id = 0; - if (s1Id < s2Id) return 1; - if (s1Id > s2Id) return -1; - if (sprite1.sortingOrder < sprite2.sortingOrder) return 1; - if (sprite1.sortingOrder > sprite2.sortingOrder) return -1; - } - - return a.distance < b.distance ? -1 : 1; - } - } - - } -} diff --git a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs.meta b/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs.meta deleted file mode 100644 index 84ad2e515..000000000 --- a/Source/Assets/TouchScript/Scripts/Layers/CameraLayer2D.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: a2c791a2415314ea3b9f44592097a9d1 -timeCreated: 1447582130 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Layers/CameraLayerBase.cs b/Source/Assets/TouchScript/Scripts/Layers/CameraLayerBase.cs deleted file mode 100644 index c7e78af67..000000000 --- a/Source/Assets/TouchScript/Scripts/Layers/CameraLayerBase.cs +++ /dev/null @@ -1,120 +0,0 @@ -/* - * @author Valentin Simonov / http://va.lent.in/ - */ - -using System; -using TouchScript.Hit; -using TouchScript.Pointers; -using UnityEngine; - -namespace TouchScript.Layers -{ - /// - /// Abstract base class for camera-based layers. - /// - public abstract class CameraLayerBase : TouchLayer - { - #region Public properties - - /// - /// Gets or sets the layer mask which is used to select layers which should be touchable from this layer. - /// - /// A mask to exclude objects from possibly touchable list. - public LayerMask LayerMask - { - get { return layerMask; } - set { layerMask = value; } - } - - /// - public override Vector3 WorldProjectionNormal - { - get - { - if (_camera == null) return Vector3.forward; - return _camera.transform.forward; - } - } - - #endregion - - #region Private variables - - [SerializeField] - private LayerMask layerMask = -1; - - /// - /// Camera. - /// - protected Camera _camera; - - #endregion - - #region Public methods - - /// - public override HitResult Hit(IPointer pointer, out HitData hit) - { - if (base.Hit(pointer, out hit) != HitResult.Hit) return HitResult.Miss; - - if (_camera == null) return HitResult.Miss; - if (_camera.enabled == false || _camera.gameObject.activeInHierarchy == false) return HitResult.Miss; - var position = pointer.Position; - if (!_camera.pixelRect.Contains(position)) return HitResult.Miss; - - var ray = _camera.ScreenPointToRay(position); - var result = castRay(pointer, ray, out hit); - if (result != HitResult.Hit) hit = default(HitData); - return result; - } - - #endregion - - #region Unity methods - - /// - protected override void Awake() - { - updateCamera(); - base.Awake(); - } - - #endregion - - #region Protected functions - - /// - protected override void setName() - { - if (string.IsNullOrEmpty(Name) && _camera != null) Name = _camera.name; - } - - /// - protected override ProjectionParams createProjectionParams() - { - return new CameraProjectionParams(_camera); - } - - /// - /// Finds a camera. - /// - protected virtual void updateCamera() - { - _camera = GetComponent(); - if (_camera == null) _camera = Camera.main; - if (_camera != null) return; - Debug.LogError("No Camera found for CameraLayer '" + name + "'."); - enabled = false; - } - - /// - /// Casts a ray from camera position. - /// - /// The ray. - /// Hit information if the ray has hit something. - /// Hit result. - protected abstract HitResult castRay(IPointer pointer, Ray ray, out HitData hit); - - #endregion - } -} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Layers/CameraLayerBase.cs.meta b/Source/Assets/TouchScript/Scripts/Layers/CameraLayerBase.cs.meta deleted file mode 100644 index 852f41394..000000000 --- a/Source/Assets/TouchScript/Scripts/Layers/CameraLayerBase.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: fead2d18a248a4d27b0bbe07cbf3035d -timeCreated: 1447582131 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Layers/UICameraLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/UICameraLayer.cs deleted file mode 100644 index 7ce68509b..000000000 --- a/Source/Assets/TouchScript/Scripts/Layers/UICameraLayer.cs +++ /dev/null @@ -1,62 +0,0 @@ -/* - * @author Valentin Simonov / http://va.lent.in/ - */ - -using System.Collections.Generic; -using TouchScript.Layers.Base; -using TouchScript.Pointers; -using UnityEngine; - -namespace TouchScript.Layers -{ - /// - /// Pointer layer which handles Unity UI and interface objects in a Canvas. - /// - [AddComponentMenu("TouchScript/Layers/UI Layer")] - [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Layers_UILayer.htm")] - public class UICameraLayer : UILayerBase - { - #region Private variables - - private Dictionary projectionParamsCache = new Dictionary(); - - #endregion - - #region Public methods - - /// - public override ProjectionParams GetProjectionParams(Pointer pointer) - { - var graphic = pointer.GetPressData().RaycastHitUI.Graphic; - if (graphic == null) return layerProjectionParams; - var canvas = graphic.canvas; - if (canvas == null) return layerProjectionParams; - - ProjectionParams pp; - if (!projectionParamsCache.TryGetValue(canvas.GetInstanceID(), out pp)) - { - // TODO: memory leak - pp = new WorldSpaceCanvasProjectionParams(canvas); - projectionParamsCache.Add(canvas.GetInstanceID(), pp); - } - return pp; - } - - #endregion - - #region Protected functions - - /// - protected override void setName() - { - Name = "UI Camera Layer"; - } - - protected override bool filterCanvas(Canvas canvas) - { - return canvas == null || canvas.renderMode == RenderMode.ScreenSpaceOverlay; - } - - #endregion - } -} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Layers/UICameraLayer.cs.meta b/Source/Assets/TouchScript/Scripts/Layers/UICameraLayer.cs.meta deleted file mode 100644 index 0c3d36583..000000000 --- a/Source/Assets/TouchScript/Scripts/Layers/UICameraLayer.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 26a72f9b3b6704180978dbce08cf231e -timeCreated: 1447582130 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Layers/UIOverlayLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/UIOverlayLayer.cs deleted file mode 100644 index 2f465f5b2..000000000 --- a/Source/Assets/TouchScript/Scripts/Layers/UIOverlayLayer.cs +++ /dev/null @@ -1,28 +0,0 @@ -/* - * @author Valentin Simonov / http://va.lent.in/ - */ - -using TouchScript.Layers.Base; -using UnityEngine; - -namespace TouchScript.Layers -{ - [AddComponentMenu("TouchScript/Layers/UI Overlay Layer")] - public class UIOverlayLayer : UILayerBase - { - #region Protected functions - - /// - protected override void setName() - { - Name = "UI Overlay Layer"; - } - - protected override bool filterCanvas(Canvas canvas) - { - return canvas == null || canvas.renderMode != RenderMode.ScreenSpaceOverlay; - } - - #endregion - } -} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Layers/UIOverlayLayer.cs.meta b/Source/Assets/TouchScript/Scripts/Layers/UIOverlayLayer.cs.meta deleted file mode 100644 index c65b1af9f..000000000 --- a/Source/Assets/TouchScript/Scripts/Layers/UIOverlayLayer.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 4ad2b146e2cb148fdad573d18694ff59 -timeCreated: 1470651932 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: From 20d0d6bcde098cfcd120ce0891689d8b3ed769f3 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 30 Oct 2016 03:30:58 +0300 Subject: [PATCH 101/211] Improved EventSystem handling in TSInputModule since it might be not yet initialized when needed. --- .../Layers/UI/TouchScriptInputModule.cs | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs index 3f069c854..d0f389c76 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs @@ -23,13 +23,21 @@ public static TouchScriptInputModule Instance { get { + if (shuttingDown) return null; if (instance == null) { - if (EventSystem.current != null) - { - instance = EventSystem.current.GetComponent(); - if (instance == null) instance = EventSystem.current.gameObject.AddComponent(); - } + var es = EventSystem.current; + if (es == null) + { + es = FindObjectOfType(); + if (es == null) + { + var go = new GameObject("EventSystem"); + es = go.AddComponent(); + } + } + instance = es.GetComponent(); + if (instance == null) instance = es.gameObject.AddComponent(); } return instance; } @@ -46,6 +54,7 @@ public static TouchScriptInputModule Instance #region Private variables + private static bool shuttingDown = false; private static TouchScriptInputModule instance; private static FieldInfo raycastersProp; private static PropertyInfo canvasProp; @@ -91,6 +100,11 @@ protected override void OnDisable() base.OnDisable(); } + private void OnApplicationQuit() + { + shuttingDown = true; + } + #endregion #region Public methods @@ -114,7 +128,7 @@ public Canvas GetCanvasForRaycaster(BaseRaycaster raycaster) public override void Process() { - ui.Process(); + if (ui != null) ui.Process(); } public override bool IsPointerOverGameObject(int pointerId) From 788fa5ff3541fff0018184c64a3d47cf262344b6 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 30 Oct 2016 03:31:24 +0300 Subject: [PATCH 102/211] Creating an instance of StandardLayer on start if needed. --- Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs index 47e1726d5..61660dad4 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs @@ -618,8 +618,8 @@ private void createCameraLayer() { if (Application.isEditor) Debug.Log( - "[TouchScript] No camera layer found, adding CameraLayer for the main camera. (this message is harmless)"); - var layer = Camera.main.gameObject.AddComponent(); + "[TouchScript] No touch layers found, adding StandardLayer for the main camera. (this message is harmless)"); + var layer = Camera.main.gameObject.AddComponent(); AddLayer(layer); } } From f896eb63c3f6a94b0fbdd8d4c7fa918f72ec2706 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 30 Oct 2016 03:31:38 +0300 Subject: [PATCH 103/211] Optimizations for StandardLayer. --- .../Scripts/Layers/StandardLayer.cs | 280 ++++++++++-------- 1 file changed, 160 insertions(+), 120 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs b/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs index 22b880ab3..4a71247b7 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs @@ -10,6 +10,7 @@ using TouchScript.Pointers; using UnityEngine.EventSystems; using UnityEngine.UI; +using System.Collections; namespace TouchScript.Layers { @@ -22,19 +23,31 @@ public class StandardLayer : TouchLayer public bool LookFor3DObjects { get { return lookFor3DObjects; } - set { lookFor3DObjects = value; } + set + { + lookFor3DObjects = value; + updateVariants(); + } } public bool LookFor2DObjects { get { return lookFor2DObjects; } - set { lookFor2DObjects = value; } + set + { + lookFor2DObjects = value; + updateVariants(); + } } public bool LookForWorldSpaceUI { get { return lookForWorldSpaceUI; } - set { lookForWorldSpaceUI = value; } + set + { + lookForWorldSpaceUI = value; + updateVariants(); + } } public bool LookForScreenSpaceUI @@ -43,6 +56,12 @@ public bool LookForScreenSpaceUI set { lookForScreenSpaceUI = value; } } + public bool UseHitFilters + { + get { return useHitFilters; } + set { useHitFilters = value; } + } + /// /// Gets or sets the layer mask which is used to select layers which should be touchable from this layer. /// @@ -72,7 +91,7 @@ public override Vector3 WorldProjectionNormal private static Comparison _hitDataComparerFunc = hitDataComparerFunc; private static Dictionary projectionParamsCache = new Dictionary(); - private static List raycasters; + private static List raycasters; private static List raycastHitUIList = new List(20); private static List raycastHitList = new List(20); @@ -89,7 +108,7 @@ public override Vector3 WorldProjectionNormal private bool lookFor2DObjects = false; [SerializeField] - private bool lookForWorldSpaceUI = true; + private bool lookForWorldSpaceUI = false; [SerializeField] private bool lookForScreenSpaceUI = true; @@ -97,6 +116,11 @@ public override Vector3 WorldProjectionNormal [SerializeField] private LayerMask layerMask = -1; + [SerializeField] + private bool useHitFilters = false; + + private bool lookForCameraObjects = false; + /// /// Camera. /// @@ -110,7 +134,7 @@ public override HitResult Hit(IPointer pointer, out HitData hit) { if (base.Hit(pointer, out hit) != HitResult.Hit) return HitResult.Miss; - HitResult result = HitResult.Miss; + var result = HitResult.Miss; if (lookForScreenSpaceUI) { @@ -125,7 +149,7 @@ public override HitResult Hit(IPointer pointer, out HitData hit) } } - if (_camera != null && (lookFor3DObjects || lookFor2DObjects || lookForWorldSpaceUI)) + if (lookForCameraObjects) { result = performWorldSearch(pointer, out hit); switch (result) @@ -138,7 +162,6 @@ public override HitResult Hit(IPointer pointer, out HitData hit) } } - hit = default(HitData); return HitResult.Miss; } @@ -146,8 +169,8 @@ public override HitResult Hit(IPointer pointer, out HitData hit) public override ProjectionParams GetProjectionParams(Pointer pointer) { var press = pointer.GetPressData(); - if (press.Type == HitData.HitType.World2D || - press.Type == HitData.HitType.World3D) + if ((press.Type == HitData.HitType.World2D) || + (press.Type == HitData.HitType.World3D)) return layerProjectionParams; var graphic = press.RaycastHitUI.Graphic; @@ -173,17 +196,24 @@ public override ProjectionParams GetProjectionParams(Pointer pointer) protected override void Awake() { updateCamera(); + updateVariants(); base.Awake(); } private void OnEnable() { if (!Application.isPlaying) return; - - if (TouchScriptInputModule.Instance != null) TouchScriptInputModule.Instance.INTERNAL_Retain(); TouchManager.Instance.FrameStarted += frameStartedHandler; + StartCoroutine(lateEnable()); } + private IEnumerator lateEnable() + { + // Need to wait while EventSystem initializes + yield return new WaitForEndOfFrame(); + if (TouchScriptInputModule.Instance != null) TouchScriptInputModule.Instance.INTERNAL_Retain(); + } + private void OnDisable() { if (!Application.isPlaying) return; @@ -213,128 +243,120 @@ protected override ProjectionParams createProjectionParams() protected override void setName() { if (string.IsNullOrEmpty(Name)) - { if (_camera != null) Name = _camera.name; else Name = "Layer"; - } } #endregion #region Private functions - private HitResult performSSUISearch(IPointer pointer, out HitData hit) - { - hit = default(HitData); - - raycastHitUIList.Clear(); - - if (raycasters == null) raycasters = TouchScriptInputModule.Instance.GetRaycasters(); - var count = raycasters.Count; - - for (var i = 0; i < count; i++) - { - var raycaster = raycasters[i] as GraphicRaycaster; - if (raycaster == null) continue; - var canvas = TouchScriptInputModule.Instance.GetCanvasForRaycaster(raycaster); // TODO: cache - if (canvas == null || canvas.renderMode != RenderMode.ScreenSpaceOverlay) continue; - performUISearchForCanvas(pointer, canvas, raycaster); - } - - count = raycastHitUIList.Count; - if (count == 0) return HitResult.Miss; - if (count > 1) - { - raycastHitUIList.Sort(_raycastHitUIComparerFunc); - for (var i = 0; i < count; ++i) - { - var result = doHit(pointer, raycastHitUIList[i], out hit); - if (result != HitResult.Miss) return result; - } - return HitResult.Miss; - } - return doHit(pointer, raycastHitUIList[0], out hit); - } - private HitResult performWorldSearch(IPointer pointer, out HitData hit) { hit = default(HitData); if (_camera == null) return HitResult.Miss; - if (_camera.enabled == false || _camera.gameObject.activeInHierarchy == false) return HitResult.Miss; + if ((_camera.enabled == false) || (_camera.gameObject.activeInHierarchy == false)) return HitResult.Miss; var position = pointer.Position; if (!_camera.pixelRect.Contains(position)) return HitResult.Miss; hitList.Clear(); var ray = _camera.ScreenPointToRay(position); - var searchDistance = float.MaxValue; - var result3D = HitResult.Miss; + int count; + if (lookFor3DObjects) { - result3D = perform3DSearch(pointer, ray, out hit); - if (result3D != HitResult.Miss) searchDistance = hit.Distance; - } - if (lookFor2DObjects) perform2DSearch(ray, searchDistance); - if (lookForWorldSpaceUI) performWSUISearch(pointer, ray, searchDistance); - - var count = hitList.Count; - if (hitList.Count == 0) return result3D; +#if UNITY_5_3_OR_NEWER + count = Physics.RaycastNonAlloc(ray, raycastHits, float.PositiveInfinity, layerMask); +#else + var raycastHits = Physics.RaycastAll(ray, float.PositiveInfinity, layerMask); + var count = raycastHits.Length; +#endif - if (count > 1) - { - hitList.Sort(_hitDataComparerFunc); - for (var i = 0; i < count; ++i) + // Try to do some optimizations if 2D and WS UI are not required + if (!lookFor2DObjects && !lookForWorldSpaceUI) { - hit = hitList[i]; - var result = checkHitFilters(pointer, hit); - if (result != HitResult.Miss) return result; + if (count == 0) return HitResult.Miss; + if (count > 1) + { + raycastHitList.Clear(); + for (var i = 0; i < count; i++) raycastHitList.Add(raycastHits[i]); + raycastHitList.Sort(_raycastHitComparerFunc); + if (useHitFilters) + { + for (var i = 0; i < count; i++) + { + var result = doHit(pointer, raycastHitList[i], out hit); + if (result != HitResult.Miss) return result; + } + return HitResult.Miss; + } + hit = new HitData(raycastHitList[0], this); + return HitResult.Hit; + } + if (useHitFilters) return doHit(pointer, raycastHits[0], out hit); + hit = new HitData(raycastHits[0], this); + return HitResult.Hit; } - return HitResult.Miss; + for (var i = 0; i < count; i++) hitList.Add(new HitData(raycastHits[i], this)); } - hit = hitList[0]; - return checkHitFilters(pointer, hit); - } - private HitResult perform3DSearch(IPointer pointer, Ray ray, out HitData hit) - { - hit = default(HitData); -#if UNITY_5_3_OR_NEWER - var count = Physics.RaycastNonAlloc(ray, raycastHits, float.PositiveInfinity, layerMask); -#else - var raycastHits = Physics.RaycastAll(ray, float.PositiveInfinity, layerMask); - var count = raycastHits.Length; -#endif - if (count == 0) return HitResult.Miss; - if (count > 1) + if (lookFor2DObjects) + { + count = Physics2D.GetRayIntersectionNonAlloc(ray, raycastHits2D, float.MaxValue, layerMask); + for (var i = 0; i < count; i++) hitList.Add(new HitData(raycastHits2D[i], this)); + } + + if (lookForWorldSpaceUI) { - raycastHitList.Clear(); - for (var i = 0; i < count; i++) raycastHitList.Add(raycastHits[i]); - raycastHitList.Sort(_raycastHitComparerFunc); + raycastHitUIList.Clear(); + if (raycasters == null) raycasters = TouchScriptInputModule.Instance.GetRaycasters(); + count = raycasters.Count; - RaycastHit raycastHit = default(RaycastHit); for (var i = 0; i < count; i++) { - raycastHit = raycastHitList[i]; - var result = doHit(pointer, raycastHit, out hit); - if (result != HitResult.Miss) return result; + var raycaster = raycasters[i] as GraphicRaycaster; + 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); } - return HitResult.Miss; + + count = raycastHitUIList.Count; + for (var i = 0; i < count; i++) hitList.Add(new HitData(raycastHitUIList[i], this)); } - return doHit(pointer, raycastHits[0], out hit); - } - private void perform2DSearch(Ray ray, float maxDistance) - { - var count = Physics2D.GetRayIntersectionNonAlloc(ray, raycastHits2D, maxDistance, layerMask); - for (var i = 0; i < count; i++) + count = hitList.Count; + if (hitList.Count == 0) return HitResult.Miss; + if (count > 1) { - hitList.Add(new HitData(raycastHits2D[i], this)); + hitList.Sort(_hitDataComparerFunc); + if (useHitFilters) + { + for (var i = 0; i < count; ++i) + { + hit = hitList[i]; + var result = checkHitFilters(pointer, hit); + if (result != HitResult.Miss) return result; + } + return HitResult.Miss; + } + else + { + hit = hitList[0]; + return HitResult.Hit; + } } + hit = hitList[0]; + if (useHitFilters) return checkHitFilters(pointer, hit); + return HitResult.Hit; } - private void performWSUISearch(IPointer pointer, Ray ray, float maxDistance) + private HitResult performSSUISearch(IPointer pointer, out HitData hit) { + hit = default(HitData); + raycastHitUIList.Clear(); if (raycasters == null) raycasters = TouchScriptInputModule.Instance.GetRaycasters(); @@ -345,15 +367,30 @@ private void performWSUISearch(IPointer pointer, Ray ray, float maxDistance) var raycaster = raycasters[i] as GraphicRaycaster; 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, maxDistance, ray); + if ((canvas == null) || (canvas.renderMode != RenderMode.ScreenSpaceOverlay)) continue; + performUISearchForCanvas(pointer, canvas, raycaster); } count = raycastHitUIList.Count; - for (var i = 0; i < count; i++) + if (count == 0) return HitResult.Miss; + if (count > 1) { - hitList.Add(new HitData(raycastHitUIList[i], this)); + raycastHitUIList.Sort(_raycastHitUIComparerFunc); + if (useHitFilters) + { + for (var i = 0; i < count; ++i) + { + var result = doHit(pointer, raycastHitUIList[i], out hit); + if (result != HitResult.Miss) return result; + } + 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; } private void performUISearchForCanvas(IPointer pointer, Canvas canvas, GraphicRaycaster raycaster, float maxDistance = float.MaxValue, Ray ray = default(Ray)) @@ -362,14 +399,14 @@ private void performWSUISearch(IPointer pointer, Ray ray, float maxDistance) var eventCamera = canvas.worldCamera; var foundGraphics = GraphicRegistry.GetGraphicsForCanvas(canvas); var count2 = foundGraphics.Count; - for (int j = 0; j < count2; j++) + for (var j = 0; j < count2; j++) { - Graphic graphic = foundGraphics[j]; - - if (layerMask.value != -1 && (layerMask.value & 1 << graphic.gameObject.layer) == 0) continue; + var graphic = foundGraphics[j]; + + if ((layerMask.value != -1) && ((layerMask.value & (1 << graphic.gameObject.layer)) == 0)) continue; // -1 means it hasn't been processed by the canvas, which means it isn't actually drawn - if (graphic.depth == -1 || !graphic.raycastTarget) + if ((graphic.depth == -1) || !graphic.raycastTarget) continue; if (!RectTransformUtility.RectangleContainsScreenPoint(graphic.rectTransform, position, eventCamera)) @@ -379,7 +416,6 @@ private void performWSUISearch(IPointer pointer, Ray ray, float maxDistance) { var t = graphic.transform; if (raycaster.ignoreReversedGraphics) - { if (eventCamera == null) { // If we dont have a camera we know that we should always be facing forward @@ -393,16 +429,15 @@ private void performWSUISearch(IPointer pointer, Ray ray, float maxDistance) var dir = t.rotation * Vector3.forward; if (Vector3.Dot(cameraFoward, dir) <= 0) continue; } - } float distance = 0; - if (eventCamera == null || canvas.renderMode == RenderMode.ScreenSpaceOverlay) {} + if ((eventCamera == null) || (canvas.renderMode == RenderMode.ScreenSpaceOverlay)) { } else { - Vector3 transForward = t.forward; + var transForward = t.forward; // http://geomalgorithms.com/a06-_intersect-2.html - distance = (Vector3.Dot(transForward, t.position - ray.origin) / Vector3.Dot(transForward, ray.direction)); + distance = Vector3.Dot(transForward, t.position - ray.origin) / Vector3.Dot(transForward, ray.direction); // Check to see if the go is behind the camera. if (distance < 0) continue; @@ -437,6 +472,11 @@ private HitResult doHit(IPointer pointer, RaycastHit raycastHit, out HitData hit return checkHitFilters(pointer, hit); } + private void updateVariants() + { + lookForCameraObjects = _camera != null && (lookFor3DObjects || lookFor2DObjects || lookForWorldSpaceUI); + } + #endregion #region Compare functions @@ -465,7 +505,6 @@ private static int raycastHitUIComparerFunc(RaycastHitUI lhs, RaycastHitUI rhs) private static int raycastHitComparerFunc(RaycastHit lhs, RaycastHit rhs) { - if (lhs.collider.transform == rhs.collider.transform) return 0; return lhs.distance < rhs.distance ? -1 : 1; } @@ -482,18 +521,19 @@ private static int hitDataComparerFunc(HitData lhs, HitData rhs) if (lhs.SortingOrder != rhs.SortingOrder) return rhs.SortingOrder.CompareTo(lhs.SortingOrder); - if (lhs.Type == HitData.HitType.UI && rhs.Type == HitData.HitType.UI && - lhs.RaycastHitUI.Depth != rhs.RaycastHitUI.Depth) - return rhs.RaycastHitUI.Depth.CompareTo(lhs.RaycastHitUI.Depth); + if ((lhs.Type == HitData.HitType.UI) && (rhs.Type == HitData.HitType.UI)) + { + if (lhs.RaycastHitUI.Depth != rhs.RaycastHitUI.Depth) + return rhs.RaycastHitUI.Depth.CompareTo(lhs.RaycastHitUI.Depth); - if (!Mathf.Approximately(lhs.Distance, rhs.Distance)) - return lhs.Distance.CompareTo(rhs.Distance); + if (!Mathf.Approximately(lhs.Distance, rhs.Distance)) + return lhs.Distance.CompareTo(rhs.Distance); - if (lhs.Type == HitData.HitType.UI && rhs.Type == HitData.HitType.UI && - lhs.RaycastHitUI.GraphicIndex != rhs.RaycastHitUI.GraphicIndex) - return rhs.RaycastHitUI.GraphicIndex.CompareTo(lhs.RaycastHitUI.GraphicIndex); + if (lhs.RaycastHitUI.GraphicIndex != rhs.RaycastHitUI.GraphicIndex) + return rhs.RaycastHitUI.GraphicIndex.CompareTo(lhs.RaycastHitUI.GraphicIndex); + } - return 0; + return lhs.Distance < rhs.Distance ? -1 : 1; } #endregion From 285b6514636ff8389ce1f13a5e18ea8bef4e2646 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 30 Oct 2016 03:53:45 +0300 Subject: [PATCH 104/211] Added images to examples. --- .../Examples/Checkers/Checkers.unity | 130 +- .../TouchScript/Examples/Examples.unity | 1192 +++++++++++++---- .../TouchScript/Examples/Photos/Photos.unity | 514 ++++--- .../TouchScript/Examples/Portal/Portal.unity | 204 +-- .../Examples/_misc/Textures/Examples.meta | 9 + .../_misc/Textures/Examples/Camera.png | Bin 0 -> 9538 bytes .../_misc/Textures/Examples/Camera.png.meta | 58 + .../_misc/Textures/Examples/Checkers.png | Bin 0 -> 9812 bytes .../_misc/Textures/Examples/Checkers.png.meta | 58 + .../_misc/Textures/Examples/Colors.png | Bin 0 -> 8847 bytes .../_misc/Textures/Examples/Colors.png.meta | 58 + .../Examples/_misc/Textures/Examples/Cube.png | Bin 0 -> 9226 bytes .../_misc/Textures/Examples/Cube.png.meta | 58 + .../_misc/Textures/Examples/Multiuser.png | Bin 0 -> 11116 bytes .../Textures/Examples/Multiuser.png.meta | 58 + .../_misc/Textures/Examples/Photos.png | Bin 0 -> 9774 bytes .../_misc/Textures/Examples/Photos.png.meta | 58 + .../_misc/Textures/Examples/Portal.png | Bin 0 -> 7719 bytes .../_misc/Textures/Examples/Portal.png.meta | 58 + .../_misc/Textures/Examples/RawInput.png | Bin 0 -> 7775 bytes .../_misc/Textures/Examples/RawInput.png.meta | 58 + .../Examples/_misc/Textures/Examples/Taps.png | Bin 0 -> 8369 bytes .../_misc/Textures/Examples/Taps.png.meta | 58 + 23 files changed, 1965 insertions(+), 606 deletions(-) create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/Examples.meta create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Camera.png create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Camera.png.meta create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Checkers.png create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Checkers.png.meta create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Colors.png create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Colors.png.meta create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Cube.png create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Cube.png.meta create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Multiuser.png create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Multiuser.png.meta create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Photos.png create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Photos.png.meta create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Portal.png create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Portal.png.meta create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/Examples/RawInput.png create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/Examples/RawInput.png.meta create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Taps.png create mode 100644 Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Taps.png.meta diff --git a/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity b/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity index f308fee5d..3a34293da 100644 --- a/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity +++ b/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity @@ -8,25 +8,25 @@ SceneSettings: m_PVSPortalsArray: [] m_OcclusionBakeSettings: smallestOccluder: 5 - smallestHole: .25 + smallestHole: 0.25 backfaceThreshold: 100 --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 serializedVersion: 6 m_Fog: 0 - m_FogColor: {r: .5, g: .5, b: .5, a: 1} + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 - m_FogDensity: .00999999978 + m_FogDensity: 0.01 m_LinearFogStart: 0 m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: .200000003, g: .200000003, b: .200000003, a: 1} - m_AmbientEquatorColor: {r: .200000003, g: .200000003, b: .200000003, a: 1} - m_AmbientGroundColor: {r: .200000003, g: .200000003, b: .200000003, a: 1} + 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_SkyboxMaterial: {fileID: 2100000, guid: a07fadb24ea940240afba3afc1a692cc, type: 2} - m_HaloStrength: .5 + m_HaloStrength: 0.5 m_FlareStrength: 1 m_FlareFadeSpeed: 3 m_HaloTexture: {fileID: 0} @@ -40,7 +40,7 @@ RenderSettings: --- !u!157 &4 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 5 + serializedVersion: 6 m_GIWorkflowMode: 1 m_LightmapsMode: 1 m_GISettings: @@ -66,7 +66,7 @@ LightmapSettings: m_FinalGather: 0 m_FinalGatherRayCount: 1024 m_ReflectionCompression: 2 - m_LightmapSnapshot: {fileID: 0} + m_LightingDataAsset: {fileID: 0} m_RuntimeCPUUsage: 25 --- !u!196 &5 NavMeshSettings: @@ -74,15 +74,15 @@ NavMeshSettings: m_ObjectHideFlags: 0 m_BuildSettings: serializedVersion: 2 - agentRadius: .5 + agentRadius: 0.5 agentHeight: 2 agentSlope: 45 - agentClimb: .400000006 + agentClimb: 0.4 ledgeDropHeight: 0 maxJumpAcrossDistance: 0 accuratePlacement: 0 minRegionArea: 2 - cellSize: .166666657 + cellSize: 0.16666666 manualCellSize: 0 m_NavMeshData: {fileID: 0} --- !u!1 &12619638 stripped @@ -165,9 +165,10 @@ Transform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 62216951} - m_LocalRotation: {x: .269457936, y: 0, z: 0, w: .963012159} - m_LocalPosition: {x: -1.11000001, y: 7.78999996, z: -14.4399996} + 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 @@ -190,6 +191,7 @@ MonoBehaviour: layerMask: serializedVersion: 2 m_Bits: 4294967295 + useHitFilters: 0 --- !u!81 &62216954 AudioListener: m_ObjectHideFlags: 0 @@ -227,7 +229,7 @@ Camera: y: 0 width: 1 height: 1 - near clip plane: .300000012 + near clip plane: 0.3 far clip plane: 40 field of view: 30 orthographic: 0 @@ -243,7 +245,7 @@ Camera: m_HDR: 0 m_OcclusionCulling: 1 m_StereoConvergence: 10 - m_StereoSeparation: .0219999999 + m_StereoSeparation: 0.022 m_StereoMirrorMode: 0 --- !u!4 &235575575 stripped Transform: @@ -275,6 +277,7 @@ 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 @@ -282,7 +285,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} m_SizeDelta: {x: 60, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &242343087 MonoBehaviour: m_ObjectHideFlags: 0 @@ -361,6 +364,7 @@ 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} @@ -371,7 +375,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &292077922 stripped GameObject: m_PrefabParentObject: {fileID: 191238, guid: bb0a05fd2c374477cba1d93212b4600c, type: 2} @@ -482,7 +486,7 @@ Prefab: - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: layers.Array.data[0] value: - objectReference: {fileID: 0} + objectReference: {fileID: 62216953} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} m_IsPrefabParent: 0 @@ -831,14 +835,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} - m_SizeDelta: {x: 204.699997, y: 0} - m_Pivot: {x: .5, y: .5} + m_SizeDelta: {x: 204.7, y: 0} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &724610590 MonoBehaviour: m_ObjectHideFlags: 0 @@ -880,6 +885,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -921,6 +927,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: - {fileID: 1981142013} - {fileID: 1552723601} @@ -967,8 +974,10 @@ Canvas: m_ReceivesEvents: 1 m_OverrideSorting: 0 m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 m_SortingLayerID: 0 m_SortingOrder: 0 + m_TargetDisplay: 0 --- !u!1001 &746500663 Prefab: m_ObjectHideFlags: 0 @@ -1082,6 +1091,7 @@ 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} @@ -1091,7 +1101,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &841877614 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1140,14 +1150,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 36.7700005, y: 0} + m_AnchoredPosition: {x: 36.77, y: 0} m_SizeDelta: {x: 28, y: -28} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &900258189 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1279,6 +1290,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: - {fileID: 2135305920} - {fileID: 62216952} @@ -1298,7 +1310,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Target: {fileID: 496670577} - Color: {r: .944827557, g: 1, b: 0, a: 1} + Color: {r: 0.94482756, g: 1, b: 0, a: 1} --- !u!1001 &997919739 Prefab: m_ObjectHideFlags: 0 @@ -1436,6 +1448,7 @@ 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 @@ -1443,7 +1456,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} m_SizeDelta: {x: 60, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1138005901 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1570,14 +1583,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} - m_SizeDelta: {x: 204.699997, y: 0} - m_Pivot: {x: .5, y: .5} + m_SizeDelta: {x: 204.7, y: 0} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1399100005 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1605,6 +1619,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -1701,14 +1716,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} - m_SizeDelta: {x: 204.699997, y: 0} - m_Pivot: {x: .5, y: .5} + m_SizeDelta: {x: 204.7, y: 0} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1408280582 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1736,6 +1752,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -1911,6 +1928,7 @@ 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 @@ -1918,7 +1936,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 178, y: 78} m_SizeDelta: {x: 320, y: 128} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1552723602 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1946,6 +1964,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 0 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -2106,6 +2125,7 @@ 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} @@ -2115,7 +2135,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1679844151 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2219,6 +2239,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: 4 @@ -2386,6 +2407,7 @@ 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} @@ -2395,7 +2417,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1962593005 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2526,15 +2548,16 @@ 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_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: .252637833, y: 1} + m_AnchorMax: {x: 0.25263783, y: 1} m_AnchoredPosition: {x: 5, y: 50} m_SizeDelta: {x: -10, y: -120} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!4 &1983636052 stripped Transform: m_PrefabParentObject: {fileID: 491238, guid: bb0a05fd2c374477cba1d93212b4600c, type: 2} @@ -2574,14 +2597,14 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 2 - screenTransformThreshold: .100000001 + screenTransformThreshold: 0.1 projection: 2 projectionPlaneNormal: {x: 0, y: 1, z: 0} --- !u!114 &2027571737 @@ -2605,6 +2628,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: - {fileID: 2041409367} - {fileID: 2130344072} @@ -2629,8 +2653,10 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_ScaleInLightmap: 1 m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 - m_AutoUVMaxDistance: .5 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} m_SortingLayerID: 0 @@ -2669,8 +2695,9 @@ Transform: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 2041409366} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: -.101000004, z: 0} - m_LocalScale: {x: 10, y: .200000003, z: 10} + 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 @@ -2686,7 +2713,7 @@ BoxCollider: m_Enabled: 1 serializedVersion: 2 m_Size: {x: 1, y: 1, z: 1} - m_Center: {x: 0, y: .00999999978, z: 0} + m_Center: {x: 0, y: 0.01, z: 0} --- !u!23 &2041409369 MeshRenderer: m_ObjectHideFlags: 0 @@ -2706,8 +2733,10 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_ScaleInLightmap: 1 m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 - m_AutoUVMaxDistance: .5 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} m_SortingLayerID: 0 @@ -2721,7 +2750,7 @@ Rigidbody: serializedVersion: 2 m_Mass: 1 m_Drag: 0 - m_AngularDrag: .0500000007 + m_AngularDrag: 0.05 m_UseGravity: 0 m_IsKinematic: 1 m_Interpolate: 0 @@ -2805,6 +2834,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: - {fileID: 1423153197} - {fileID: 868514750} @@ -2846,9 +2876,10 @@ Transform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 2135305919} - m_LocalRotation: {x: .241942912, y: -.49854365, z: .221075788, w: .802523136} - m_LocalPosition: {x: 6.10041475, y: 15.5403843, z: -20.5662251} + 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 @@ -2862,16 +2893,17 @@ Light: serializedVersion: 6 m_Type: 1 m_Color: {r: 1, g: 1, b: 1, a: 1} - m_Intensity: 1.29999995 + m_Intensity: 1.3 m_Range: 10 m_SpotAngle: 30 m_CookieSize: 10 m_Shadows: m_Type: 2 m_Resolution: 3 - m_Strength: .560000002 - m_Bias: .100000001 - m_NormalBias: .400000006 + 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} diff --git a/Source/Assets/TouchScript/Examples/Examples.unity b/Source/Assets/TouchScript/Examples/Examples.unity index 3dbc2bd49..d2fb4ae69 100644 --- a/Source/Assets/TouchScript/Examples/Examples.unity +++ b/Source/Assets/TouchScript/Examples/Examples.unity @@ -8,25 +8,25 @@ SceneSettings: m_PVSPortalsArray: [] m_OcclusionBakeSettings: smallestOccluder: 5 - smallestHole: .25 + smallestHole: 0.25 backfaceThreshold: 100 --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 serializedVersion: 6 m_Fog: 0 - m_FogColor: {r: .5, g: .5, b: .5, a: 1} + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 - m_FogDensity: .00999999978 + m_FogDensity: 0.01 m_LinearFogStart: 0 m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: .200000003, g: .200000003, b: .200000003, a: 1} - m_AmbientEquatorColor: {r: .200000003, g: .200000003, b: .200000003, a: 1} - m_AmbientGroundColor: {r: .200000003, g: .200000003, b: .200000003, a: 1} + 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_SkyboxMaterial: {fileID: 2100000, guid: a07fadb24ea940240afba3afc1a692cc, type: 2} - m_HaloStrength: .5 + m_HaloStrength: 0.5 m_FlareStrength: 1 m_FlareFadeSpeed: 3 m_HaloTexture: {fileID: 0} @@ -40,7 +40,7 @@ RenderSettings: --- !u!157 &4 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 5 + serializedVersion: 6 m_GIWorkflowMode: 1 m_LightmapsMode: 1 m_GISettings: @@ -66,7 +66,7 @@ LightmapSettings: m_FinalGather: 0 m_FinalGatherRayCount: 1024 m_ReflectionCompression: 2 - m_LightmapSnapshot: {fileID: 0} + m_LightingDataAsset: {fileID: 0} m_RuntimeCPUUsage: 25 --- !u!196 &5 NavMeshSettings: @@ -74,15 +74,15 @@ NavMeshSettings: m_ObjectHideFlags: 0 m_BuildSettings: serializedVersion: 2 - agentRadius: .5 + agentRadius: 0.5 agentHeight: 2 agentSlope: 45 - agentClimb: .400000006 + agentClimb: 0.4 ledgeDropHeight: 0 maxJumpAcrossDistance: 0 accuratePlacement: 0 minRegionArea: 2 - cellSize: .166666657 + cellSize: 0.16666666 manualCellSize: 0 m_NavMeshData: {fileID: 0} --- !u!1 &15691937 @@ -111,14 +111,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 15.6999969, y: -4.89999962} - m_SizeDelta: {x: -131.899994, y: -51.2000008} - m_Pivot: {x: .5, y: .5} + 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 &15691939 MonoBehaviour: m_ObjectHideFlags: 0 @@ -143,9 +144,10 @@ MonoBehaviour: m_FontSize: 8 m_FontStyle: 0 m_BestFit: 0 - m_MinSize: 10 + m_MinSize: 8 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -184,14 +186,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 15.6999969, y: -4.89999962} - m_SizeDelta: {x: -131.899994, y: -51.2000008} - m_Pivot: {x: .5, y: .5} + 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 &16824283 MonoBehaviour: m_ObjectHideFlags: 0 @@ -216,9 +219,10 @@ MonoBehaviour: m_FontSize: 8 m_FontStyle: 0 m_BestFit: 0 - m_MinSize: 10 + m_MinSize: 8 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -255,16 +259,17 @@ 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_AnchorMin: {x: .5, y: 0} - m_AnchorMax: {x: .5, y: 1} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 360, y: -60} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &37557110 MonoBehaviour: m_ObjectHideFlags: 0 @@ -305,6 +310,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: 1 @@ -345,7 +351,7 @@ Camera: y: 0 width: 1 height: 1 - near clip plane: .300000012 + near clip plane: 0.3 far clip plane: 1000 field of view: 30 orthographic: 0 @@ -361,7 +367,7 @@ Camera: m_HDR: 0 m_OcclusionCulling: 1 m_StereoConvergence: 10 - m_StereoSeparation: .0219999999 + m_StereoSeparation: 0.022 m_StereoMirrorMode: 0 --- !u!1 &96104531 GameObject: @@ -391,6 +397,7 @@ 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} @@ -438,11 +445,11 @@ MonoBehaviour: m_Transition: 1 m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: .158620954, g: 1, b: 0, a: 1} - m_PressedColor: {r: .904411793, g: .904411793, b: .904411793, a: 1} - m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + m_HighlightedColor: {r: 0.15862095, g: 1, b: 0, a: 1} + m_PressedColor: {r: 0.9044118, g: 0.9044118, b: 0.9044118, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} m_ColorMultiplier: 1 - m_FadeDuration: .100000001 + m_FadeDuration: 0.1 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} @@ -512,8 +519,6 @@ GameObject: m_Component: - 4: {fileID: 174295523} - 114: {fileID: 174295522} - - 114: {fileID: 174295521} - - 114: {fileID: 174295524} m_Layer: 0 m_Name: EventSystem m_TagString: Untagged @@ -521,23 +526,6 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &174295521 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 174295520} - 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: .5 --- !u!114 &174295522 MonoBehaviour: m_ObjectHideFlags: 0 @@ -550,7 +538,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_FirstSelected: {fileID: 0} - m_sendNavigationEvents: 1 + m_sendNavigationEvents: 0 m_DragThreshold: 5 --- !u!4 &174295523 Transform: @@ -561,27 +549,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: 1654745587} m_RootOrder: 0 ---- !u!114 &174295524 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 174295520} - m_Enabled: 0 - m_EditorHideFlags: 0 - m_Script: {fileID: 1077351063, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_HorizontalAxis: Horizontal - m_VerticalAxis: Vertical - m_SubmitButton: Submit - m_CancelButton: Cancel - m_InputActionsPerSecond: 10 - m_RepeatDelay: .5 - m_ForceModuleActive: 0 --- !u!1 &201561626 GameObject: m_ObjectHideFlags: 0 @@ -609,14 +580,15 @@ 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_AnchorMin: {x: .5, y: .5} - m_AnchorMax: {x: .5, y: .5} - m_AnchoredPosition: {x: 100, y: -4.9000001} - m_SizeDelta: {x: 36.7000008, y: 36.5999985} - m_Pivot: {x: .5, y: .5} + 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 &201561628 MonoBehaviour: m_ObjectHideFlags: 0 @@ -637,11 +609,11 @@ MonoBehaviour: m_Transition: 1 m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: .757352948, g: 1, b: .769066989, a: 1} - m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} - m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + 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: .100000001 + m_FadeDuration: 0.1 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} @@ -702,6 +674,74 @@ CanvasRenderer: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 201561626} +--- !u!1 &299753858 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 299753859} + - 222: {fileID: 299753861} + - 114: {fileID: 299753860} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &299753859 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 299753858} + m_LocalRotation: {x: 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_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 &299753860 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 299753858} + 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: 2ffae1f119ee1480785aa1061b1ab391, 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 &299753861 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 299753858} --- !u!1 &309713870 GameObject: m_ObjectHideFlags: 0 @@ -728,15 +768,16 @@ RectTransform: m_GameObject: {fileID: 309713870} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1.63333333, y: 1.63333333, z: 1.63333333} + 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -405.204102, y: -304} - m_Pivot: {x: .5, y: .5} + m_SizeDelta: {x: -405.2041, y: -304} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &309713872 MonoBehaviour: m_ObjectHideFlags: 0 @@ -776,8 +817,9 @@ MonoBehaviour: m_FontStyle: 0 m_BestFit: 1 m_MinSize: 10 - m_MaxSize: 40 + m_MaxSize: 53 m_Alignment: 4 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -816,17 +858,19 @@ 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_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: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &321008079 MonoBehaviour: m_ObjectHideFlags: 0 @@ -878,6 +922,74 @@ CanvasRenderer: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 321008077} +--- !u!1 &329812102 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 329812103} + - 222: {fileID: 329812105} + - 114: {fileID: 329812104} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &329812103 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 329812102} + m_LocalRotation: {x: 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_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 &329812104 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 329812102} + 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: 1217c44a62d504b718e8d6b10d17c0cb, 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 &329812105 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 329812102} --- !u!1 &341179472 GameObject: m_ObjectHideFlags: 0 @@ -905,14 +1017,15 @@ 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_AnchorMin: {x: .5, y: .5} - m_AnchorMax: {x: .5, y: .5} - m_AnchoredPosition: {x: 100, y: -4.9000001} - m_SizeDelta: {x: 36.7000008, y: 36.5999985} - m_Pivot: {x: .5, y: .5} + 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 &341179474 MonoBehaviour: m_ObjectHideFlags: 0 @@ -933,11 +1046,11 @@ MonoBehaviour: m_Transition: 1 m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: .757352948, g: 1, b: .769066989, a: 1} - m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} - m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + 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: .100000001 + m_FadeDuration: 0.1 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} @@ -1025,14 +1138,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 33.6999969, y: 21.6000004} - m_SizeDelta: {x: -94.8000031, y: -68.1999969} - m_Pivot: {x: .5, y: .5} + 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 &357107826 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1044,7 +1158,7 @@ MonoBehaviour: m_Script: {fileID: -900027084, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} m_Name: m_EditorClassIdentifier: - m_EffectColor: {r: 0, g: 0, b: 0, a: .5} + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.5} m_EffectDistance: {x: 1, y: -1} m_UseGraphicAlpha: 0 --- !u!114 &357107827 @@ -1074,6 +1188,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -1112,14 +1227,15 @@ 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_AnchorMin: {x: .5, y: .5} - m_AnchorMax: {x: .5, y: .5} - m_AnchoredPosition: {x: 100, y: -4.9000001} - m_SizeDelta: {x: 36.7000008, y: 36.5999985} - m_Pivot: {x: .5, y: .5} + 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 &363049656 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1140,11 +1256,11 @@ MonoBehaviour: m_Transition: 1 m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: .757352948, g: 1, b: .769066989, a: 1} - m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} - m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + 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: .100000001 + m_FadeDuration: 0.1 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} @@ -1231,14 +1347,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 15.6999969, y: -4.89999962} - m_SizeDelta: {x: -131.899994, y: -51.2000008} - m_Pivot: {x: .5, y: .5} + 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 &385551184 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1263,9 +1380,10 @@ MonoBehaviour: m_FontSize: 8 m_FontStyle: 0 m_BestFit: 0 - m_MinSize: 10 + m_MinSize: 8 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -1304,14 +1422,15 @@ 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_AnchorMin: {x: .5, y: .5} - m_AnchorMax: {x: .5, y: .5} - m_AnchoredPosition: {x: 100, y: -4.9000001} - m_SizeDelta: {x: 36.7000008, y: 36.5999985} - m_Pivot: {x: .5, y: .5} + 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 &406504772 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1332,11 +1451,11 @@ MonoBehaviour: m_Transition: 1 m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: .757352948, g: 1, b: .769066989, a: 1} - m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} - m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + 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: .100000001 + m_FadeDuration: 0.1 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} @@ -1397,6 +1516,74 @@ CanvasRenderer: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 406504770} +--- !u!1 &452970291 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 452970292} + - 222: {fileID: 452970294} + - 114: {fileID: 452970293} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &452970292 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 452970291} + m_LocalRotation: {x: 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_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 &452970293 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 452970291} + 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: d1c0e7f7a711f4935b11d81582893ee9, 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 &452970294 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 452970291} --- !u!1 &507770917 GameObject: m_ObjectHideFlags: 0 @@ -1426,7 +1613,7 @@ MonoBehaviour: m_Script: {fileID: -900027084, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} m_Name: m_EditorClassIdentifier: - m_EffectColor: {r: 0, g: 0, b: 0, a: .5} + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.5} m_EffectDistance: {x: 1, y: -1} m_UseGraphicAlpha: 0 --- !u!114 &507770919 @@ -1456,6 +1643,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -1476,14 +1664,83 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 33.6999969, y: 21.6000004} - m_SizeDelta: {x: -94.8000031, y: -68.1999969} - m_Pivot: {x: .5, y: .5} + 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!1 &558528358 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 558528359} + - 222: {fileID: 558528361} + - 114: {fileID: 558528360} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &558528359 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 558528358} + m_LocalRotation: {x: 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_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 &558528360 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 558528358} + 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: e2a00bee3078646c684013506c4f40c4, 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 &558528361 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 558528358} --- !u!1 &574950113 GameObject: m_ObjectHideFlags: 0 @@ -1511,17 +1768,19 @@ 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_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: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &574950115 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1599,14 +1858,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 15.6999969, y: -4.89999962} - m_SizeDelta: {x: -131.899994, y: -51.2000008} - m_Pivot: {x: .5, y: .5} + 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 &595145116 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1631,9 +1891,10 @@ MonoBehaviour: m_FontSize: 8 m_FontStyle: 0 m_BestFit: 0 - m_MinSize: 10 + m_MinSize: 8 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -1673,17 +1934,19 @@ 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_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: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &601448588 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1762,6 +2025,7 @@ 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} @@ -1843,17 +2107,19 @@ 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_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: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &621592927 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1930,6 +2196,7 @@ 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} @@ -1940,7 +2207,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 0} m_AnchoredPosition: {x: -141, y: 35} m_SizeDelta: {x: 259, y: 49} - m_Pivot: {x: .500000358, y: .5} + m_Pivot: {x: 0.50000036, y: 0.5} --- !u!114 &666412330 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1987,15 +2254,16 @@ 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_AnchorMin: {x: .5, y: .960771918} - m_AnchorMax: {x: .5, y: .960771918} - m_AnchoredPosition: {x: 2.09810023e-05, y: 7.39990234} - m_SizeDelta: {x: 262.600006, y: 73.2419968} - m_Pivot: {x: .5, y: .49999997} + m_AnchorMin: {x: 0.5, y: 0.9607719} + m_AnchorMax: {x: 0.5, y: 0.9607719} + m_AnchoredPosition: {x: 0.000020981002, y: 7.3999023} + m_SizeDelta: {x: 262.6, y: 73.242} + m_Pivot: {x: 0.5, y: 0.49999997} --- !u!114 &700544020 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2055,14 +2323,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 15.6999969, y: -4.89999962} - m_SizeDelta: {x: -131.899994, y: -51.2000008} - m_Pivot: {x: .5, y: .5} + 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 &745674115 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2087,9 +2356,10 @@ MonoBehaviour: m_FontSize: 8 m_FontStyle: 0 m_BestFit: 0 - m_MinSize: 10 + m_MinSize: 8 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -2127,14 +2397,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 15.6999969, y: -4.89999962} - m_SizeDelta: {x: -131.899994, y: -51.2000008} - m_Pivot: {x: .5, y: .5} + 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 &749901012 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2159,9 +2430,10 @@ MonoBehaviour: m_FontSize: 8 m_FontStyle: 0 m_BestFit: 0 - m_MinSize: 10 + m_MinSize: 8 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -2200,17 +2472,19 @@ 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_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: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &758236083 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2289,14 +2563,15 @@ 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_AnchorMin: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -31.1999969, y: -39.7001953} - m_SizeDelta: {x: 54.5, y: 54.4000015} - m_Pivot: {x: .5, y: .5} + m_AnchoredPosition: {x: -31.199997, y: -39.700195} + m_SizeDelta: {x: 54.5, y: 54.4} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &767854198 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2317,11 +2592,11 @@ MonoBehaviour: m_Transition: 1 m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 1, g: .75, b: .75, a: 1} - m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} - m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + m_HighlightedColor: {r: 1, g: 0.75, b: 0.75, 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: .100000001 + m_FadeDuration: 0.1 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} @@ -2409,14 +2684,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 33.6999969, y: 21.6000004} - m_SizeDelta: {x: -94.8000031, y: -68.1999969} - m_Pivot: {x: .5, y: .5} + 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 &801696180 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2428,7 +2704,7 @@ MonoBehaviour: m_Script: {fileID: -900027084, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} m_Name: m_EditorClassIdentifier: - m_EffectColor: {r: 0, g: 0, b: 0, a: .5} + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.5} m_EffectDistance: {x: 1, y: -1} m_UseGraphicAlpha: 0 --- !u!114 &801696181 @@ -2458,6 +2734,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -2496,14 +2773,15 @@ 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_AnchorMin: {x: .5, y: .5} - m_AnchorMax: {x: .5, y: .5} - m_AnchoredPosition: {x: 100, y: -4.9000001} - m_SizeDelta: {x: 36.7000008, y: 36.5999985} - m_Pivot: {x: .5, y: .5} + 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 &842217638 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2524,11 +2802,11 @@ MonoBehaviour: m_Transition: 1 m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: .757352948, g: 1, b: .769066989, a: 1} - m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} - m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + 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: .100000001 + m_FadeDuration: 0.1 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} @@ -2589,6 +2867,74 @@ CanvasRenderer: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 842217636} +--- !u!1 &865431077 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 865431078} + - 222: {fileID: 865431080} + - 114: {fileID: 865431079} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &865431078 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 865431077} + m_LocalRotation: {x: 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_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 &865431079 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 865431077} + 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: 5a60ebe3657034c78bd3f829dc6b132e, 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 &865431080 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 865431077} --- !u!1 &870787321 GameObject: m_ObjectHideFlags: 0 @@ -2616,17 +2962,19 @@ 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_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: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &870787323 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2705,14 +3053,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 33.6999969, y: 21.6000004} - m_SizeDelta: {x: -94.8000031, y: -68.1999969} - m_Pivot: {x: .5, y: .5} + 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 &879805662 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2724,7 +3073,7 @@ MonoBehaviour: m_Script: {fileID: -900027084, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} m_Name: m_EditorClassIdentifier: - m_EffectColor: {r: 0, g: 0, b: 0, a: .5} + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.5} m_EffectDistance: {x: 1, y: -1} m_UseGraphicAlpha: 0 --- !u!114 &879805663 @@ -2754,6 +3103,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -2792,14 +3142,15 @@ 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_AnchorMin: {x: .5, y: .5} - m_AnchorMax: {x: .5, y: .5} - m_AnchoredPosition: {x: 100, y: -4.9000001} - m_SizeDelta: {x: 36.7000008, y: 36.5999985} - m_Pivot: {x: .5, y: .5} + 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 &962873578 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2820,11 +3171,11 @@ MonoBehaviour: m_Transition: 1 m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: .757352948, g: 1, b: .769066989, a: 1} - m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} - m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + 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: .100000001 + m_FadeDuration: 0.1 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} @@ -2912,17 +3263,19 @@ 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_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: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1004776691 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3000,14 +3353,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 15.6999969, y: -4.89999962} - m_SizeDelta: {x: -131.899994, y: -51.2000008} - m_Pivot: {x: .5, y: .5} + 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 &1030186642 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3032,9 +3386,10 @@ MonoBehaviour: m_FontSize: 8 m_FontStyle: 0 m_BestFit: 0 - m_MinSize: 10 + m_MinSize: 8 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -3074,17 +3429,19 @@ 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_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: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1037999863 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3162,14 +3519,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 15.6999969, y: -4.89999962} - m_SizeDelta: {x: -131.899994, y: -51.2000008} - m_Pivot: {x: .5, y: .5} + 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 &1168732684 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3194,9 +3552,10 @@ MonoBehaviour: m_FontSize: 8 m_FontStyle: 0 m_BestFit: 0 - m_MinSize: 10 + m_MinSize: 8 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -3235,6 +3594,7 @@ 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 @@ -3242,7 +3602,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: -1} m_SizeDelta: {x: 0, y: -11} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1173809307 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3254,7 +3614,7 @@ MonoBehaviour: m_Script: {fileID: -900027084, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} m_Name: m_EditorClassIdentifier: - m_EffectColor: {r: 0, g: 0, b: 0, a: .296999991} + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.297} m_EffectDistance: {x: 1, y: -1} m_UseGraphicAlpha: 1 --- !u!114 &1173809308 @@ -3284,6 +3644,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 4 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -3321,14 +3682,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 15.6999969, y: -4.89999962} - m_SizeDelta: {x: -131.899994, y: -51.2000008} - m_Pivot: {x: .5, y: .5} + 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 &1241691653 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3353,9 +3715,10 @@ MonoBehaviour: m_FontSize: 8 m_FontStyle: 0 m_BestFit: 0 - m_MinSize: 10 + m_MinSize: 8 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -3394,14 +3757,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 33.6999969, y: 21.6000004} - m_SizeDelta: {x: -94.8000031, y: -68.1999969} - m_Pivot: {x: .5, y: .5} + 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 &1260024593 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3413,7 +3777,7 @@ MonoBehaviour: m_Script: {fileID: -900027084, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} m_Name: m_EditorClassIdentifier: - m_EffectColor: {r: 0, g: 0, b: 0, a: .5} + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.5} m_EffectDistance: {x: 1, y: -1} m_UseGraphicAlpha: 0 --- !u!114 &1260024594 @@ -3443,6 +3807,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -3481,14 +3846,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 33.6999969, y: 21.6000004} - m_SizeDelta: {x: -94.8000031, y: -68.1999969} - m_Pivot: {x: .5, y: .5} + 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 &1280257798 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3500,7 +3866,7 @@ MonoBehaviour: m_Script: {fileID: -900027084, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} m_Name: m_EditorClassIdentifier: - m_EffectColor: {r: 0, g: 0, b: 0, a: .5} + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.5} m_EffectDistance: {x: 1, y: -1} m_UseGraphicAlpha: 0 --- !u!114 &1280257799 @@ -3530,6 +3896,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -3568,6 +3935,7 @@ 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} @@ -3577,7 +3945,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: -0, y: -10} m_SizeDelta: {x: -41, y: -60} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1317055115 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3626,9 +3994,9 @@ MonoBehaviour: m_Horizontal: 0 m_Vertical: 1 m_MovementType: 1 - m_Elasticity: .100000001 + m_Elasticity: 0.1 m_Inertia: 1 - m_DecelerationRate: .135000005 + m_DecelerationRate: 0.135 m_ScrollSensitivity: 1 m_Viewport: {fileID: 606054179} m_HorizontalScrollbar: {fileID: 0} @@ -3669,14 +4037,15 @@ 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_AnchorMin: {x: .5, y: .5} - m_AnchorMax: {x: .5, y: .5} - m_AnchoredPosition: {x: 100, y: -4.9000001} - m_SizeDelta: {x: 36.7000008, y: 36.5999985} - m_Pivot: {x: .5, y: .5} + 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 &1361172028 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3697,11 +4066,11 @@ MonoBehaviour: m_Transition: 1 m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: .757352948, g: 1, b: .769066989, a: 1} - m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} - m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + 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: .100000001 + m_FadeDuration: 0.1 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} @@ -3789,6 +4158,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: - {fileID: 309713871} m_Father: {fileID: 0} @@ -3845,8 +4215,10 @@ Canvas: m_ReceivesEvents: 1 m_OverrideSorting: 0 m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 m_SortingLayerID: 0 m_SortingOrder: 0 + m_TargetDisplay: 0 --- !u!1 &1412835664 GameObject: m_ObjectHideFlags: 0 @@ -3886,11 +4258,11 @@ MonoBehaviour: m_Transition: 1 m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0, g: .958620548, b: 1, a: 1} - m_PressedColor: {r: .90196079, g: .90196079, b: .90196079, a: 1} - m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + m_HighlightedColor: {r: 0, g: 0.95862055, b: 1, a: 1} + m_PressedColor: {r: 0.9019608, g: 0.9019608, b: 0.9019608, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} m_ColorMultiplier: 1 - m_FadeDuration: .100000001 + m_FadeDuration: 0.1 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} @@ -3960,6 +4332,7 @@ 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} @@ -4014,14 +4387,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 33.6999969, y: 21.6000004} - m_SizeDelta: {x: -94.8000031, y: -68.1999969} - m_Pivot: {x: .5, y: .5} + 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 &1449561976 MonoBehaviour: m_ObjectHideFlags: 0 @@ -4033,7 +4407,7 @@ MonoBehaviour: m_Script: {fileID: -900027084, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} m_Name: m_EditorClassIdentifier: - m_EffectColor: {r: 0, g: 0, b: 0, a: .5} + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.5} m_EffectDistance: {x: 1, y: -1} m_UseGraphicAlpha: 0 --- !u!114 &1449561977 @@ -4063,6 +4437,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -4101,6 +4476,7 @@ 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 @@ -4108,7 +4484,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 2} m_SizeDelta: {x: 0, y: -4} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1487808225 MonoBehaviour: m_ObjectHideFlags: 0 @@ -4136,6 +4512,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 4 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -4158,9 +4535,77 @@ MonoBehaviour: m_Script: {fileID: -900027084, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} m_Name: m_EditorClassIdentifier: - m_EffectColor: {r: 0, g: 0, b: 0, a: .296999991} + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.297} m_EffectDistance: {x: 1, y: -1} m_UseGraphicAlpha: 1 +--- !u!1 &1608867049 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 1608867050} + - 222: {fileID: 1608867052} + - 114: {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_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_Children: [] + m_Father: {fileID: 1004776690} + m_RootOrder: 3 + 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 &1608867051 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1608867049} + 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: 7948ef2b5570c4deaa033186f8e3cada, 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 &1608867052 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1608867049} --- !u!1 &1654745586 GameObject: m_ObjectHideFlags: 0 @@ -4187,6 +4632,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: - {fileID: 174295523} - {fileID: 2032927211} @@ -4222,6 +4668,7 @@ MonoBehaviour: layerMask: serializedVersion: 2 m_Bits: 4294967295 + useHitFilters: 0 --- !u!1 &1778454009 GameObject: m_ObjectHideFlags: 0 @@ -4250,6 +4697,7 @@ 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} @@ -4297,11 +4745,11 @@ MonoBehaviour: m_Transition: 1 m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: .158620954, g: 1, b: 0, a: 1} - m_PressedColor: {r: .904411793, g: .904411793, b: .904411793, a: 1} - m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + m_HighlightedColor: {r: 0.15862095, g: 1, b: 0, a: 1} + m_PressedColor: {r: 0.9044118, g: 0.9044118, b: 0.9044118, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} m_ColorMultiplier: 1 - m_FadeDuration: .100000001 + m_FadeDuration: 0.1 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} @@ -4389,6 +4837,7 @@ 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 @@ -4396,7 +4845,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: -2} m_SizeDelta: {x: 0, y: -12} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1784197138 MonoBehaviour: m_ObjectHideFlags: 0 @@ -4408,7 +4857,7 @@ MonoBehaviour: m_Script: {fileID: -900027084, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} m_Name: m_EditorClassIdentifier: - m_EffectColor: {r: 0, g: 0, b: 0, a: .296999991} + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.297} m_EffectDistance: {x: 1, y: -1} m_UseGraphicAlpha: 1 --- !u!114 &1784197139 @@ -4438,6 +4887,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 4 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -4476,14 +4926,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 33.6999969, y: 21.6000004} - m_SizeDelta: {x: -94.8000031, y: -68.1999969} - m_Pivot: {x: .5, y: .5} + 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 &1800191865 MonoBehaviour: m_ObjectHideFlags: 0 @@ -4495,7 +4946,7 @@ MonoBehaviour: m_Script: {fileID: -900027084, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} m_Name: m_EditorClassIdentifier: - m_EffectColor: {r: 0, g: 0, b: 0, a: .5} + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.5} m_EffectDistance: {x: 1, y: -1} m_UseGraphicAlpha: 0 --- !u!114 &1800191866 @@ -4525,6 +4976,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -4563,14 +5015,15 @@ 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_AnchorMin: {x: .5, y: .5} - m_AnchorMax: {x: .5, y: .5} - m_AnchoredPosition: {x: 100, y: -4.9000001} - m_SizeDelta: {x: 36.7000008, y: 36.5999985} - m_Pivot: {x: .5, y: .5} + 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 &1894139121 MonoBehaviour: m_ObjectHideFlags: 0 @@ -4591,11 +5044,11 @@ MonoBehaviour: m_Transition: 1 m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: .757352948, g: 1, b: .769066989, a: 1} - m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} - m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + 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: .100000001 + m_FadeDuration: 0.1 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} @@ -4683,14 +5136,15 @@ 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_AnchorMin: {x: .5, y: .5} - m_AnchorMax: {x: .5, y: .5} - m_AnchoredPosition: {x: -2.43190007e-05, y: 7.9000001} - m_SizeDelta: {x: 151.800003, y: 24.7999992} - m_Pivot: {x: .5, y: .5} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -0.000024319, y: 7.9} + m_SizeDelta: {x: 151.8, y: 24.8} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1924054935 MonoBehaviour: m_ObjectHideFlags: 0 @@ -4702,7 +5156,7 @@ MonoBehaviour: m_Script: {fileID: -900027084, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} m_Name: m_EditorClassIdentifier: - m_EffectColor: {r: 0, g: 0, b: 0, a: .515999973} + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.516} m_EffectDistance: {x: 1, y: 1} m_UseGraphicAlpha: 0 --- !u!114 &1924054936 @@ -4717,7 +5171,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 1, g: .965170264, b: .852941155, a: 1} + m_Color: {r: 1, g: 0.96517026, b: 0.85294116, a: 1} m_RaycastTarget: 1 m_OnCullStateChanged: m_PersistentCalls: @@ -4732,6 +5186,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 90 m_Alignment: 4 + m_AlignByGeometry: 0 m_RichText: 0 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -4743,6 +5198,74 @@ CanvasRenderer: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1924054933} +--- !u!1 &1987127153 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 1987127154} + - 222: {fileID: 1987127156} + - 114: {fileID: 1987127155} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1987127154 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1987127153} + m_LocalRotation: {x: 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_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 &1987127155 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1987127153} + 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: af230e20959134865a1c53e6e8edbbe7, 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 &1987127156 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1987127153} --- !u!1 &2001542683 GameObject: m_ObjectHideFlags: 0 @@ -4770,14 +5293,15 @@ 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_AnchorMin: {x: .5, y: .5} - m_AnchorMax: {x: .5, y: .5} - m_AnchoredPosition: {x: 100, y: -4.9000001} - m_SizeDelta: {x: 36.7000008, y: 36.5999985} - m_Pivot: {x: .5, y: .5} + 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 &2001542685 MonoBehaviour: m_ObjectHideFlags: 0 @@ -4798,11 +5322,11 @@ MonoBehaviour: m_Transition: 1 m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: .757352948, g: 1, b: .769066989, a: 1} - m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} - m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + 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: .100000001 + m_FadeDuration: 0.1 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} @@ -4890,14 +5414,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 33.6999969, y: 21.6000004} - m_SizeDelta: {x: -94.8000031, y: -68.1999969} - m_Pivot: {x: .5, y: .5} + 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 &2008717909 MonoBehaviour: m_ObjectHideFlags: 0 @@ -4909,7 +5434,7 @@ MonoBehaviour: m_Script: {fileID: -900027084, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} m_Name: m_EditorClassIdentifier: - m_EffectColor: {r: 0, g: 0, b: 0, a: .5} + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.5} m_EffectDistance: {x: 1, y: -1} m_UseGraphicAlpha: 0 --- !u!114 &2008717910 @@ -4939,6 +5464,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -4977,6 +5503,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: - {fileID: 666412329} - {fileID: 37557109} @@ -5039,8 +5566,78 @@ Canvas: m_ReceivesEvents: 1 m_OverrideSorting: 0 m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 m_SortingLayerID: 0 m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!1 &2073758706 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 2073758707} + - 222: {fileID: 2073758709} + - 114: {fileID: 2073758708} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2073758707 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2073758706} + m_LocalRotation: {x: 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_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 &2073758708 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2073758706} + 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: 63efac244c09b40f093989ca7d903d38, 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 &2073758709 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2073758706} --- !u!1 &2076713666 GameObject: m_ObjectHideFlags: 0 @@ -5068,17 +5665,19 @@ 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} - {fileID: 1361172027} + - {fileID: 558528359} m_Father: {fileID: 2098255038} m_RootOrder: 3 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: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &2076713668 MonoBehaviour: m_ObjectHideFlags: 0 @@ -5130,6 +5729,74 @@ CanvasRenderer: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 2076713666} +--- !u!1 &2088901648 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 4 + m_Component: + - 224: {fileID: 2088901649} + - 222: {fileID: 2088901651} + - 114: {fileID: 2088901650} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2088901649 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2088901648} + m_LocalRotation: {x: 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_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 &2088901650 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2088901648} + 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: 8ba5d3ffe53b94eb9b457550d9d0c8d8, 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 &2088901651 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2088901648} --- !u!1 &2098255037 GameObject: m_ObjectHideFlags: 0 @@ -5155,6 +5822,7 @@ 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: 574950114} - {fileID: 870787322} diff --git a/Source/Assets/TouchScript/Examples/Photos/Photos.unity b/Source/Assets/TouchScript/Examples/Photos/Photos.unity index 96d97b7d3..c2a6ccc48 100644 --- a/Source/Assets/TouchScript/Examples/Photos/Photos.unity +++ b/Source/Assets/TouchScript/Examples/Photos/Photos.unity @@ -8,25 +8,25 @@ SceneSettings: m_PVSPortalsArray: [] m_OcclusionBakeSettings: smallestOccluder: 5 - smallestHole: .25 + smallestHole: 0.25 backfaceThreshold: 100 --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 serializedVersion: 6 m_Fog: 0 - m_FogColor: {r: .5, g: .5, b: .5, a: 1} + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 - m_FogDensity: .00999999978 + m_FogDensity: 0.01 m_LinearFogStart: 0 m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: .200000003, g: .200000003, b: .200000003, a: 1} - m_AmbientEquatorColor: {r: .200000003, g: .200000003, b: .200000003, a: 1} - m_AmbientGroundColor: {r: .200000003, g: .200000003, b: .200000003, a: 1} + 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_SkyboxMaterial: {fileID: 0} - m_HaloStrength: .5 + m_HaloStrength: 0.5 m_FlareStrength: 1 m_FlareFadeSpeed: 3 m_HaloTexture: {fileID: 0} @@ -40,7 +40,7 @@ RenderSettings: --- !u!157 &4 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 5 + serializedVersion: 6 m_GIWorkflowMode: 1 m_LightmapsMode: 1 m_GISettings: @@ -66,7 +66,7 @@ LightmapSettings: m_FinalGather: 0 m_FinalGatherRayCount: 1024 m_ReflectionCompression: 2 - m_LightmapSnapshot: {fileID: 0} + m_LightingDataAsset: {fileID: 0} m_RuntimeCPUUsage: 25 --- !u!196 &5 NavMeshSettings: @@ -74,15 +74,15 @@ NavMeshSettings: m_ObjectHideFlags: 0 m_BuildSettings: serializedVersion: 2 - agentRadius: .5 + agentRadius: 0.5 agentHeight: 2 agentSlope: 45 - agentClimb: .400000006 + agentClimb: 0.4 ledgeDropHeight: 0 maxJumpAcrossDistance: 0 accuratePlacement: 0 minRegionArea: 2 - cellSize: .166666657 + cellSize: 0.16666666 manualCellSize: 0 m_NavMeshData: {fileID: 0} --- !u!1 &44638783 @@ -144,6 +144,7 @@ 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 @@ -151,7 +152,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &62216951 GameObject: m_ObjectHideFlags: 0 @@ -178,9 +179,10 @@ Transform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 62216951} - m_LocalRotation: {x: -.262086809, y: .366962194, z: -.108559854, w: -.885925531} - m_LocalPosition: {x: 5.55999994, y: 4.82000017, z: -5.46000004} + 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: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 930800601} m_RootOrder: 2 @@ -203,6 +205,7 @@ MonoBehaviour: layerMask: serializedVersion: 2 m_Bits: 4294967295 + useHitFilters: 0 --- !u!81 &62216954 AudioListener: m_ObjectHideFlags: 0 @@ -233,14 +236,14 @@ Camera: m_Enabled: 1 serializedVersion: 2 m_ClearFlags: 1 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: .0196078438} + m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0.019607844} m_NormalizedViewPortRect: serializedVersion: 2 x: 0 y: 0 width: 1 height: 1 - near clip plane: .300000012 + near clip plane: 0.3 far clip plane: 1000 field of view: 60 orthographic: 0 @@ -256,7 +259,7 @@ Camera: m_HDR: 0 m_OcclusionCulling: 1 m_StereoConvergence: 10 - m_StereoSeparation: .0219999999 + m_StereoSeparation: 0.022 m_StereoMirrorMode: 0 --- !u!1 &94606777 GameObject: @@ -285,16 +288,17 @@ 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_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: .602483392, y: .314181447} + m_AnchorMax: {x: 0.6024834, y: 0.31418145} m_AnchoredPosition: {x: 7, y: 4.5} m_SizeDelta: {x: -19, y: -20} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &94606779 MonoBehaviour: m_ObjectHideFlags: 0 @@ -316,10 +320,10 @@ MonoBehaviour: m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} m_HighlightedColor: {r: 0, g: 1, b: 1, a: 1} - m_PressedColor: {r: 0, g: 1, b: .00689649582, a: 1} - m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + m_PressedColor: {r: 0, g: 1, b: 0.006896496, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} m_ColorMultiplier: 1 - m_FadeDuration: .100000001 + m_FadeDuration: 0.1 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} @@ -406,14 +410,15 @@ 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_AnchorMin: {x: .5, y: .800000012} + m_AnchorMin: {x: 0.5, y: 0.8} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &101996208 MonoBehaviour: m_ObjectHideFlags: 0 @@ -473,6 +478,7 @@ 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 @@ -480,7 +486,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &107321543 MonoBehaviour: m_ObjectHideFlags: 0 @@ -540,14 +546,15 @@ 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_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 74, y: -57} - m_SizeDelta: {x: -312.761932, y: 153.959473} - m_Pivot: {x: .5, y: .5} + m_SizeDelta: {x: -312.76193, y: 153.95947} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &142216717 MonoBehaviour: m_ObjectHideFlags: 0 @@ -575,6 +582,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 80 m_Alignment: 4 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -613,6 +621,7 @@ 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} @@ -620,11 +629,11 @@ RectTransform: - {fileID: 701351979} m_Father: {fileID: 2107589903} m_RootOrder: 1 - m_AnchorMin: {x: .5, y: .800000012} + m_AnchorMin: {x: 0.5, y: 0.8} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: .5} + m_AnchoredPosition: {x: 0, y: 0.5} m_SizeDelta: {x: 0, y: -1} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &187227223 MonoBehaviour: m_ObjectHideFlags: 0 @@ -657,7 +666,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: .39199999} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} m_RaycastTarget: 1 m_OnCullStateChanged: m_PersistentCalls: @@ -705,6 +714,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: - {fileID: 1236964526} m_Father: {fileID: 930800601} @@ -766,8 +776,10 @@ Canvas: m_ReceivesEvents: 1 m_OverrideSorting: 0 m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 m_SortingLayerID: 0 m_SortingOrder: 1 + m_TargetDisplay: 0 --- !u!1 &231102984 GameObject: m_ObjectHideFlags: 0 @@ -793,6 +805,7 @@ 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} @@ -803,7 +816,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &231102986 MonoBehaviour: m_ObjectHideFlags: 0 @@ -883,19 +896,20 @@ RectTransform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 238072896} - m_LocalRotation: {x: 4.13857464e-08, y: 1.03727782e-08, z: .179278508, w: .983798385} + 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: 0} m_Children: - {fileID: 1593048785} - {fileID: 994844643} m_Father: {fileID: 1979221409} m_RootOrder: 0 - m_AnchorMin: {x: .5, y: .5} - m_AnchorMax: {x: .5, y: .5} - m_AnchoredPosition: {x: -161, y: 123.999542} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -161, y: 123.99954} m_SizeDelta: {x: 300, y: 300} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &238072900 MonoBehaviour: m_ObjectHideFlags: 0 @@ -922,15 +936,15 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 7 - minScreenPointsDistance: .5 - screenTransformThreshold: .100000001 + minScreenPointsDistance: 0.5 + screenTransformThreshold: 0.1 projection: 2 projectionPlaneNormal: {x: 0, y: 1, z: 0} --- !u!114 &238072902 @@ -948,7 +962,7 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -993,6 +1007,7 @@ 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 @@ -1000,7 +1015,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} m_SizeDelta: {x: 60, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &281947297 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1058,16 +1073,17 @@ RectTransform: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 290456372} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 25.3999996} + 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 3.85500002} - m_SizeDelta: {x: 0, y: 7.71000004} - m_Pivot: {x: .5, y: .5} + m_AnchoredPosition: {x: 0, y: 3.855} + m_SizeDelta: {x: 0, y: 7.71} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &290456374 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1127,6 +1143,7 @@ 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 @@ -1134,7 +1151,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} m_SizeDelta: {x: 60, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &327443544 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1194,14 +1211,15 @@ 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_AnchorMin: {x: .085907571, y: .21797578} - m_AnchorMax: {x: .916279554, y: .790476441} + m_AnchorMin: {x: 0.08590757, y: 0.21797578} + m_AnchorMax: {x: 0.91627955, y: 0.79047644} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &346878482 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1229,6 +1247,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 4 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -1280,9 +1299,9 @@ MonoBehaviour: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} m_HighlightedColor: {r: 1, g: 1, b: 0, a: 1} m_PressedColor: {r: 1, g: 0, b: 0, a: 1} - m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} m_ColorMultiplier: 1 - m_FadeDuration: .100000001 + m_FadeDuration: 0.1 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} @@ -1352,6 +1371,7 @@ 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} @@ -1361,7 +1381,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &418595744 GameObject: m_ObjectHideFlags: 0 @@ -1388,6 +1408,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: - {fileID: 660229293} - {fileID: 1414219394} @@ -1434,8 +1455,10 @@ Canvas: m_ReceivesEvents: 1 m_OverrideSorting: 0 m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 m_SortingLayerID: 0 m_SortingOrder: 0 + m_TargetDisplay: 0 --- !u!1 &449324826 GameObject: m_ObjectHideFlags: 0 @@ -1463,19 +1486,20 @@ RectTransform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 449324826} - m_LocalRotation: {x: 0, y: 0, z: .248051241, w: .96874696} + 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_AnchorMin: {x: .5, y: .5} - m_AnchorMax: {x: .5, y: .5} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: 250, y: 69} m_SizeDelta: {x: 300, y: 300} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &449324828 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1503,7 +1527,7 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -1536,15 +1560,15 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 7 - minScreenPointsDistance: .5 - screenTransformThreshold: .100000001 + minScreenPointsDistance: 0.5 + screenTransformThreshold: 0.1 projection: 2 projectionPlaneNormal: {x: 0, y: 1, z: 0} --- !u!114 &449324832 @@ -1605,6 +1629,7 @@ 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 @@ -1612,7 +1637,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} m_SizeDelta: {x: 60, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &494057712 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1673,19 +1698,20 @@ RectTransform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 536919387} - m_LocalRotation: {x: 0, y: 0, z: .248051241, w: .96874696} + 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: 1065855870} - {fileID: 1772489001} m_Father: {fileID: 1979221409} m_RootOrder: 3 - m_AnchorMin: {x: .5, y: .5} - m_AnchorMax: {x: .5, y: .5} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: 223, y: 293} m_SizeDelta: {x: 300, y: 300} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &536919389 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1713,7 +1739,7 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -1746,15 +1772,15 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 7 - minScreenPointsDistance: .5 - screenTransformThreshold: .100000001 + minScreenPointsDistance: 0.5 + screenTransformThreshold: 0.1 projection: 2 projectionPlaneNormal: {x: 0, y: 1, z: 0} --- !u!114 &536919393 @@ -1870,14 +1896,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} - m_SizeDelta: {x: 204.699997, y: 0} - m_Pivot: {x: .5, y: .5} + m_SizeDelta: {x: 204.7, y: 0} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &551049736 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1919,6 +1946,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -1958,6 +1986,7 @@ 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 @@ -1965,7 +1994,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &581803648 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2025,6 +2054,7 @@ 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 @@ -2032,7 +2062,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &585113475 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2091,6 +2121,7 @@ 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} @@ -2100,7 +2131,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &620448984 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2145,6 +2176,7 @@ 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 @@ -2152,7 +2184,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &634725413 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2211,6 +2243,7 @@ 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} @@ -2220,7 +2253,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &647493036 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2272,7 +2305,7 @@ MonoBehaviour: SubmitButton: Submit CancelButton: Cancel InputActionsPerSecond: 10 - RepeatDelay: .5 + RepeatDelay: 0.5 --- !u!114 &651643063 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2296,6 +2329,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: 3 @@ -2323,15 +2357,16 @@ 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_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: .252637833, y: 1} + m_AnchorMax: {x: 0.25263783, y: 1} m_AnchoredPosition: {x: 5, y: 50} m_SizeDelta: {x: -10, y: -120} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &663465964 GameObject: m_ObjectHideFlags: 0 @@ -2358,6 +2393,7 @@ 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 @@ -2365,7 +2401,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &663465966 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2425,6 +2461,7 @@ 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 @@ -2432,7 +2469,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &689392538 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2493,6 +2530,7 @@ 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} @@ -2502,7 +2540,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &701351981 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2525,9 +2563,9 @@ MonoBehaviour: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} m_HighlightedColor: {r: 1, g: 1, b: 0, a: 1} m_PressedColor: {r: 0, g: 1, b: 1, a: 1} - m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} m_ColorMultiplier: 1 - m_FadeDuration: .100000001 + m_FadeDuration: 0.1 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} @@ -2615,19 +2653,20 @@ RectTransform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 886654111} - m_LocalRotation: {x: 3.98202182e-08, y: 6.83678891e-09, z: .248051226, w: .96874696} + 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_AnchorMin: {x: .5, y: .5} - m_AnchorMax: {x: .5, y: .5} - m_AnchoredPosition: {x: 218, y: -143.998871} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 218, y: -143.99887} m_SizeDelta: {x: 300, y: 300} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &886654113 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2643,7 +2682,7 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -2676,15 +2715,15 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 7 - minScreenPointsDistance: .5 - screenTransformThreshold: .100000001 + minScreenPointsDistance: 0.5 + screenTransformThreshold: 0.1 projection: 2 projectionPlaneNormal: {x: 0, y: 1, z: 0} --- !u!114 &886654117 @@ -2753,9 +2792,10 @@ Transform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 894414301} - m_LocalRotation: {x: .707106829, y: 0, z: 0, w: .707106709} - m_LocalPosition: {x: 0, y: 9.31999969, z: 0} + 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 @@ -2768,14 +2808,14 @@ Camera: m_Enabled: 1 serializedVersion: 2 m_ClearFlags: 1 - m_BackGroundColor: {r: .192156866, g: .301960796, b: .474509805, a: .0196078438} + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0.019607844} m_NormalizedViewPortRect: serializedVersion: 2 x: 0 y: 0 width: 1 height: 1 - near clip plane: .300000012 + near clip plane: 0.3 far clip plane: 1000 field of view: 60 orthographic: 0 @@ -2791,7 +2831,7 @@ Camera: m_HDR: 0 m_OcclusionCulling: 1 m_StereoConvergence: 10 - m_StereoSeparation: .0219999999 + m_StereoSeparation: 0.022 m_StereoMirrorMode: 0 --- !u!1 &899875348 GameObject: @@ -2820,14 +2860,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} - m_SizeDelta: {x: 204.699997, y: 0} - m_Pivot: {x: .5, y: .5} + m_SizeDelta: {x: 204.7, y: 0} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &899875350 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2869,6 +2910,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -2904,6 +2946,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: - {fileID: 1292123036} - {fileID: 2135305920} @@ -2938,6 +2981,7 @@ 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 @@ -2945,7 +2989,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &982847341 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3006,6 +3050,7 @@ 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 @@ -3013,7 +3058,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 18, y: -18} m_SizeDelta: {x: 80, y: 80} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &994844645 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3034,11 +3079,11 @@ MonoBehaviour: m_Transition: 1 m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 1, g: .669117689, b: .669117689, a: 1} - m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} - m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + m_HighlightedColor: {r: 1, g: 0.6691177, b: 0.6691177, 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: .100000001 + m_FadeDuration: 0.1 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} @@ -3123,16 +3168,17 @@ RectTransform: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1027187497} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 2.77790004e-05} + 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_AnchorMin: {x: .309000015, y: 0} + m_AnchorMin: {x: 0.30900002, y: 0} m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: -.134020001, y: -21.1000004} - m_SizeDelta: {x: -.267960012, y: 29.7999992} - m_Pivot: {x: .5, y: .5} + m_AnchoredPosition: {x: -0.13402, y: -21.1} + m_SizeDelta: {x: -0.26796, y: 29.8} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1027187499 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3160,6 +3206,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 100 m_Alignment: 2 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -3197,14 +3244,15 @@ 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_AnchorMin: {x: .69750005, y: .69600004} - m_AnchorMax: {x: 1, y: .800000012} - m_AnchoredPosition: {x: 1.10000002, y: -6} - m_SizeDelta: {x: -30.2000008, y: -12} - m_Pivot: {x: .5, y: .5} + m_AnchorMin: {x: 0.69750005, y: 0.69600004} + m_AnchorMax: {x: 1, y: 0.8} + m_AnchoredPosition: {x: 1.1, y: -6} + m_SizeDelta: {x: -30.2, y: -12} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1056464760 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3232,6 +3280,7 @@ MonoBehaviour: m_MinSize: 5 m_MaxSize: 40 m_Alignment: 2 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -3269,6 +3318,7 @@ 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 @@ -3276,7 +3326,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1065855871 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3337,6 +3387,7 @@ 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} @@ -3346,7 +3397,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1101956165 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3369,9 +3420,9 @@ MonoBehaviour: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} m_HighlightedColor: {r: 1, g: 1, b: 0, a: 1} m_PressedColor: {r: 1, g: 0, b: 1, a: 1} - m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} m_ColorMultiplier: 1 - m_FadeDuration: .100000001 + m_FadeDuration: 0.1 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} @@ -3457,6 +3508,7 @@ 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} @@ -3466,7 +3518,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1169177133 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3508,9 +3560,10 @@ RectTransform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1236964525} - m_LocalRotation: {x: .0402504168, y: .380253881, z: -.00021144397, w: .924005926} + 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: .600000024, y: .600000024, z: .600000024} + 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} @@ -3518,11 +3571,11 @@ RectTransform: - {fileID: 1301221420} m_Father: {fileID: 204253028} m_RootOrder: 0 - m_AnchorMin: {x: .627800941, y: 0} - m_AnchorMax: {x: 1, y: .633322477} + m_AnchorMin: {x: 0.62780094, y: 0} + m_AnchorMax: {x: 1, y: 0.6333225} m_AnchoredPosition: {x: -8, y: -10} m_SizeDelta: {x: -36, y: -60} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1236964527 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3535,7 +3588,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: .39199999} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} m_RaycastTarget: 1 m_OnCullStateChanged: m_PersistentCalls: @@ -3582,6 +3635,7 @@ 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 @@ -3589,7 +3643,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1276931410 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3615,8 +3669,9 @@ MonoBehaviour: m_FontStyle: 1 m_BestFit: 1 m_MinSize: 10 - m_MaxSize: 20 + m_MaxSize: 34 m_Alignment: 4 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -3655,6 +3710,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: - {fileID: 1932435999} - {fileID: 894414302} @@ -3678,8 +3734,10 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_ScaleInLightmap: 1 m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 - m_AutoUVMaxDistance: .5 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} m_SortingLayerID: 0 @@ -3727,8 +3785,9 @@ RectTransform: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1301221419} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 7.11931079e-06} + 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} @@ -3737,7 +3796,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1301221421 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3795,9 +3854,10 @@ RectTransform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1402680835} - m_LocalRotation: {x: 6.63101673e-07, y: -1.49011612e-07, z: -.0703569278, w: .997521877} + 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 @@ -3805,7 +3865,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 18, y: -18} m_SizeDelta: {x: 80, y: 80} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1402680838 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3826,11 +3886,11 @@ MonoBehaviour: m_Transition: 1 m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 1, g: .666666687, b: .666666687, a: 1} - m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} - m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + m_HighlightedColor: {r: 1, g: 0.6666667, b: 0.6666667, 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: .100000001 + m_FadeDuration: 0.1 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} @@ -3918,6 +3978,7 @@ 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} @@ -3927,7 +3988,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1406281479 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3950,9 +4011,9 @@ MonoBehaviour: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} m_HighlightedColor: {r: 1, g: 1, b: 0, a: 1} m_PressedColor: {r: 0, g: 1, b: 0, a: 1} - m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} m_ColorMultiplier: 1 - m_FadeDuration: .100000001 + m_FadeDuration: 0.1 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} @@ -4072,6 +4133,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 0 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -4093,14 +4155,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 156, y: 48.2999992} + m_AnchoredPosition: {x: 156, y: 48.3} m_SizeDelta: {x: 276, y: 68.5} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &1423800607 GameObject: m_ObjectHideFlags: 0 @@ -4125,9 +4188,10 @@ RectTransform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1423800607} - m_LocalRotation: {x: 6.63101673e-07, y: -1.49011612e-07, z: -.0703569278, w: .997521877} + 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 @@ -4135,7 +4199,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 18, y: -18} m_SizeDelta: {x: 80, y: 80} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1423800610 MonoBehaviour: m_ObjectHideFlags: 0 @@ -4156,11 +4220,11 @@ MonoBehaviour: m_Transition: 1 m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 1, g: .666666687, b: .666666687, a: 1} - m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} - m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + m_HighlightedColor: {r: 1, g: 0.6666667, b: 0.6666667, 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: .100000001 + m_FadeDuration: 0.1 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} @@ -4248,14 +4312,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} - m_SizeDelta: {x: 204.699997, y: 0} - m_Pivot: {x: .5, y: .5} + m_SizeDelta: {x: 204.7, y: 0} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1430826383 MonoBehaviour: m_ObjectHideFlags: 0 @@ -4297,6 +4362,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -4335,15 +4401,16 @@ RectTransform: m_GameObject: {fileID: 1477172501} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1.00000012, z: 1} + 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 1.90734863e-05, y: 4.19616699e-05} + m_AnchoredPosition: {x: 0.000019073486, y: 0.00004196167} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1477172503 MonoBehaviour: m_ObjectHideFlags: 0 @@ -4403,19 +4470,20 @@ RectTransform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1485721902} - m_LocalRotation: {x: 0, y: 0, z: .248051241, w: .96874696} + 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_AnchorMin: {x: .5, y: .5} - m_AnchorMax: {x: .5, y: .5} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: 4, y: 14} m_SizeDelta: {x: 300, y: 300} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1485721904 MonoBehaviour: m_ObjectHideFlags: 0 @@ -4431,7 +4499,7 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -4464,15 +4532,15 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 7 - minScreenPointsDistance: .5 - screenTransformThreshold: .100000001 + minScreenPointsDistance: 0.5 + screenTransformThreshold: 0.1 projection: 2 projectionPlaneNormal: {x: 0, y: 1, z: 0} --- !u!114 &1485721907 @@ -4545,6 +4613,7 @@ 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 @@ -4552,7 +4621,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1593048786 MonoBehaviour: m_ObjectHideFlags: 0 @@ -4612,6 +4681,7 @@ 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 @@ -4619,7 +4689,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1615394528 MonoBehaviour: m_ObjectHideFlags: 0 @@ -4645,8 +4715,9 @@ MonoBehaviour: m_FontStyle: 1 m_BestFit: 1 m_MinSize: 10 - m_MaxSize: 20 + m_MaxSize: 34 m_Alignment: 4 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -4684,6 +4755,7 @@ 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 @@ -4691,7 +4763,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1674922493 MonoBehaviour: m_ObjectHideFlags: 0 @@ -4759,9 +4831,10 @@ RectTransform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1772489000} - m_LocalRotation: {x: 6.63101673e-07, y: -1.49011612e-07, z: -.0703569278, w: .997521877} + 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 @@ -4769,7 +4842,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 18, y: -18} m_SizeDelta: {x: 80, y: 80} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1772489003 MonoBehaviour: m_ObjectHideFlags: 0 @@ -4790,11 +4863,11 @@ MonoBehaviour: m_Transition: 1 m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 1, g: .666666687, b: .666666687, a: 1} - m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} - m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + m_HighlightedColor: {r: 1, g: 0.6666667, b: 0.6666667, 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: .100000001 + m_FadeDuration: 0.1 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} @@ -4881,6 +4954,7 @@ 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 @@ -4888,7 +4962,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1820795548 MonoBehaviour: m_ObjectHideFlags: 0 @@ -4914,8 +4988,9 @@ MonoBehaviour: m_FontStyle: 1 m_BestFit: 1 m_MinSize: 10 - m_MaxSize: 20 + m_MaxSize: 34 m_Alignment: 4 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -4951,9 +5026,10 @@ RectTransform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1932435998} - m_LocalRotation: {x: .707106829, y: 0, z: 0, w: .707106709} + m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071067} m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: .00999999978, y: .00999999978, z: .00999999978} + 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} @@ -4962,9 +5038,9 @@ RectTransform: m_RootOrder: 0 m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: .0100100003} + m_AnchoredPosition: {x: 0, y: 0.01001} m_SizeDelta: {x: 1000, y: 1000} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1932436000 MonoBehaviour: m_ObjectHideFlags: 0 @@ -5017,8 +5093,10 @@ Canvas: m_ReceivesEvents: 1 m_OverrideSorting: 0 m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 m_SortingLayerID: 0 m_SortingOrder: 0 + m_TargetDisplay: 0 --- !u!1 &1979221408 GameObject: m_ObjectHideFlags: 0 @@ -5047,6 +5125,7 @@ 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} @@ -5058,9 +5137,9 @@ RectTransform: m_RootOrder: 1 m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: -2.68220901e-06} + m_AnchoredPosition: {x: 0, y: -0.000002682209} m_SizeDelta: {x: -40, y: -40} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1979221410 MonoBehaviour: m_ObjectHideFlags: 0 @@ -5150,19 +5229,20 @@ RectTransform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1979821160} - m_LocalRotation: {x: 0, y: 0, z: .248051241, w: .96874696} + 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_AnchorMin: {x: .5, y: .5} - m_AnchorMax: {x: .5, y: .5} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: -141, y: -231} m_SizeDelta: {x: 300, y: 300} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1979821162 MonoBehaviour: m_ObjectHideFlags: 0 @@ -5178,7 +5258,7 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -5211,15 +5291,15 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 7 - minScreenPointsDistance: .5 - screenTransformThreshold: .100000001 + minScreenPointsDistance: 0.5 + screenTransformThreshold: 0.1 projection: 2 projectionPlaneNormal: {x: 0, y: 1, z: 0} --- !u!114 &1979821165 @@ -5292,6 +5372,7 @@ 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 @@ -5299,7 +5380,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: -40, y: -40} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &2015117399 MonoBehaviour: m_ObjectHideFlags: 0 @@ -5312,7 +5393,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0, g: 0, b: 0, a: .0941176489} + m_Color: {r: 0, g: 0, b: 0, a: 0.09411765} m_RaycastTarget: 1 m_OnCullStateChanged: m_PersistentCalls: @@ -5357,9 +5438,10 @@ RectTransform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 2041974586} - m_LocalRotation: {x: 6.63101673e-07, y: -1.49011612e-07, z: -.0703569278, w: .997521877} + 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 @@ -5367,7 +5449,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 18, y: -18} m_SizeDelta: {x: 80, y: 80} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &2041974589 MonoBehaviour: m_ObjectHideFlags: 0 @@ -5388,11 +5470,11 @@ MonoBehaviour: m_Transition: 1 m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 1, g: .666666687, b: .666666687, a: 1} - m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} - m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + m_HighlightedColor: {r: 1, g: 0.6666667, b: 0.6666667, 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: .100000001 + m_FadeDuration: 0.1 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} @@ -5479,6 +5561,7 @@ 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 @@ -5486,7 +5569,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &2077422343 MonoBehaviour: m_ObjectHideFlags: 0 @@ -5512,8 +5595,9 @@ MonoBehaviour: m_FontStyle: 1 m_BestFit: 1 m_MinSize: 10 - m_MaxSize: 20 + m_MaxSize: 34 m_Alignment: 4 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -5549,9 +5633,10 @@ RectTransform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 2082518917} - m_LocalRotation: {x: 6.63101673e-07, y: -1.49011612e-07, z: -.0703569278, w: .997521877} + 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 @@ -5559,7 +5644,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 18, y: -18} m_SizeDelta: {x: 80, y: 80} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &2082518920 MonoBehaviour: m_ObjectHideFlags: 0 @@ -5580,11 +5665,11 @@ MonoBehaviour: m_Transition: 1 m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 1, g: .666666687, b: .666666687, a: 1} - m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} - m_DisabledColor: {r: .784313738, g: .784313738, b: .784313738, a: .501960814} + m_HighlightedColor: {r: 1, g: 0.6666667, b: 0.6666667, 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: .100000001 + m_FadeDuration: 0.1 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} @@ -5672,6 +5757,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: - {fileID: 101996207} - {fileID: 187227222} @@ -5735,8 +5821,10 @@ Canvas: m_ReceivesEvents: 1 m_OverrideSorting: 0 m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 m_SortingLayerID: 0 m_SortingOrder: 0 + m_TargetDisplay: 0 --- !u!1 &2135305919 GameObject: m_ObjectHideFlags: 0 @@ -5759,9 +5847,10 @@ Transform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 2135305919} - m_LocalRotation: {x: .422268212, y: -.484720409, z: -.0171990059, w: .765793622} - m_LocalPosition: {x: 6.10041475, y: 15.5403843, z: -20.5662251} + 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 @@ -5775,16 +5864,17 @@ Light: serializedVersion: 6 m_Type: 1 m_Color: {r: 1, g: 1, b: 1, a: 1} - m_Intensity: 1.29999995 + m_Intensity: 1.3 m_Range: 10 m_SpotAngle: 30 m_CookieSize: 10 m_Shadows: m_Type: 1 m_Resolution: -1 - m_Strength: .200000003 - m_Bias: .0500000007 - m_NormalBias: .400000006 + m_Strength: 0.2 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 m_Cookie: {fileID: 0} m_DrawHalo: 0 m_Flare: {fileID: 0} diff --git a/Source/Assets/TouchScript/Examples/Portal/Portal.unity b/Source/Assets/TouchScript/Examples/Portal/Portal.unity index 78d5fd75c..381f66850 100644 --- a/Source/Assets/TouchScript/Examples/Portal/Portal.unity +++ b/Source/Assets/TouchScript/Examples/Portal/Portal.unity @@ -8,25 +8,25 @@ SceneSettings: m_PVSPortalsArray: [] m_OcclusionBakeSettings: smallestOccluder: 5 - smallestHole: .25 + smallestHole: 0.25 backfaceThreshold: 100 --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 serializedVersion: 6 m_Fog: 0 - m_FogColor: {r: .5, g: .5, b: .5, a: 1} + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 - m_FogDensity: .00999999978 + m_FogDensity: 0.01 m_LinearFogStart: 0 m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: .200000003, g: .200000003, b: .200000003, a: 1} - m_AmbientEquatorColor: {r: .200000003, g: .200000003, b: .200000003, a: 1} - m_AmbientGroundColor: {r: .200000003, g: .200000003, b: .200000003, a: 1} + 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_SkyboxMaterial: {fileID: 2100000, guid: a07fadb24ea940240afba3afc1a692cc, type: 2} - m_HaloStrength: .5 + m_HaloStrength: 0.5 m_FlareStrength: 1 m_FlareFadeSpeed: 3 m_HaloTexture: {fileID: 0} @@ -40,7 +40,7 @@ RenderSettings: --- !u!157 &4 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 5 + serializedVersion: 6 m_GIWorkflowMode: 1 m_LightmapsMode: 1 m_GISettings: @@ -66,7 +66,7 @@ LightmapSettings: m_FinalGather: 0 m_FinalGatherRayCount: 1024 m_ReflectionCompression: 2 - m_LightmapSnapshot: {fileID: 0} + m_LightingDataAsset: {fileID: 0} m_RuntimeCPUUsage: 25 --- !u!196 &5 NavMeshSettings: @@ -74,15 +74,15 @@ NavMeshSettings: m_ObjectHideFlags: 0 m_BuildSettings: serializedVersion: 2 - agentRadius: .5 + agentRadius: 0.5 agentHeight: 2 agentSlope: 45 - agentClimb: .400000006 + agentClimb: 0.4 ledgeDropHeight: 0 maxJumpAcrossDistance: 0 accuratePlacement: 0 minRegionArea: 2 - cellSize: .166666657 + cellSize: 0.16666666 manualCellSize: 0 m_NavMeshData: {fileID: 0} --- !u!1 &62216951 @@ -111,9 +111,10 @@ Transform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 62216951} - m_LocalRotation: {x: .707106829, y: 0, z: 0, w: .707106709} + 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: 0, y: 0, z: 0} m_Children: - {fileID: 498618157} m_Father: {fileID: 930800601} @@ -137,6 +138,7 @@ MonoBehaviour: layerMask: serializedVersion: 2 m_Bits: 4294967295 + useHitFilters: 0 --- !u!81 &62216954 AudioListener: m_ObjectHideFlags: 0 @@ -174,7 +176,7 @@ Camera: y: 0 width: 1 height: 1 - near clip plane: .300000012 + near clip plane: 0.3 far clip plane: 40 field of view: 30 orthographic: 1 @@ -190,7 +192,7 @@ Camera: m_HDR: 0 m_OcclusionCulling: 1 m_StereoConvergence: 10 - m_StereoSeparation: .0219999999 + m_StereoSeparation: 0.022 m_StereoMirrorMode: 0 --- !u!1 &250857269 GameObject: @@ -237,6 +239,7 @@ 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} @@ -245,7 +248,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &481822342 GameObject: m_ObjectHideFlags: 0 @@ -276,9 +279,10 @@ Transform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 481822342} - m_LocalRotation: {x: -8.94069672e-08, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -4.30000019, y: -6.05999994, z: .400000006} + 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 @@ -295,7 +299,7 @@ MonoBehaviour: m_EditorClassIdentifier: Speed: 100 RotationSpeed: 40 - FallSpeed: .00999999978 + FallSpeed: 0.01 --- !u!23 &481822345 MeshRenderer: m_ObjectHideFlags: 0 @@ -314,8 +318,10 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_ScaleInLightmap: 1 m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 - m_AutoUVMaxDistance: .5 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} m_SortingLayerID: 0 @@ -337,8 +343,8 @@ SphereCollider: m_IsTrigger: 0 m_Enabled: 1 serializedVersion: 2 - m_Radius: .5 - m_Center: {x: 0, y: 9.53674316e-07, z: -2.38418579e-07} + m_Radius: 0.5 + m_Center: {x: 0, y: 0.0000009536743, z: -0.00000023841858} --- !u!114 &481822348 MonoBehaviour: m_ObjectHideFlags: 0 @@ -365,15 +371,15 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 1 - minScreenPointsDistance: .5 - screenTransformThreshold: .100000001 + minScreenPointsDistance: 0.5 + screenTransformThreshold: 0.1 projection: 1 projectionPlaneNormal: {x: 0, y: 0, z: 1} --- !u!114 &481822350 @@ -391,7 +397,7 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -413,7 +419,7 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -429,7 +435,7 @@ Rigidbody: serializedVersion: 2 m_Mass: 1 m_Drag: 0 - m_AngularDrag: .0500000007 + m_AngularDrag: 0.05 m_UseGravity: 0 m_IsKinematic: 1 m_Interpolate: 0 @@ -457,8 +463,9 @@ Transform: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 498618156} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 2.1500001, y: 0, z: 10} + 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} @@ -537,6 +544,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: - {fileID: 1981142013} - {fileID: 1552723601} @@ -599,8 +607,10 @@ Canvas: m_ReceivesEvents: 1 m_OverrideSorting: 0 m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 m_SortingLayerID: 0 m_SortingOrder: 0 + m_TargetDisplay: 0 --- !u!1 &762219656 GameObject: m_ObjectHideFlags: 0 @@ -625,9 +635,10 @@ Transform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 762219656} - m_LocalRotation: {x: -5.96046519e-08, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: -.100000001} + 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 @@ -661,8 +672,10 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_ScaleInLightmap: 1 m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 - m_AutoUVMaxDistance: .5 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} m_SortingLayerID: 0 @@ -705,8 +718,9 @@ Transform: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 851559560} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 7.01000023, y: -3.6400001, z: .100000001} + 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 @@ -728,8 +742,10 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_ScaleInLightmap: 1 m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 - m_AutoUVMaxDistance: .5 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} m_SortingLayerID: 0 @@ -754,7 +770,7 @@ MonoBehaviour: m_EditorClassIdentifier: Speed: 100 RotationSpeed: 10 - FallSpeed: .00999999978 + FallSpeed: 0.01 --- !u!114 &851559565 MonoBehaviour: m_ObjectHideFlags: 0 @@ -781,15 +797,15 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 1 - minScreenPointsDistance: .5 - screenTransformThreshold: .100000001 + minScreenPointsDistance: 0.5 + screenTransformThreshold: 0.1 projection: 1 projectionPlaneNormal: {x: 0, y: 0, z: 1} --- !u!135 &851559567 @@ -802,8 +818,8 @@ SphereCollider: m_IsTrigger: 0 m_Enabled: 1 serializedVersion: 2 - m_Radius: .5 - m_Center: {x: 0, y: -4.76837158e-07, z: -2.38418579e-07} + m_Radius: 0.5 + m_Center: {x: 0, y: -0.00000047683716, z: -0.00000023841858} --- !u!114 &851559568 MonoBehaviour: m_ObjectHideFlags: 0 @@ -819,7 +835,7 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -841,7 +857,7 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -857,7 +873,7 @@ Rigidbody: serializedVersion: 2 m_Mass: 1 m_Drag: 0 - m_AngularDrag: .0500000007 + m_AngularDrag: 0.05 m_UseGravity: 0 m_IsKinematic: 1 m_Interpolate: 0 @@ -893,9 +909,10 @@ Transform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 893756805} - m_LocalRotation: {x: -8.94069672e-08, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 6.23999977, y: 6.07999992, z: .300000012} + 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_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1158035086} m_RootOrder: 2 @@ -912,7 +929,7 @@ MonoBehaviour: m_EditorClassIdentifier: Speed: 100 RotationSpeed: 30 - FallSpeed: .00999999978 + FallSpeed: 0.01 --- !u!23 &893756808 MeshRenderer: m_ObjectHideFlags: 0 @@ -931,8 +948,10 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_ScaleInLightmap: 1 m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 - m_AutoUVMaxDistance: .5 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} m_SortingLayerID: 0 @@ -954,8 +973,8 @@ SphereCollider: m_IsTrigger: 0 m_Enabled: 1 serializedVersion: 2 - m_Radius: .5 - m_Center: {x: 0, y: -7.15255737e-07, z: -2.38418579e-07} + m_Radius: 0.5 + m_Center: {x: 0, y: -0.00000071525574, z: -0.00000023841858} --- !u!114 &893756811 MonoBehaviour: m_ObjectHideFlags: 0 @@ -982,15 +1001,15 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 1 - minScreenPointsDistance: .5 - screenTransformThreshold: .100000001 + minScreenPointsDistance: 0.5 + screenTransformThreshold: 0.1 projection: 1 projectionPlaneNormal: {x: 0, y: 0, z: 1} --- !u!114 &893756813 @@ -1008,7 +1027,7 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -1030,7 +1049,7 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -1046,7 +1065,7 @@ Rigidbody: serializedVersion: 2 m_Mass: 1 m_Drag: 0 - m_AngularDrag: .0500000007 + m_AngularDrag: 0.05 m_UseGravity: 0 m_IsKinematic: 1 m_Interpolate: 0 @@ -1076,6 +1095,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: - {fileID: 2135305920} - {fileID: 62216952} @@ -1107,6 +1127,7 @@ 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 @@ -1114,7 +1135,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} m_SizeDelta: {x: 60, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1138005901 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1170,8 +1191,9 @@ Transform: 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.59000003} + 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} @@ -1209,9 +1231,10 @@ Transform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1166789651} - m_LocalRotation: {x: -8.94069672e-08, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -8.31999969, y: 4.82000017, z: .200000003} + 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 @@ -1228,7 +1251,7 @@ MonoBehaviour: m_EditorClassIdentifier: Speed: 100 RotationSpeed: 20 - FallSpeed: .00999999978 + FallSpeed: 0.01 --- !u!23 &1166789654 MeshRenderer: m_ObjectHideFlags: 0 @@ -1247,8 +1270,10 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_ScaleInLightmap: 1 m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 - m_AutoUVMaxDistance: .5 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} m_SortingLayerID: 0 @@ -1270,8 +1295,8 @@ SphereCollider: m_IsTrigger: 0 m_Enabled: 1 serializedVersion: 2 - m_Radius: .5 - m_Center: {x: 0, y: -4.76837158e-07, z: -2.38418579e-07} + m_Radius: 0.5 + m_Center: {x: 0, y: -0.00000047683716, z: -0.00000023841858} --- !u!114 &1166789657 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1298,15 +1323,15 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 1 - minScreenPointsDistance: .5 - screenTransformThreshold: .100000001 + minScreenPointsDistance: 0.5 + screenTransformThreshold: 0.1 projection: 1 projectionPlaneNormal: {x: 0, y: 0, z: 1} --- !u!114 &1166789659 @@ -1324,7 +1349,7 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -1346,7 +1371,7 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -1362,7 +1387,7 @@ Rigidbody: serializedVersion: 2 m_Mass: 1 m_Drag: 0 - m_AngularDrag: .0500000007 + m_AngularDrag: 0.05 m_UseGravity: 0 m_IsKinematic: 1 m_Interpolate: 0 @@ -1394,6 +1419,7 @@ 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} @@ -1409,7 +1435,7 @@ SphereCollider: m_IsTrigger: 1 m_Enabled: 1 serializedVersion: 2 - m_Radius: 1.97000003 + m_Radius: 1.97 m_Center: {x: 0, y: 0, z: 0} --- !u!114 &1283428185 MonoBehaviour: @@ -1449,14 +1475,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} - m_SizeDelta: {x: 204.699997, y: 0} - m_Pivot: {x: .5, y: .5} + m_SizeDelta: {x: 204.7, y: 0} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1408280582 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1484,6 +1511,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -1536,6 +1564,7 @@ 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 @@ -1543,7 +1572,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 178, y: 78} m_SizeDelta: {x: 320, y: 128} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1552723602 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1571,6 +1600,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 0 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -1629,6 +1659,7 @@ 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} @@ -1638,7 +1669,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1679844151 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1705,8 +1736,10 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_ScaleInLightmap: 1 m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 - m_AutoUVMaxDistance: .5 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} m_SortingLayerID: 0 @@ -1727,6 +1760,7 @@ 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 @@ -1769,6 +1803,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: 4 @@ -1818,15 +1853,16 @@ 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_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: .252637833, y: 1} + m_AnchorMax: {x: 0.25263783, y: 1} m_AnchoredPosition: {x: 5, y: 50} m_SizeDelta: {x: -10, y: -120} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &2135305919 GameObject: m_ObjectHideFlags: 0 @@ -1849,9 +1885,10 @@ Transform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 2135305919} - m_LocalRotation: {x: .241942912, y: -.49854365, z: .221075788, w: .802523136} - m_LocalPosition: {x: 6.10041475, y: 15.5403843, z: -20.5662251} + 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 @@ -1865,16 +1902,17 @@ Light: serializedVersion: 6 m_Type: 1 m_Color: {r: 1, g: 1, b: 1, a: 1} - m_Intensity: 1.29999995 + m_Intensity: 1.3 m_Range: 10 m_SpotAngle: 30 m_CookieSize: 10 m_Shadows: m_Type: 2 m_Resolution: 3 - m_Strength: .560000002 - m_Bias: .100000001 - m_NormalBias: .400000006 + 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} diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Examples.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Examples.meta new file mode 100644 index 000000000..ee0b7f57e --- /dev/null +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Examples.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ff612c7fb2450453db0aa0aae5024d9f +folderAsset: yes +timeCreated: 1477787804 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Camera.png b/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Camera.png new file mode 100644 index 0000000000000000000000000000000000000000..8678008c616168c83b736707698807ab86a5946e GIT binary patch literal 9538 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 literal 0 HcmV?d00001 diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Checkers.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Checkers.png.meta new file mode 100644 index 000000000..954b1f745 --- /dev/null +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Checkers.png.meta @@ -0,0 +1,58 @@ +fileFormatVersion: 2 +guid: af230e20959134865a1c53e6e8edbbe7 +timeCreated: 1477787869 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 8 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: ui + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Colors.png b/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Colors.png new file mode 100644 index 0000000000000000000000000000000000000000..034b73dceb7461f269d862bfd5ba8f8b25f5592e GIT binary patch literal 8847 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

I6y4ZYtoZbp8io?c8FC1W$ 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 literal 0 HcmV?d00001 diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Cube.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Cube.png.meta new file mode 100644 index 000000000..ba1052a77 --- /dev/null +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Cube.png.meta @@ -0,0 +1,58 @@ +fileFormatVersion: 2 +guid: 8ba5d3ffe53b94eb9b457550d9d0c8d8 +timeCreated: 1477787993 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 8 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: ui + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Multiuser.png b/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Multiuser.png new file mode 100644 index 0000000000000000000000000000000000000000..509e9558108611809add2eb65ca3276b8f45e416 GIT binary patch literal 11116 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 literal 0 HcmV?d00001 diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Multiuser.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Multiuser.png.meta new file mode 100644 index 000000000..fa7c1a391 --- /dev/null +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Multiuser.png.meta @@ -0,0 +1,58 @@ +fileFormatVersion: 2 +guid: 7948ef2b5570c4deaa033186f8e3cada +timeCreated: 1477788047 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 8 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: ui + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Photos.png b/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Photos.png new file mode 100644 index 0000000000000000000000000000000000000000..b44018261c4d03806bb2f8f41cdcc91659702528 GIT binary patch literal 9774 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 MrIjF+k|sg_1sc{mTL1t6 literal 0 HcmV?d00001 diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Photos.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Photos.png.meta new file mode 100644 index 000000000..8aa77d0af --- /dev/null +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Photos.png.meta @@ -0,0 +1,58 @@ +fileFormatVersion: 2 +guid: e2a00bee3078646c684013506c4f40c4 +timeCreated: 1477788133 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 8 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: ui + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Portal.png b/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Portal.png new file mode 100644 index 0000000000000000000000000000000000000000..e4326afdecb320e8d61b0ab52640999057a7d4ea GIT binary patch literal 7719 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 literal 0 HcmV?d00001 diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Portal.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Portal.png.meta new file mode 100644 index 000000000..43999417c --- /dev/null +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Portal.png.meta @@ -0,0 +1,58 @@ +fileFormatVersion: 2 +guid: 1217c44a62d504b718e8d6b10d17c0cb +timeCreated: 1477788189 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 8 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: ui + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/RawInput.png b/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/RawInput.png new file mode 100644 index 0000000000000000000000000000000000000000..e1e3c817afbe474e9da3fe37ece87513f78f6719 GIT binary patch literal 7775 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 literal 0 HcmV?d00001 diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/RawInput.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/RawInput.png.meta new file mode 100644 index 000000000..8f6f40b22 --- /dev/null +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/RawInput.png.meta @@ -0,0 +1,58 @@ +fileFormatVersion: 2 +guid: 63efac244c09b40f093989ca7d903d38 +timeCreated: 1477788242 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 8 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: ui + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Taps.png b/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Taps.png new file mode 100644 index 0000000000000000000000000000000000000000..403dc8180221ddc54387b28431ab0335ec388aca GIT binary patch literal 8369 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 G;(q{>yzw~z literal 0 HcmV?d00001 diff --git a/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Taps.png.meta b/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Taps.png.meta new file mode 100644 index 000000000..58a8e0c3f --- /dev/null +++ b/Source/Assets/TouchScript/Examples/_misc/Textures/Examples/Taps.png.meta @@ -0,0 +1,58 @@ +fileFormatVersion: 2 +guid: 5a60ebe3657034c78bd3f829dc6b132e +timeCreated: 1477788299 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 8 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: ui + userData: + assetBundleName: + assetBundleVariant: From 795b01100b5b2bbc309246d45b9946f7ba20ed68 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 30 Oct 2016 04:56:36 +0300 Subject: [PATCH 105/211] Editor for StandardLayer. --- .../Editor/Layers/StandardLayerEditor.cs | 80 +++++++++++++++++++ .../Editor/Layers/StandardLayerEditor.cs.meta | 12 +++ .../Scripts/Layers/StandardLayer.cs | 53 +++++++----- 3 files changed, 123 insertions(+), 22 deletions(-) create mode 100644 Source/Assets/TouchScript/Editor/Layers/StandardLayerEditor.cs create mode 100644 Source/Assets/TouchScript/Editor/Layers/StandardLayerEditor.cs.meta diff --git a/Source/Assets/TouchScript/Editor/Layers/StandardLayerEditor.cs b/Source/Assets/TouchScript/Editor/Layers/StandardLayerEditor.cs new file mode 100644 index 000000000..766e95e35 --- /dev/null +++ b/Source/Assets/TouchScript/Editor/Layers/StandardLayerEditor.cs @@ -0,0 +1,80 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using TouchScript.Editor.Utils; +using TouchScript.Layers; +using UnityEditor; +using UnityEngine; + +namespace TouchScript.Editor.Layers +{ + [CustomEditor(typeof(StandardLayer), true)] + internal class StandardLayerEditor : UnityEditor.Editor + { + private static readonly GUIContent TEXT_ADVANCED_HEADER = new GUIContent("Advanced", "Advanced properties."); + private static readonly GUIContent TEXT_TOP = new GUIContent("Objects to look for:"); + + private static readonly GUIContent TEXT_3D_OBJECTS = new GUIContent("Hit 3D Objects", "Layer should raycast 3D objects."); + private static readonly GUIContent TEXT_2D_OBJECTS = new GUIContent("Hit 2D Objects", "Layer should raycast 2D objects."); + private static readonly GUIContent TEXT_WORLD_UI = new GUIContent("Hit World UI", "Layer should raycast World Space UI."); + private static readonly GUIContent TEXT_SS_UI = new GUIContent("Hit Screen UI", "Layer should raycast Screen Space UI."); + private static readonly GUIContent TEXT_LAYER_MASK = new GUIContent("Layer Mask", "Layer mask."); + private static readonly GUIContent TEXT_HIT_FILTERS = new GUIContent("Use Hit FIlters", "Layer should test for individual HitTest objects."); + + private SerializedProperty advanced; + private SerializedProperty hit3DObjects; + private SerializedProperty hit2DObjects; + private SerializedProperty hitWorldSpaceUI; + private SerializedProperty hitScreenSpaceUI; + private SerializedProperty layerMask; + private SerializedProperty useHitFilters; + + protected virtual void OnEnable() + { + hideFlags = HideFlags.HideAndDontSave; + + advanced = serializedObject.FindProperty("advancedProps"); + hit3DObjects = serializedObject.FindProperty("hit3DObjects"); + hit2DObjects = serializedObject.FindProperty("hit2DObjects"); + hitWorldSpaceUI = serializedObject.FindProperty("hitWorldSpaceUI"); + hitScreenSpaceUI = serializedObject.FindProperty("hitScreenSpaceUI"); + layerMask = serializedObject.FindProperty("layerMask"); + useHitFilters = serializedObject.FindProperty("useHitFilters"); + } + + public override void OnInspectorGUI() + { + serializedObject.UpdateIfDirtyOrScript(); + + EditorGUILayout.LabelField(TEXT_TOP, EditorStyles.boldLabel); + 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); + + EditorGUI.BeginChangeCheck(); + var expanded = GUIElements.BeginFoldout(advanced.isExpanded, TEXT_ADVANCED_HEADER); + if (EditorGUI.EndChangeCheck()) + { + advanced.isExpanded = expanded; + } + if (expanded) + { + GUILayout.BeginVertical(GUIElements.FoldoutStyle); + drawAdvanced(); + GUILayout.EndVertical(); + } + GUIElements.EndFoldout(); + + serializedObject.ApplyModifiedProperties(); + } + + protected virtual void drawAdvanced() + { + EditorGUILayout.PropertyField(useHitFilters, TEXT_HIT_FILTERS); + } + + } +} diff --git a/Source/Assets/TouchScript/Editor/Layers/StandardLayerEditor.cs.meta b/Source/Assets/TouchScript/Editor/Layers/StandardLayerEditor.cs.meta new file mode 100644 index 000000000..2ac07e3ac --- /dev/null +++ b/Source/Assets/TouchScript/Editor/Layers/StandardLayerEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6dddf8a020fa54bcba36b9d67bd59978 +timeCreated: 1477791911 +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 4a71247b7..623109601 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/StandardLayer.cs @@ -11,6 +11,7 @@ using UnityEngine.EventSystems; using UnityEngine.UI; using System.Collections; +using TouchScript.Utils.Attributes; namespace TouchScript.Layers { @@ -20,40 +21,40 @@ public class StandardLayer : TouchLayer { #region Public properties - public bool LookFor3DObjects + public bool Hit3DObjects { - get { return lookFor3DObjects; } + get { return hit3DObjects; } set { - lookFor3DObjects = value; + hit3DObjects = value; updateVariants(); } } - public bool LookFor2DObjects + public bool Hit2DObjects { - get { return lookFor2DObjects; } + get { return hit2DObjects; } set { - lookFor2DObjects = value; + hit2DObjects = value; updateVariants(); } } - public bool LookForWorldSpaceUI + public bool HitWorldSpaceUI { - get { return lookForWorldSpaceUI; } + get { return hitWorldSpaceUI; } set { - lookForWorldSpaceUI = value; + hitWorldSpaceUI = value; updateVariants(); } } - public bool LookForScreenSpaceUI + public bool HitScreenSpaceUI { - get { return lookForScreenSpaceUI; } - set { lookForScreenSpaceUI = value; } + get { return hitScreenSpaceUI; } + set { hitScreenSpaceUI = value; } } public bool UseHitFilters @@ -102,21 +103,29 @@ public override Vector3 WorldProjectionNormal private static RaycastHit2D[] raycastHits2D = new RaycastHit2D[20]; [SerializeField] - private bool lookFor3DObjects = true; + private bool advancedProps; // is used to save if advanced properties are opened or closed [SerializeField] - private bool lookFor2DObjects = false; + [ToggleLeft] + private bool hit3DObjects = true; [SerializeField] - private bool lookForWorldSpaceUI = false; + [ToggleLeft] + private bool hit2DObjects = false; [SerializeField] - private bool lookForScreenSpaceUI = true; + [ToggleLeft] + private bool hitWorldSpaceUI = false; + + [SerializeField] + [ToggleLeft] + private bool hitScreenSpaceUI = true; [SerializeField] private LayerMask layerMask = -1; [SerializeField] + [ToggleLeft] private bool useHitFilters = false; private bool lookForCameraObjects = false; @@ -136,7 +145,7 @@ public override HitResult Hit(IPointer pointer, out HitData hit) var result = HitResult.Miss; - if (lookForScreenSpaceUI) + if (hitScreenSpaceUI) { result = performSSUISearch(pointer, out hit); switch (result) @@ -265,7 +274,7 @@ private HitResult performWorldSearch(IPointer pointer, out HitData hit) int count; - if (lookFor3DObjects) + if (hit3DObjects) { #if UNITY_5_3_OR_NEWER count = Physics.RaycastNonAlloc(ray, raycastHits, float.PositiveInfinity, layerMask); @@ -275,7 +284,7 @@ private HitResult performWorldSearch(IPointer pointer, out HitData hit) #endif // Try to do some optimizations if 2D and WS UI are not required - if (!lookFor2DObjects && !lookForWorldSpaceUI) + if (!hit2DObjects && !hitWorldSpaceUI) { if (count == 0) return HitResult.Miss; if (count > 1) @@ -302,13 +311,13 @@ private HitResult performWorldSearch(IPointer pointer, out HitData hit) for (var i = 0; i < count; i++) hitList.Add(new HitData(raycastHits[i], this)); } - if (lookFor2DObjects) + if (hit2DObjects) { count = Physics2D.GetRayIntersectionNonAlloc(ray, raycastHits2D, float.MaxValue, layerMask); for (var i = 0; i < count; i++) hitList.Add(new HitData(raycastHits2D[i], this)); } - if (lookForWorldSpaceUI) + if (hitWorldSpaceUI) { raycastHitUIList.Clear(); if (raycasters == null) raycasters = TouchScriptInputModule.Instance.GetRaycasters(); @@ -474,7 +483,7 @@ private HitResult doHit(IPointer pointer, RaycastHit raycastHit, out HitData hit private void updateVariants() { - lookForCameraObjects = _camera != null && (lookFor3DObjects || lookFor2DObjects || lookForWorldSpaceUI); + lookForCameraObjects = _camera != null && (hit3DObjects || hit2DObjects || hitWorldSpaceUI); } #endregion From 3d0f7cd8a601d952ec9d94967c54a1a9d3ad2ef6 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 30 Oct 2016 04:58:30 +0300 Subject: [PATCH 106/211] Updated example scenes. --- .../TouchScript/Examples/Camera/Camera.unity | 144 ++++++---- .../Examples/Checkers/Checkers.unity | 13 +- .../TouchScript/Examples/Colors/Colors.unity | 81 ++++-- .../TouchScript/Examples/Cube/Cube.unity | 151 ++++++----- .../Examples/Multiuser/Multiuser.unity | 245 +++++++++++------- .../TouchScript/Examples/Photos/Photos.unity | 13 +- .../TouchScript/Examples/Portal/Portal.unity | 13 +- .../Examples/RawInput/RawInput.unity | 92 ++++--- .../TouchScript/Examples/Taps/Taps.unity | 117 ++++++--- 9 files changed, 549 insertions(+), 320 deletions(-) diff --git a/Source/Assets/TouchScript/Examples/Camera/Camera.unity b/Source/Assets/TouchScript/Examples/Camera/Camera.unity index f29f470d0..63bb63e85 100644 --- a/Source/Assets/TouchScript/Examples/Camera/Camera.unity +++ b/Source/Assets/TouchScript/Examples/Camera/Camera.unity @@ -8,25 +8,25 @@ SceneSettings: m_PVSPortalsArray: [] m_OcclusionBakeSettings: smallestOccluder: 5 - smallestHole: .25 + smallestHole: 0.25 backfaceThreshold: 100 --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 serializedVersion: 6 m_Fog: 0 - m_FogColor: {r: .5, g: .5, b: .5, a: 1} + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 - m_FogDensity: .00999999978 + m_FogDensity: 0.01 m_LinearFogStart: 0 m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: .200000003, g: .200000003, b: .200000003, a: 1} - m_AmbientEquatorColor: {r: .200000003, g: .200000003, b: .200000003, a: 1} - m_AmbientGroundColor: {r: .200000003, g: .200000003, b: .200000003, a: 1} + 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_SkyboxMaterial: {fileID: 2100000, guid: a07fadb24ea940240afba3afc1a692cc, type: 2} - m_HaloStrength: .5 + m_HaloStrength: 0.5 m_FlareStrength: 1 m_FlareFadeSpeed: 3 m_HaloTexture: {fileID: 0} @@ -40,7 +40,7 @@ RenderSettings: --- !u!157 &4 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 5 + serializedVersion: 6 m_GIWorkflowMode: 1 m_LightmapsMode: 1 m_GISettings: @@ -66,7 +66,7 @@ LightmapSettings: m_FinalGather: 0 m_FinalGatherRayCount: 1024 m_ReflectionCompression: 2 - m_LightmapSnapshot: {fileID: 0} + m_LightingDataAsset: {fileID: 0} m_RuntimeCPUUsage: 25 --- !u!196 &5 NavMeshSettings: @@ -74,15 +74,15 @@ NavMeshSettings: m_ObjectHideFlags: 0 m_BuildSettings: serializedVersion: 2 - agentRadius: .5 + agentRadius: 0.5 agentHeight: 2 agentSlope: 45 - agentClimb: .400000006 + agentClimb: 0.4 ledgeDropHeight: 0 maxJumpAcrossDistance: 0 accuratePlacement: 0 minRegionArea: 2 - cellSize: .166666657 + cellSize: 0.16666666 manualCellSize: 0 m_NavMeshData: {fileID: 0} --- !u!1 &62216951 @@ -111,8 +111,9 @@ Transform: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 62216951} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: -11.6400003} + 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 @@ -153,7 +154,7 @@ Camera: y: 0 width: 1 height: 1 - near clip plane: .300000012 + near clip plane: 0.3 far clip plane: 1000 field of view: 30 orthographic: 0 @@ -169,7 +170,7 @@ Camera: m_HDR: 0 m_OcclusionCulling: 1 m_StereoConvergence: 10 - m_StereoSeparation: .0219999999 + m_StereoSeparation: 0.022 m_StereoMirrorMode: 0 --- !u!1 &139543607 GameObject: @@ -196,6 +197,7 @@ 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} @@ -205,7 +207,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &139543609 MonoBehaviour: m_ObjectHideFlags: 0 @@ -250,6 +252,7 @@ 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 @@ -257,7 +260,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} m_SizeDelta: {x: 60, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &242343087 MonoBehaviour: m_ObjectHideFlags: 0 @@ -336,6 +339,7 @@ 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,7 +351,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &567050689 GameObject: m_ObjectHideFlags: 0 @@ -375,14 +379,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} - m_SizeDelta: {x: 204.699997, y: 0} - m_Pivot: {x: .5, y: .5} + m_SizeDelta: {x: 204.7, y: 0} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &567050691 MonoBehaviour: m_ObjectHideFlags: 0 @@ -410,6 +415,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -486,6 +492,10 @@ Prefab: propertyPath: layers.Array.data[0] value: objectReference: {fileID: 930800605} + - 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 @@ -514,6 +524,7 @@ 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} @@ -523,7 +534,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &624081476 MonoBehaviour: m_ObjectHideFlags: 0 @@ -568,6 +579,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: - {fileID: 1981142013} - {fileID: 1552723601} @@ -614,8 +626,10 @@ Canvas: m_ReceivesEvents: 1 m_OverrideSorting: 0 m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 m_SortingLayerID: 0 m_SortingOrder: 0 + m_TargetDisplay: 0 --- !u!1 &746517018 GameObject: m_ObjectHideFlags: 0 @@ -642,6 +656,7 @@ 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 @@ -649,7 +664,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} m_SizeDelta: {x: 60, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &746517020 MonoBehaviour: m_ObjectHideFlags: 0 @@ -712,6 +727,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: - {fileID: 2135305920} - {fileID: 1462230477} @@ -729,20 +745,19 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 74ae431eff8434b0897d3f7f1cff4311, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 1 maxPointers: 1 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 1 - minScreenPointsDistance: .5 - screenTransformThreshold: .0500000007 + minScreenPointsDistance: 0.5 + screenTransformThreshold: 0.05 --- !u!54 &930800603 Rigidbody: m_ObjectHideFlags: 0 @@ -752,7 +767,7 @@ Rigidbody: serializedVersion: 2 m_Mass: 1 m_Drag: 0 - m_AngularDrag: .0500000007 + m_AngularDrag: 0.05 m_UseGravity: 0 m_IsKinematic: 1 m_Interpolate: 0 @@ -771,7 +786,7 @@ MonoBehaviour: m_EditorClassIdentifier: TwoFingerMoveGesture: {fileID: 930800602} ManipulationGesture: {fileID: 930800606} - PanSpeed: .00999999978 + PanSpeed: 0.01 RotationSpeed: 200 ZoomSpeed: 10 --- !u!114 &930800605 @@ -799,20 +814,19 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 74ae431eff8434b0897d3f7f1cff4311, type: 3} m_Name: m_EditorClassIdentifier: - debugMode: 0 advancedProps: 0 minPointers: 2 maxPointers: 10 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 7 - minScreenPointsDistance: .5 - screenTransformThreshold: .200000003 + minScreenPointsDistance: 0.5 + screenTransformThreshold: 0.2 --- !u!1 &1138005899 GameObject: m_ObjectHideFlags: 0 @@ -839,6 +853,7 @@ 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 @@ -846,7 +861,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} m_SizeDelta: {x: 60, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1138005901 MonoBehaviour: m_ObjectHideFlags: 0 @@ -907,14 +922,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} - m_SizeDelta: {x: 204.699997, y: 0} - m_Pivot: {x: .5, y: .5} + m_SizeDelta: {x: 204.7, y: 0} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1399100005 MonoBehaviour: m_ObjectHideFlags: 0 @@ -942,6 +958,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -994,14 +1011,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} - m_SizeDelta: {x: 204.699997, y: 0} - m_Pivot: {x: .5, y: .5} + m_SizeDelta: {x: 204.7, y: 0} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1408280582 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1029,6 +1047,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -1080,6 +1099,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: - {fileID: 62216952} m_Father: {fileID: 930800601} @@ -1110,6 +1130,7 @@ 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 @@ -1117,7 +1138,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} m_SizeDelta: {x: 60, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1541924795 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1178,6 +1199,7 @@ 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 @@ -1185,7 +1207,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 156, y: 78} m_SizeDelta: {x: 276, y: 128} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1552723602 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1213,6 +1235,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 0 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -1270,6 +1293,7 @@ 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} @@ -1279,7 +1303,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1679844151 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1325,14 +1349,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} - m_SizeDelta: {x: 204.699997, y: 0} - m_Pivot: {x: .5, y: .5} + m_SizeDelta: {x: 204.7, y: 0} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1713463341 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1374,6 +1399,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -1424,6 +1450,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: 4 @@ -1494,6 +1521,7 @@ 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} @@ -1503,7 +1531,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1962593005 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1546,15 +1574,16 @@ 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_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: .252637833, y: 1} + m_AnchorMax: {x: 0.25263783, y: 1} m_AnchoredPosition: {x: 5, y: 50} m_SizeDelta: {x: -10, y: -120} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &2072767610 GameObject: m_ObjectHideFlags: 0 @@ -1591,8 +1620,10 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_ScaleInLightmap: 1 m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 - m_AutoUVMaxDistance: .5 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} m_SortingLayerID: 0 @@ -1607,7 +1638,7 @@ SphereCollider: m_IsTrigger: 0 m_Enabled: 1 serializedVersion: 2 - m_Radius: .5 + m_Radius: 0.5 m_Center: {x: 0, y: 0, z: 0} --- !u!33 &2072767613 MeshFilter: @@ -1622,9 +1653,10 @@ Transform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 2072767610} - m_LocalRotation: {x: -.0799503922, y: .910241425, z: -.208807573, w: .348522633} + 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.29649591, y: 4.29649305, z: 4.29649305} + 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 @@ -1650,9 +1682,10 @@ Transform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 2135305919} - m_LocalRotation: {x: .329245895, y: -.19317472, z: .128770933, w: .915258884} - m_LocalPosition: {x: 6.10041475, y: 15.5403843, z: -20.5662251} + 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 @@ -1666,16 +1699,17 @@ Light: serializedVersion: 6 m_Type: 1 m_Color: {r: 1, g: 1, b: 1, a: 1} - m_Intensity: 1.29999995 + m_Intensity: 1.3 m_Range: 10 m_SpotAngle: 30 m_CookieSize: 10 m_Shadows: m_Type: 1 m_Resolution: 3 - m_Strength: .185000002 - m_Bias: .100000001 - m_NormalBias: .400000006 + m_Strength: 0.185 + m_Bias: 0.1 + m_NormalBias: 0.4 + m_NearPlane: 0.2 m_Cookie: {fileID: 0} m_DrawHalo: 0 m_Flare: {fileID: 0} diff --git a/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity b/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity index 3a34293da..77ce58a3f 100644 --- a/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity +++ b/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity @@ -184,10 +184,11 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Name: Camera - lookFor3DObjects: 1 - lookFor2DObjects: 0 - lookForWorldSpaceUI: 0 - lookForScreenSpaceUI: 0 + advancedProps: 0 + hit3DObjects: 1 + hit2DObjects: 0 + hitWorldSpaceUI: 0 + hitScreenSpaceUI: 1 layerMask: serializedVersion: 2 m_Bits: 4294967295 @@ -487,6 +488,10 @@ 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 diff --git a/Source/Assets/TouchScript/Examples/Colors/Colors.unity b/Source/Assets/TouchScript/Examples/Colors/Colors.unity index c15a95731..4d7cd24cc 100644 --- a/Source/Assets/TouchScript/Examples/Colors/Colors.unity +++ b/Source/Assets/TouchScript/Examples/Colors/Colors.unity @@ -8,25 +8,25 @@ SceneSettings: m_PVSPortalsArray: [] m_OcclusionBakeSettings: smallestOccluder: 5 - smallestHole: .25 + smallestHole: 0.25 backfaceThreshold: 100 --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 serializedVersion: 6 m_Fog: 0 - m_FogColor: {r: .5, g: .5, b: .5, a: 1} + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 - m_FogDensity: .00999999978 + m_FogDensity: 0.01 m_LinearFogStart: 0 m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: .200000003, g: .200000003, b: .200000003, a: 1} - m_AmbientEquatorColor: {r: .200000003, g: .200000003, b: .200000003, a: 1} - m_AmbientGroundColor: {r: .200000003, g: .200000003, b: .200000003, a: 1} + 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_SkyboxMaterial: {fileID: 2100000, guid: a07fadb24ea940240afba3afc1a692cc, type: 2} - m_HaloStrength: .5 + m_HaloStrength: 0.5 m_FlareStrength: 1 m_FlareFadeSpeed: 3 m_HaloTexture: {fileID: 0} @@ -40,7 +40,7 @@ RenderSettings: --- !u!157 &4 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 5 + serializedVersion: 6 m_GIWorkflowMode: 1 m_LightmapsMode: 1 m_GISettings: @@ -66,7 +66,7 @@ LightmapSettings: m_FinalGather: 0 m_FinalGatherRayCount: 1024 m_ReflectionCompression: 2 - m_LightmapSnapshot: {fileID: 0} + m_LightingDataAsset: {fileID: 0} m_RuntimeCPUUsage: 25 --- !u!196 &5 NavMeshSettings: @@ -74,15 +74,15 @@ NavMeshSettings: m_ObjectHideFlags: 0 m_BuildSettings: serializedVersion: 2 - agentRadius: .5 + agentRadius: 0.5 agentHeight: 2 agentSlope: 45 - agentClimb: .400000006 + agentClimb: 0.4 ledgeDropHeight: 0 maxJumpAcrossDistance: 0 accuratePlacement: 0 minRegionArea: 2 - cellSize: .166666657 + cellSize: 0.16666666 manualCellSize: 0 m_NavMeshData: {fileID: 0} --- !u!1 &62216951 @@ -114,6 +114,7 @@ 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 @@ -129,13 +130,15 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Name: Camera - lookFor3DObjects: 0 - lookFor2DObjects: 1 - lookForWorldSpaceUI: 0 - lookForScreenSpaceUI: 0 + advancedProps: 0 + hit3DObjects: 1 + hit2DObjects: 0 + hitWorldSpaceUI: 0 + hitScreenSpaceUI: 1 layerMask: serializedVersion: 2 m_Bits: 4294967295 + useHitFilters: 0 --- !u!81 &62216954 AudioListener: m_ObjectHideFlags: 0 @@ -173,7 +176,7 @@ Camera: y: 0 width: 1 height: 1 - near clip plane: .300000012 + near clip plane: 0.3 far clip plane: 40 field of view: 30 orthographic: 1 @@ -189,7 +192,7 @@ Camera: m_HDR: 0 m_OcclusionCulling: 1 m_StereoConvergence: 10 - m_StereoSeparation: .0219999999 + m_StereoSeparation: 0.022 m_StereoMirrorMode: 0 --- !u!1 &68250096 GameObject: @@ -215,6 +218,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: 930800601} m_RootOrder: 1 @@ -263,6 +267,7 @@ 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} @@ -272,7 +277,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1001 &543251036 Prefab: m_ObjectHideFlags: 0 @@ -324,6 +329,10 @@ Prefab: 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 @@ -376,6 +385,7 @@ 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} @@ -385,7 +395,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &602940324 MonoBehaviour: m_ObjectHideFlags: 0 @@ -430,6 +440,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: - {fileID: 1981142013} - {fileID: 1552723601} @@ -476,8 +487,10 @@ Canvas: m_ReceivesEvents: 1 m_OverrideSorting: 0 m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 m_SortingLayerID: 0 m_SortingOrder: 0 + m_TargetDisplay: 0 --- !u!1 &930800600 GameObject: m_ObjectHideFlags: 0 @@ -503,6 +516,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: - {fileID: 62216952} - {fileID: 68250097} @@ -548,6 +562,7 @@ 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 @@ -555,7 +570,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 196, y: 0} m_SizeDelta: {x: 242, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1122129734 MonoBehaviour: m_ObjectHideFlags: 0 @@ -597,6 +612,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -634,6 +650,7 @@ 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 @@ -641,7 +658,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} m_SizeDelta: {x: 60, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1138005901 MonoBehaviour: m_ObjectHideFlags: 0 @@ -702,6 +719,7 @@ 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 @@ -709,7 +727,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 196, y: 0} m_SizeDelta: {x: 242, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1408280582 MonoBehaviour: m_ObjectHideFlags: 0 @@ -737,6 +755,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -791,6 +810,7 @@ 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 @@ -798,7 +818,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 178, y: 78} m_SizeDelta: {x: 320, y: 128} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1552723602 MonoBehaviour: m_ObjectHideFlags: 0 @@ -826,6 +846,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 0 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -883,6 +904,7 @@ 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} @@ -892,7 +914,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1679844151 MonoBehaviour: m_ObjectHideFlags: 0 @@ -950,6 +972,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: 4 @@ -999,15 +1022,16 @@ 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_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: .252637833, y: 1} + m_AnchorMax: {x: 0.25263783, y: 1} m_AnchoredPosition: {x: 5, y: 50} m_SizeDelta: {x: -10, y: -120} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &2046579558 GameObject: m_ObjectHideFlags: 0 @@ -1034,6 +1058,7 @@ 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 @@ -1041,7 +1066,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} m_SizeDelta: {x: 60, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &2046579560 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/Source/Assets/TouchScript/Examples/Cube/Cube.unity b/Source/Assets/TouchScript/Examples/Cube/Cube.unity index 534c13087..9591d906f 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Cube.unity +++ b/Source/Assets/TouchScript/Examples/Cube/Cube.unity @@ -8,25 +8,25 @@ SceneSettings: m_PVSPortalsArray: [] m_OcclusionBakeSettings: smallestOccluder: 5 - smallestHole: .25 + smallestHole: 0.25 backfaceThreshold: 100 --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 serializedVersion: 6 m_Fog: 0 - m_FogColor: {r: .5, g: .5, b: .5, a: 1} + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 - m_FogDensity: .00999999978 + m_FogDensity: 0.01 m_LinearFogStart: 0 m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: .200000003, g: .200000003, b: .200000003, a: 1} - m_AmbientEquatorColor: {r: .200000003, g: .200000003, b: .200000003, a: 1} - m_AmbientGroundColor: {r: .200000003, g: .200000003, b: .200000003, a: 1} + 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_SkyboxMaterial: {fileID: 2100000, guid: a07fadb24ea940240afba3afc1a692cc, type: 2} - m_HaloStrength: .5 + m_HaloStrength: 0.5 m_FlareStrength: 1 m_FlareFadeSpeed: 3 m_HaloTexture: {fileID: 0} @@ -40,7 +40,7 @@ RenderSettings: --- !u!157 &4 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 5 + serializedVersion: 6 m_GIWorkflowMode: 1 m_LightmapsMode: 1 m_GISettings: @@ -66,7 +66,7 @@ LightmapSettings: m_FinalGather: 0 m_FinalGatherRayCount: 1024 m_ReflectionCompression: 2 - m_LightmapSnapshot: {fileID: 0} + m_LightingDataAsset: {fileID: 0} m_RuntimeCPUUsage: 25 --- !u!196 &5 NavMeshSettings: @@ -74,15 +74,15 @@ NavMeshSettings: m_ObjectHideFlags: 0 m_BuildSettings: serializedVersion: 2 - agentRadius: .5 + agentRadius: 0.5 agentHeight: 2 agentSlope: 45 - agentClimb: .400000006 + agentClimb: 0.4 ledgeDropHeight: 0 maxJumpAcrossDistance: 0 accuratePlacement: 0 minRegionArea: 2 - cellSize: .166666657 + cellSize: 0.16666666 manualCellSize: 0 m_NavMeshData: {fileID: 0} --- !u!1 &62216951 @@ -111,9 +111,10 @@ Transform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 62216951} - m_LocalRotation: {x: .978753865, y: 0, z: 0, w: .205038756} + 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: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 930800601} m_RootOrder: 1 @@ -129,13 +130,15 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Name: Camera - lookFor3DObjects: 1 - lookFor2DObjects: 0 - lookForWorldSpaceUI: 0 - lookForScreenSpaceUI: 0 + advancedProps: 0 + hit3DObjects: 1 + hit2DObjects: 0 + hitWorldSpaceUI: 0 + hitScreenSpaceUI: 1 layerMask: serializedVersion: 2 m_Bits: 4294967295 + useHitFilters: 0 --- !u!81 &62216954 AudioListener: m_ObjectHideFlags: 0 @@ -173,7 +176,7 @@ Camera: y: 0 width: 1 height: 1 - near clip plane: .300000012 + near clip plane: 0.3 far clip plane: 1000 field of view: 30 orthographic: 0 @@ -189,7 +192,7 @@ Camera: m_HDR: 0 m_OcclusionCulling: 1 m_StereoConvergence: 10 - m_StereoSeparation: .0219999999 + m_StereoSeparation: 0.022 m_StereoMirrorMode: 0 --- !u!1 &172819027 GameObject: @@ -216,6 +219,7 @@ 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: 732284830} - {fileID: 891499233} @@ -225,7 +229,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &172819029 MonoBehaviour: m_ObjectHideFlags: 0 @@ -289,6 +293,7 @@ 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: 172819028} @@ -298,7 +303,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1001 &543251036 Prefab: m_ObjectHideFlags: 0 @@ -346,6 +351,10 @@ Prefab: propertyPath: layers.Array.data[1] 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 @@ -432,6 +441,7 @@ 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: 172819028} m_RootOrder: 0 @@ -439,7 +449,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} m_SizeDelta: {x: 60, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &740851131 GameObject: m_ObjectHideFlags: 0 @@ -466,6 +476,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: - {fileID: 1981142013} - {fileID: 1552723601} @@ -512,8 +523,10 @@ Canvas: m_ReceivesEvents: 1 m_OverrideSorting: 0 m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 m_SortingLayerID: 0 m_SortingOrder: 0 + m_TargetDisplay: 0 --- !u!1 &891499232 GameObject: m_ObjectHideFlags: 0 @@ -541,14 +554,15 @@ 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: 172819028} m_RootOrder: 1 m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} - m_SizeDelta: {x: 204.699997, y: 0} - m_Pivot: {x: .5, y: .5} + m_SizeDelta: {x: 204.7, y: 0} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &891499234 MonoBehaviour: m_ObjectHideFlags: 0 @@ -590,6 +604,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -629,6 +644,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: - {fileID: 2135305920} - {fileID: 62216952} @@ -686,9 +702,10 @@ Transform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 963048123} - m_LocalRotation: {x: 0, y: 0, z: 1, w: -1.62920685e-07} - m_LocalPosition: {x: 0, y: 0, z: 5.15999985} - m_LocalScale: {x: 2, y: 2, z: .047008425} + m_LocalRotation: {x: 0, y: 0, z: 1, w: -0.00000016292068} + m_LocalPosition: {x: 0, y: 0, z: 5.16} + m_LocalScale: {x: 2, y: 2, z: 0.047008425} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 1459600543} m_RootOrder: 0 @@ -710,8 +727,10 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_ScaleInLightmap: 1 m_PreserveUVs: 1 + m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 - m_AutoUVMaxDistance: .5 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} m_SortingLayerID: 0 @@ -761,15 +780,15 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 7 - minScreenPointsDistance: .5 - screenTransformThreshold: .100000001 + minScreenPointsDistance: 0.5 + screenTransformThreshold: 0.1 projection: 0 projectionPlaneNormal: {x: 0, y: 0, z: 1} --- !u!1 &1138005899 @@ -798,6 +817,7 @@ 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 @@ -805,7 +825,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} m_SizeDelta: {x: 60, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1138005901 MonoBehaviour: m_ObjectHideFlags: 0 @@ -866,14 +886,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} - m_SizeDelta: {x: 204.699997, y: 0} - m_Pivot: {x: .5, y: .5} + m_SizeDelta: {x: 204.7, y: 0} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1408280582 MonoBehaviour: m_ObjectHideFlags: 0 @@ -901,6 +922,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -949,9 +971,10 @@ Transform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1459600542} - m_LocalRotation: {x: 0, y: .744719267, z: 0, w: -.667377949} + m_LocalRotation: {x: 0, y: 0.74471927, z: 0, w: -0.66737795} m_LocalPosition: {x: 1000, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 963048124} m_Father: {fileID: 930800601} @@ -968,13 +991,15 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Name: RenderTexture Camera - lookFor3DObjects: 1 - lookFor2DObjects: 0 - lookForWorldSpaceUI: 0 - lookForScreenSpaceUI: 0 + advancedProps: 0 + hit3DObjects: 1 + hit2DObjects: 0 + hitWorldSpaceUI: 0 + hitScreenSpaceUI: 1 layerMask: serializedVersion: 2 m_Bits: 4294967295 + useHitFilters: 0 --- !u!20 &1459600547 Camera: m_ObjectHideFlags: 0 @@ -984,14 +1009,14 @@ Camera: m_Enabled: 1 serializedVersion: 2 m_ClearFlags: 1 - m_BackGroundColor: {r: .192156866, g: .301960796, b: .474509805, a: .0196078438} + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0.019607844} m_NormalizedViewPortRect: serializedVersion: 2 x: 0 y: 0 width: 1 height: 1 - near clip plane: .300000012 + near clip plane: 0.3 far clip plane: 1000 field of view: 60 orthographic: 0 @@ -1007,7 +1032,7 @@ Camera: m_HDR: 0 m_OcclusionCulling: 1 m_StereoConvergence: 10 - m_StereoSeparation: .0219999999 + m_StereoSeparation: 0.022 m_StereoMirrorMode: 0 --- !u!1 &1552723600 GameObject: @@ -1036,14 +1061,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 178, y: 48.2000008} + m_AnchoredPosition: {x: 178, y: 48.2} m_SizeDelta: {x: 320, y: 122.32} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1552723602 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1071,6 +1097,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 0 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -1126,6 +1153,7 @@ 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} @@ -1135,7 +1163,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1679844151 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1193,6 +1221,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: 4 @@ -1281,7 +1310,7 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -1305,8 +1334,10 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_ScaleInLightmap: 1 m_PreserveUVs: 1 + m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 - m_AutoUVMaxDistance: .5 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} m_SortingLayerID: 0 @@ -1336,9 +1367,10 @@ Transform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1880100167} - m_LocalRotation: {x: 0, y: -.327581882, z: 0, w: .944822788} - m_LocalPosition: {x: .0500000007, y: -2.9000001, z: -6.5} - m_LocalScale: {x: -2.61016512, y: -2.61016393, z: 2.6101644} + m_LocalRotation: {x: 0, y: -0.32758188, z: 0, w: 0.9448228} + m_LocalPosition: {x: 0.05, y: -2.9, z: -6.5} + m_LocalScale: {x: -2.610165, y: -2.610164, z: 2.6101644} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 930800601} m_RootOrder: 2 @@ -1366,15 +1398,16 @@ 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_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: .252637833, y: 1} + m_AnchorMax: {x: 0.25263783, y: 1} m_AnchoredPosition: {x: 5, y: 50} m_SizeDelta: {x: -10, y: -120} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &2135305919 GameObject: m_ObjectHideFlags: 0 @@ -1397,9 +1430,10 @@ Transform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 2135305919} - m_LocalRotation: {x: .32484895, y: -.867448151, z: .0434053168, w: .374329984} - m_LocalPosition: {x: 6.10041475, y: 15.5403843, z: -20.5662251} + 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 @@ -1413,16 +1447,17 @@ Light: serializedVersion: 6 m_Type: 1 m_Color: {r: 1, g: 1, b: 1, a: 1} - m_Intensity: 1.29999995 + m_Intensity: 1.3 m_Range: 10 m_SpotAngle: 30 m_CookieSize: 10 m_Shadows: m_Type: 2 m_Resolution: 3 - m_Strength: .560000002 - m_Bias: .100000001 - m_NormalBias: .400000006 + 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} diff --git a/Source/Assets/TouchScript/Examples/Multiuser/Multiuser.unity b/Source/Assets/TouchScript/Examples/Multiuser/Multiuser.unity index e060a6acf..d4105c102 100644 --- a/Source/Assets/TouchScript/Examples/Multiuser/Multiuser.unity +++ b/Source/Assets/TouchScript/Examples/Multiuser/Multiuser.unity @@ -8,25 +8,25 @@ SceneSettings: m_PVSPortalsArray: [] m_OcclusionBakeSettings: smallestOccluder: 5 - smallestHole: .25 + smallestHole: 0.25 backfaceThreshold: 100 --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 serializedVersion: 6 m_Fog: 0 - m_FogColor: {r: .5, g: .5, b: .5, a: 1} + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 - m_FogDensity: .00999999978 + m_FogDensity: 0.01 m_LinearFogStart: 0 m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: .200000003, g: .200000003, b: .200000003, a: 1} - m_AmbientEquatorColor: {r: .200000003, g: .200000003, b: .200000003, a: 1} - m_AmbientGroundColor: {r: .200000003, g: .200000003, b: .200000003, a: 1} + 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_SkyboxMaterial: {fileID: 2100000, guid: a07fadb24ea940240afba3afc1a692cc, type: 2} - m_HaloStrength: .5 + m_HaloStrength: 0.5 m_FlareStrength: 1 m_FlareFadeSpeed: 3 m_HaloTexture: {fileID: 0} @@ -40,7 +40,7 @@ RenderSettings: --- !u!157 &4 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 5 + serializedVersion: 6 m_GIWorkflowMode: 1 m_LightmapsMode: 1 m_GISettings: @@ -66,7 +66,7 @@ LightmapSettings: m_FinalGather: 0 m_FinalGatherRayCount: 1024 m_ReflectionCompression: 2 - m_LightmapSnapshot: {fileID: 0} + m_LightingDataAsset: {fileID: 0} m_RuntimeCPUUsage: 25 --- !u!196 &5 NavMeshSettings: @@ -74,15 +74,15 @@ NavMeshSettings: m_ObjectHideFlags: 0 m_BuildSettings: serializedVersion: 2 - agentRadius: .5 + agentRadius: 0.5 agentHeight: 2 agentSlope: 45 - agentClimb: .400000006 + agentClimb: 0.4 ledgeDropHeight: 0 maxJumpAcrossDistance: 0 accuratePlacement: 0 minRegionArea: 2 - cellSize: .166666657 + cellSize: 0.16666666 manualCellSize: 0 m_NavMeshData: {fileID: 0} --- !u!4 &67866218 stripped @@ -437,8 +437,9 @@ Transform: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 269580355} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: -.101000004, z: 0} - m_LocalScale: {x: 10, y: .200000003, z: 10} + 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: 1164346782} m_RootOrder: 0 @@ -451,7 +452,7 @@ Rigidbody: serializedVersion: 2 m_Mass: 1 m_Drag: 0 - m_AngularDrag: .0500000007 + m_AngularDrag: 0.05 m_UseGravity: 0 m_IsKinematic: 1 m_Interpolate: 0 @@ -469,7 +470,7 @@ BoxCollider: m_Enabled: 1 serializedVersion: 2 m_Size: {x: 1, y: 1, z: 1} - m_Center: {x: 0, y: .00999999978, z: 0} + m_Center: {x: 0, y: 0.01, z: 0} --- !u!23 &269580359 MeshRenderer: m_ObjectHideFlags: 0 @@ -489,8 +490,10 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_ScaleInLightmap: 1 m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 - m_AutoUVMaxDistance: .5 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} m_SortingLayerID: 0 @@ -534,14 +537,15 @@ 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: 1622510500} m_RootOrder: 1 m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} - m_SizeDelta: {x: 204.699997, y: 0} - m_Pivot: {x: .5, y: .5} + m_SizeDelta: {x: 204.7, y: 0} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &437243917 MonoBehaviour: m_ObjectHideFlags: 0 @@ -583,6 +587,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -624,6 +629,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: - {fileID: 1360329865} - {fileID: 878382147} @@ -670,8 +676,10 @@ Canvas: m_ReceivesEvents: 1 m_OverrideSorting: 0 m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 m_SortingLayerID: 0 m_SortingOrder: 0 + m_TargetDisplay: 0 --- !u!4 &494059473 stripped Transform: m_PrefabParentObject: {fileID: 491238, guid: bb0a05fd2c374477cba1d93212b4600c, type: 2} @@ -702,8 +710,9 @@ Transform: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 501236164} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -1.20000005, y: -22.1000004, z: 0} + m_LocalPosition: {x: -1.2, y: -22.1, z: 0} m_LocalScale: {x: 3, y: 3, z: 3} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 2096873804} m_RootOrder: 0 @@ -723,7 +732,7 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -752,6 +761,7 @@ BoxCollider2D: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 501236164} m_Enabled: 1 + m_Density: 1 m_Material: {fileID: 0} m_IsTrigger: 0 m_UsedByEffector: 0 @@ -777,14 +787,18 @@ SpriteRenderer: m_ProbeAnchor: {fileID: 0} m_ScaleInLightmap: 1 m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 - m_AutoUVMaxDistance: .5 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} m_SortingLayerID: 0 m_SortingOrder: 0 m_Sprite: {fileID: 21300000, guid: 533b9df4691d947d9921a0053b5ce231, type: 3} m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 --- !u!1 &519196852 GameObject: m_ObjectHideFlags: 0 @@ -811,8 +825,9 @@ Transform: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 519196852} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: -.101000004, z: 0} - m_LocalScale: {x: 10, y: .200000003, z: 10} + 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: 1388179442} m_RootOrder: 0 @@ -825,7 +840,7 @@ Rigidbody: serializedVersion: 2 m_Mass: 1 m_Drag: 0 - m_AngularDrag: .0500000007 + m_AngularDrag: 0.05 m_UseGravity: 0 m_IsKinematic: 1 m_Interpolate: 0 @@ -843,7 +858,7 @@ BoxCollider: m_Enabled: 1 serializedVersion: 2 m_Size: {x: 1, y: 1, z: 1} - m_Center: {x: 0, y: .00999999978, z: 0} + m_Center: {x: 0, y: 0.01, z: 0} --- !u!23 &519196856 MeshRenderer: m_ObjectHideFlags: 0 @@ -863,8 +878,10 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_ScaleInLightmap: 1 m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 - m_AutoUVMaxDistance: .5 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} m_SortingLayerID: 0 @@ -903,8 +920,9 @@ Transform: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 529543778} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 6.5999999, y: -22.1000004, z: 0} + m_LocalPosition: {x: 6.6, y: -22.1, z: 0} m_LocalScale: {x: 3, y: 3, z: 3} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 2096873804} m_RootOrder: 2 @@ -924,7 +942,7 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -953,6 +971,7 @@ BoxCollider2D: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 529543778} m_Enabled: 1 + m_Density: 1 m_Material: {fileID: 0} m_IsTrigger: 0 m_UsedByEffector: 0 @@ -978,14 +997,18 @@ SpriteRenderer: m_ProbeAnchor: {fileID: 0} m_ScaleInLightmap: 1 m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 - m_AutoUVMaxDistance: .5 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} m_SortingLayerID: 0 m_SortingOrder: 0 m_Sprite: {fileID: 21300000, guid: 533b9df4691d947d9921a0053b5ce231, type: 3} m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 --- !u!1001 &543251036 Prefab: m_ObjectHideFlags: 0 @@ -1049,6 +1072,10 @@ 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 @@ -1234,6 +1261,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: - {fileID: 1969944223} - {fileID: 871116140} @@ -1328,9 +1356,10 @@ Transform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 723351972} - m_LocalRotation: {x: 0, y: .347671896, z: 0, w: -.937616289} + m_LocalRotation: {x: 0, y: 0.3476719, z: 0, w: -0.9376163} m_LocalPosition: {x: 100, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1388179442} m_Father: {fileID: 655915741} @@ -1361,15 +1390,15 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 1 - minScreenPointsDistance: .5 - screenTransformThreshold: .100000001 + minScreenPointsDistance: 0.5 + screenTransformThreshold: 0.1 projection: 0 projectionPlaneNormal: {x: 0, y: 0, z: 1} --- !u!4 &739470077 stripped @@ -1400,6 +1429,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: - {fileID: 1828860094} - {fileID: 2014918824} @@ -1458,6 +1488,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: 4 @@ -1582,11 +1613,11 @@ Camera: m_BackGroundColor: {r: 0, g: 0, b: 0, a: 1} m_NormalizedViewPortRect: serializedVersion: 2 - x: .5 + x: 0.5 y: 0 - width: .5 + width: 0.5 height: 1 - near clip plane: .300000012 + near clip plane: 0.3 far clip plane: 1000 field of view: 60 orthographic: 0 @@ -1602,7 +1633,7 @@ Camera: m_HDR: 0 m_OcclusionCulling: 1 m_StereoConvergence: 10 - m_StereoSeparation: .0219999999 + m_StereoSeparation: 0.022 m_StereoMirrorMode: 0 --- !u!4 &871116140 Transform: @@ -1610,9 +1641,10 @@ Transform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 871116138} - m_LocalRotation: {x: -.426461279, y: .452098191, z: -.261019111, w: -.738652229} - m_LocalPosition: {x: 104.459999, y: 9.65999985, z: -2.17000008} + m_LocalRotation: {x: -0.42646128, y: 0.4520982, z: -0.2610191, w: -0.7386522} + m_LocalPosition: {x: 104.46, y: 9.66, z: -2.17} m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 655915741} m_RootOrder: 1 @@ -1628,13 +1660,15 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Name: Right 3D Camera - lookFor3DObjects: 1 - lookFor2DObjects: 0 - lookForWorldSpaceUI: 0 - lookForScreenSpaceUI: 0 + advancedProps: 0 + hit3DObjects: 1 + hit2DObjects: 0 + hitWorldSpaceUI: 0 + hitScreenSpaceUI: 1 layerMask: serializedVersion: 2 m_Bits: 4294967295 + useHitFilters: 0 --- !u!4 &872399230 stripped Transform: m_PrefabParentObject: {fileID: 491238, guid: bb0a05fd2c374477cba1d93212b4600c, type: 2} @@ -1666,6 +1700,7 @@ 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: 479835906} m_RootOrder: 1 @@ -1673,7 +1708,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: -152, y: -74} m_SizeDelta: {x: 276, y: 128} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &878382148 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1715,6 +1750,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 2 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -1752,6 +1788,7 @@ 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: 1495978976} - {fileID: 1863190594} @@ -1761,7 +1798,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &897580454 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1936,8 +1973,9 @@ Transform: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1060318960} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -9, y: -22.1000004, z: 0} + m_LocalPosition: {x: -9, y: -22.1, z: 0} m_LocalScale: {x: 3, y: 3, z: 3} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 2096873804} m_RootOrder: 1 @@ -1957,7 +1995,7 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -1986,6 +2024,7 @@ BoxCollider2D: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1060318960} m_Enabled: 1 + m_Density: 1 m_Material: {fileID: 0} m_IsTrigger: 0 m_UsedByEffector: 0 @@ -2011,14 +2050,18 @@ SpriteRenderer: m_ProbeAnchor: {fileID: 0} m_ScaleInLightmap: 1 m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 - m_AutoUVMaxDistance: .5 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} m_SortingLayerID: 0 m_SortingOrder: 0 m_Sprite: {fileID: 21300000, guid: 533b9df4691d947d9921a0053b5ce231, type: 3} m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 --- !u!1001 &1140734431 Prefab: m_ObjectHideFlags: 0 @@ -2087,8 +2130,9 @@ Transform: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1164346781} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: .100000001} + m_LocalPosition: {x: 0, y: 0, z: 0.1} m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 269580356} - {fileID: 750573663} @@ -2110,14 +2154,14 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 2 - screenTransformThreshold: .0500000007 + screenTransformThreshold: 0.05 projection: 2 projectionPlaneNormal: {x: 0, y: 1, z: 0} --- !u!114 &1164346784 @@ -2151,8 +2195,10 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_ScaleInLightmap: 1 m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 - m_AutoUVMaxDistance: .5 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} m_SortingLayerID: 0 @@ -2357,6 +2403,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: - {fileID: 151770227} - {fileID: 96602513} @@ -2444,6 +2491,7 @@ 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: 1622510500} m_RootOrder: 0 @@ -2451,7 +2499,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} m_SizeDelta: {x: 60, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1266638326 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2517,15 +2565,16 @@ 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: 1735991412} m_Father: {fileID: 479835906} m_RootOrder: 0 m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: .252637833, y: 1} + m_AnchorMax: {x: 0.25263783, y: 1} m_AnchoredPosition: {x: 5, y: 50} m_SizeDelta: {x: -10, y: -120} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &1388179441 GameObject: m_ObjectHideFlags: 0 @@ -2552,8 +2601,9 @@ Transform: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1388179441} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: .100000001} + m_LocalPosition: {x: 0, y: 0, z: 0.1} m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 519196853} - {fileID: 1212863163} @@ -2575,14 +2625,14 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 2 - screenTransformThreshold: .0500000007 + screenTransformThreshold: 0.05 projection: 2 projectionPlaneNormal: {x: 0, y: 1, z: 0} --- !u!114 &1388179444 @@ -2616,8 +2666,10 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_ScaleInLightmap: 1 m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 - m_AutoUVMaxDistance: .5 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} m_SortingLayerID: 0 @@ -2699,8 +2751,9 @@ Transform: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1416507462} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: -51.8510284} + m_LocalPosition: {x: 0, y: 0, z: -51.85103} m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 655915741} m_RootOrder: 2 @@ -2734,14 +2787,14 @@ Camera: m_Enabled: 1 serializedVersion: 2 m_ClearFlags: 3 - m_BackGroundColor: {r: .192156866, g: .301960796, b: .474509805, a: .0196078438} + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0.019607844} m_NormalizedViewPortRect: serializedVersion: 2 x: 0 y: 0 width: 1 height: 1 - near clip plane: .300000012 + near clip plane: 0.3 far clip plane: 1000 field of view: 60 orthographic: 0 @@ -2757,7 +2810,7 @@ Camera: m_HDR: 0 m_OcclusionCulling: 1 m_StereoConvergence: 10 - m_StereoSeparation: .0219999999 + m_StereoSeparation: 0.022 m_StereoMirrorMode: 0 --- !u!114 &1416507468 MonoBehaviour: @@ -2771,13 +2824,15 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Name: 2D Camera - lookFor3DObjects: 0 - lookFor2DObjects: 1 - lookForWorldSpaceUI: 0 - lookForScreenSpaceUI: 0 + advancedProps: 0 + hit3DObjects: 1 + hit2DObjects: 0 + hitWorldSpaceUI: 0 + hitScreenSpaceUI: 1 layerMask: serializedVersion: 2 m_Bits: 4294967295 + useHitFilters: 0 --- !u!4 &1442124646 stripped Transform: m_PrefabParentObject: {fileID: 491238, guid: bb0a05fd2c374477cba1d93212b4600c, type: 2} @@ -2812,6 +2867,7 @@ 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: 897580453} m_RootOrder: 0 @@ -2819,7 +2875,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} m_SizeDelta: {x: 60, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1495978977 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2974,6 +3030,7 @@ 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: 1266638325} - {fileID: 437243916} @@ -2983,7 +3040,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1622510501 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3101,6 +3158,7 @@ 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: 897580453} - {fileID: 1622510500} @@ -3110,7 +3168,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!4 &1749205319 stripped Transform: m_PrefabParentObject: {fileID: 491238, guid: bb0a05fd2c374477cba1d93212b4600c, type: 2} @@ -3193,9 +3251,10 @@ Transform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1810922939} - m_LocalRotation: {x: .408217937, y: -.234569728, z: .109381661, w: .875426114} + m_LocalRotation: {x: 0.40821794, y: -0.23456973, z: 0.10938166, w: 0.8754261} m_LocalPosition: {x: 0, y: 2, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 655915741} m_RootOrder: 6 @@ -3216,9 +3275,10 @@ Light: m_Shadows: m_Type: 0 m_Resolution: 3 - m_Strength: .109999999 - m_Bias: .0500000007 - m_NormalBias: .400000006 + m_Strength: 0.11 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 m_Cookie: {fileID: 0} m_DrawHalo: 0 m_Flare: {fileID: 0} @@ -3262,14 +3322,15 @@ 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: 897580453} m_RootOrder: 1 m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} - m_SizeDelta: {x: 204.699997, y: 0} - m_Pivot: {x: .5, y: .5} + m_SizeDelta: {x: 204.7, y: 0} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1863190595 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3311,6 +3372,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -3429,9 +3491,10 @@ Transform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1969944222} - m_LocalRotation: {x: .493134707, y: .143018648, z: -.0825718939, w: .85413456} - m_LocalPosition: {x: -101.980003, y: 10.0500002, z: -4.73999977} + m_LocalRotation: {x: 0.4931347, y: 0.14301865, z: -0.082571894, w: 0.85413456} + m_LocalPosition: {x: -101.98, y: 10.05, z: -4.74} m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 655915741} m_RootOrder: 0 @@ -3449,9 +3512,9 @@ Camera: serializedVersion: 2 x: 0 y: 0 - width: .5 + width: 0.5 height: 1 - near clip plane: .300000012 + near clip plane: 0.3 far clip plane: 1000 field of view: 60 orthographic: 0 @@ -3467,7 +3530,7 @@ Camera: m_HDR: 0 m_OcclusionCulling: 1 m_StereoConvergence: 10 - m_StereoSeparation: .0219999999 + m_StereoSeparation: 0.022 m_StereoMirrorMode: 0 --- !u!114 &1969944225 MonoBehaviour: @@ -3481,13 +3544,15 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Name: Left 3D Camera - lookFor3DObjects: 1 - lookFor2DObjects: 0 - lookForWorldSpaceUI: 0 - lookForScreenSpaceUI: 0 + advancedProps: 0 + hit3DObjects: 1 + hit2DObjects: 0 + hitWorldSpaceUI: 0 + hitScreenSpaceUI: 1 layerMask: serializedVersion: 2 m_Bits: 4294967295 + useHitFilters: 0 --- !u!4 &2014918824 stripped Transform: m_PrefabParentObject: {fileID: 491238, guid: bb0a05fd2c374477cba1d93212b4600c, type: 2} @@ -3519,6 +3584,7 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: -100, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: - {fileID: 1164346782} m_Father: {fileID: 655915741} @@ -3563,15 +3629,15 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 1 - minScreenPointsDistance: .5 - screenTransformThreshold: .100000001 + minScreenPointsDistance: 0.5 + screenTransformThreshold: 0.1 projection: 0 projectionPlaneNormal: {x: 0, y: 0, z: 1} --- !u!1001 &2057195942 @@ -3640,6 +3706,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: - {fileID: 501236165} - {fileID: 1060318961} diff --git a/Source/Assets/TouchScript/Examples/Photos/Photos.unity b/Source/Assets/TouchScript/Examples/Photos/Photos.unity index c2a6ccc48..717f9f6a1 100644 --- a/Source/Assets/TouchScript/Examples/Photos/Photos.unity +++ b/Source/Assets/TouchScript/Examples/Photos/Photos.unity @@ -198,10 +198,11 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Name: Main Camera - lookFor3DObjects: 0 - lookFor2DObjects: 0 - lookForWorldSpaceUI: 1 - lookForScreenSpaceUI: 1 + advancedProps: 0 + hit3DObjects: 1 + hit2DObjects: 0 + hitWorldSpaceUI: 0 + hitScreenSpaceUI: 1 layerMask: serializedVersion: 2 m_Bits: 4294967295 @@ -1866,6 +1867,10 @@ Prefab: 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 diff --git a/Source/Assets/TouchScript/Examples/Portal/Portal.unity b/Source/Assets/TouchScript/Examples/Portal/Portal.unity index 381f66850..61074540e 100644 --- a/Source/Assets/TouchScript/Examples/Portal/Portal.unity +++ b/Source/Assets/TouchScript/Examples/Portal/Portal.unity @@ -131,10 +131,11 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Name: Camera - lookFor3DObjects: 1 - lookFor2DObjects: 0 - lookForWorldSpaceUI: 0 - lookForScreenSpaceUI: 0 + advancedProps: 0 + hit3DObjects: 1 + hit2DObjects: 0 + hitWorldSpaceUI: 0 + hitScreenSpaceUI: 1 layerMask: serializedVersion: 2 m_Bits: 4294967295 @@ -513,6 +514,10 @@ Prefab: - 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} diff --git a/Source/Assets/TouchScript/Examples/RawInput/RawInput.unity b/Source/Assets/TouchScript/Examples/RawInput/RawInput.unity index a50544e26..c5762e6b3 100644 --- a/Source/Assets/TouchScript/Examples/RawInput/RawInput.unity +++ b/Source/Assets/TouchScript/Examples/RawInput/RawInput.unity @@ -8,25 +8,25 @@ SceneSettings: m_PVSPortalsArray: [] m_OcclusionBakeSettings: smallestOccluder: 5 - smallestHole: .25 + smallestHole: 0.25 backfaceThreshold: 100 --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 serializedVersion: 6 m_Fog: 0 - m_FogColor: {r: .5, g: .5, b: .5, a: 1} + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 - m_FogDensity: .00999999978 + m_FogDensity: 0.01 m_LinearFogStart: 0 m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: .200000003, g: .200000003, b: .200000003, a: 1} - m_AmbientEquatorColor: {r: .200000003, g: .200000003, b: .200000003, a: 1} - m_AmbientGroundColor: {r: .200000003, g: .200000003, b: .200000003, a: 1} + 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_SkyboxMaterial: {fileID: 2100000, guid: a07fadb24ea940240afba3afc1a692cc, type: 2} - m_HaloStrength: .5 + m_HaloStrength: 0.5 m_FlareStrength: 1 m_FlareFadeSpeed: 3 m_HaloTexture: {fileID: 0} @@ -40,7 +40,7 @@ RenderSettings: --- !u!157 &4 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 5 + serializedVersion: 6 m_GIWorkflowMode: 1 m_LightmapsMode: 1 m_GISettings: @@ -66,7 +66,7 @@ LightmapSettings: m_FinalGather: 0 m_FinalGatherRayCount: 1024 m_ReflectionCompression: 2 - m_LightmapSnapshot: {fileID: 0} + m_LightingDataAsset: {fileID: 0} m_RuntimeCPUUsage: 25 --- !u!196 &5 NavMeshSettings: @@ -74,15 +74,15 @@ NavMeshSettings: m_ObjectHideFlags: 0 m_BuildSettings: serializedVersion: 2 - agentRadius: .5 + agentRadius: 0.5 agentHeight: 2 agentSlope: 45 - agentClimb: .400000006 + agentClimb: 0.4 ledgeDropHeight: 0 maxJumpAcrossDistance: 0 accuratePlacement: 0 minRegionArea: 2 - cellSize: .166666657 + cellSize: 0.16666666 manualCellSize: 0 m_NavMeshData: {fileID: 0} --- !u!1 &62216951 @@ -112,9 +112,10 @@ Transform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 62216951} - m_LocalRotation: {x: .978753865, y: 0, z: 0, w: .205038756} + 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: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 930800601} m_RootOrder: 1 @@ -167,7 +168,7 @@ Camera: y: 0 width: 1 height: 1 - near clip plane: .300000012 + near clip plane: 0.3 far clip plane: 1000 field of view: 30 orthographic: 0 @@ -183,7 +184,7 @@ Camera: m_HDR: 0 m_OcclusionCulling: 1 m_StereoConvergence: 10 - m_StereoSeparation: .0219999999 + m_StereoSeparation: 0.022 m_StereoMirrorMode: 0 --- !u!114 &62216958 MonoBehaviour: @@ -197,13 +198,15 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Name: Camera - lookFor3DObjects: 0 - lookFor2DObjects: 0 - lookForWorldSpaceUI: 0 - lookForScreenSpaceUI: 0 + advancedProps: 0 + hit3DObjects: 1 + hit2DObjects: 0 + hitWorldSpaceUI: 0 + hitScreenSpaceUI: 1 layerMask: serializedVersion: 2 m_Bits: 4294967295 + useHitFilters: 0 --- !u!1 &250857269 GameObject: m_ObjectHideFlags: 0 @@ -249,6 +252,7 @@ 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} @@ -257,7 +261,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1001 &543251036 Prefab: m_ObjectHideFlags: 0 @@ -300,6 +304,10 @@ Prefab: - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: layers.Array.data[0] value: + objectReference: {fileID: 62216958} + - 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} @@ -354,6 +362,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: - {fileID: 1981142013} - {fileID: 1552723601} @@ -400,8 +409,10 @@ Canvas: m_ReceivesEvents: 1 m_OverrideSorting: 0 m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 m_SortingLayerID: 0 m_SortingOrder: 0 + m_TargetDisplay: 0 --- !u!1 &930800600 GameObject: m_ObjectHideFlags: 0 @@ -426,6 +437,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: - {fileID: 2135305920} - {fileID: 62216952} @@ -457,6 +469,7 @@ 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 @@ -464,7 +477,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} m_SizeDelta: {x: 60, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1138005901 MonoBehaviour: m_ObjectHideFlags: 0 @@ -525,14 +538,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} - m_SizeDelta: {x: 204.699997, y: 0} - m_Pivot: {x: .5, y: .5} + m_SizeDelta: {x: 204.7, y: 0} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1408280582 MonoBehaviour: m_ObjectHideFlags: 0 @@ -560,6 +574,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -612,14 +627,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 178, y: 48.2000008} - m_SizeDelta: {x: 320, y: 68.4000015} - m_Pivot: {x: .5, y: .5} + m_AnchoredPosition: {x: 178, y: 48.2} + m_SizeDelta: {x: 320, y: 68.4} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1552723602 MonoBehaviour: m_ObjectHideFlags: 0 @@ -647,6 +663,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 0 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -701,6 +718,7 @@ 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} @@ -710,7 +728,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1679844151 MonoBehaviour: m_ObjectHideFlags: 0 @@ -768,6 +786,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: 4 @@ -817,15 +836,16 @@ 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_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: .252637833, y: 1} + m_AnchorMax: {x: 0.25263783, y: 1} m_AnchoredPosition: {x: 5, y: 50} m_SizeDelta: {x: -10, y: -120} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &2135305919 GameObject: m_ObjectHideFlags: 0 @@ -848,9 +868,10 @@ Transform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 2135305919} - m_LocalRotation: {x: .32484895, y: -.867448151, z: .0434053168, w: .374329984} - m_LocalPosition: {x: 6.10041475, y: 15.5403843, z: -20.5662251} + 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 @@ -864,16 +885,17 @@ Light: serializedVersion: 6 m_Type: 1 m_Color: {r: 1, g: 1, b: 1, a: 1} - m_Intensity: 1.29999995 + m_Intensity: 1.3 m_Range: 10 m_SpotAngle: 30 m_CookieSize: 10 m_Shadows: m_Type: 2 m_Resolution: 3 - m_Strength: .560000002 - m_Bias: .100000001 - m_NormalBias: .400000006 + 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} diff --git a/Source/Assets/TouchScript/Examples/Taps/Taps.unity b/Source/Assets/TouchScript/Examples/Taps/Taps.unity index 70a0d3acc..36850bd1e 100644 --- a/Source/Assets/TouchScript/Examples/Taps/Taps.unity +++ b/Source/Assets/TouchScript/Examples/Taps/Taps.unity @@ -8,25 +8,25 @@ SceneSettings: m_PVSPortalsArray: [] m_OcclusionBakeSettings: smallestOccluder: 5 - smallestHole: .25 + smallestHole: 0.25 backfaceThreshold: 100 --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 serializedVersion: 6 m_Fog: 0 - m_FogColor: {r: .5, g: .5, b: .5, a: 1} + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 - m_FogDensity: .00999999978 + m_FogDensity: 0.01 m_LinearFogStart: 0 m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: .200000003, g: .200000003, b: .200000003, a: 1} - m_AmbientEquatorColor: {r: .200000003, g: .200000003, b: .200000003, a: 1} - m_AmbientGroundColor: {r: .200000003, g: .200000003, b: .200000003, a: 1} + 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_SkyboxMaterial: {fileID: 2100000, guid: a07fadb24ea940240afba3afc1a692cc, type: 2} - m_HaloStrength: .5 + m_HaloStrength: 0.5 m_FlareStrength: 1 m_FlareFadeSpeed: 3 m_HaloTexture: {fileID: 0} @@ -40,7 +40,7 @@ RenderSettings: --- !u!157 &4 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 5 + serializedVersion: 6 m_GIWorkflowMode: 1 m_LightmapsMode: 1 m_GISettings: @@ -66,7 +66,7 @@ LightmapSettings: m_FinalGather: 0 m_FinalGatherRayCount: 1024 m_ReflectionCompression: 2 - m_LightmapSnapshot: {fileID: 0} + m_LightingDataAsset: {fileID: 0} m_RuntimeCPUUsage: 25 --- !u!196 &5 NavMeshSettings: @@ -74,15 +74,15 @@ NavMeshSettings: m_ObjectHideFlags: 0 m_BuildSettings: serializedVersion: 2 - agentRadius: .5 + agentRadius: 0.5 agentHeight: 2 agentSlope: 45 - agentClimb: .400000006 + agentClimb: 0.4 ledgeDropHeight: 0 maxJumpAcrossDistance: 0 accuratePlacement: 0 minRegionArea: 2 - cellSize: .166666657 + cellSize: 0.16666666 manualCellSize: 0 m_NavMeshData: {fileID: 0} --- !u!1 &62216951 @@ -111,9 +111,10 @@ Transform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 62216951} - m_LocalRotation: {x: .269457936, y: 0, z: 0, w: .963012159} - m_LocalPosition: {x: -1.11000001, y: 10.1000004, z: -17.4500008} + 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 @@ -129,13 +130,15 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Name: Scene Camera - lookFor3DObjects: 1 - lookFor2DObjects: 0 - lookForWorldSpaceUI: 0 - lookForScreenSpaceUI: 0 + advancedProps: 0 + hit3DObjects: 1 + hit2DObjects: 0 + hitWorldSpaceUI: 0 + hitScreenSpaceUI: 1 layerMask: serializedVersion: 2 m_Bits: 4294967295 + useHitFilters: 0 --- !u!81 &62216954 AudioListener: m_ObjectHideFlags: 0 @@ -173,7 +176,7 @@ Camera: y: 0 width: 1 height: 1 - near clip plane: .300000012 + near clip plane: 0.3 far clip plane: 40 field of view: 30 orthographic: 0 @@ -189,7 +192,7 @@ Camera: m_HDR: 0 m_OcclusionCulling: 1 m_StereoConvergence: 10 - m_StereoSeparation: .0219999999 + m_StereoSeparation: 0.022 m_StereoMirrorMode: 0 --- !u!4 &110191049 stripped Transform: @@ -221,6 +224,7 @@ 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 @@ -228,7 +232,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} m_SizeDelta: {x: 60, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &242343087 MonoBehaviour: m_ObjectHideFlags: 0 @@ -307,6 +311,7 @@ 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} @@ -317,7 +322,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1001 &279059992 Prefab: m_ObjectHideFlags: 0 @@ -400,6 +405,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: - {fileID: 497908867} - {fileID: 769487672} @@ -460,6 +466,10 @@ Prefab: propertyPath: layers.Array.data[1] 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 @@ -486,7 +496,7 @@ MonoBehaviour: minPointers: 0 maxPointers: 0 combinePointers: 0 - combinePointersInterval: .300000012 + combinePointersInterval: 0.3 useSendMessage: 0 sendStateChangeMessages: 0 sendMessageTarget: {fileID: 0} @@ -611,6 +621,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: - {fileID: 1981142013} - {fileID: 1552723601} @@ -673,8 +684,10 @@ Canvas: m_ReceivesEvents: 1 m_OverrideSorting: 0 m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 m_SortingLayerID: 0 m_SortingOrder: 0 + m_TargetDisplay: 0 --- !u!4 &756017745 stripped Transform: m_PrefabParentObject: {fileID: 496116, guid: 3c294c033fb7140d09b0bd33830617bb, type: 2} @@ -826,6 +839,7 @@ 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} @@ -835,7 +849,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &930800600 GameObject: m_ObjectHideFlags: 0 @@ -860,6 +874,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: - {fileID: 2135305920} - {fileID: 62216952} @@ -893,6 +908,7 @@ 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 @@ -900,7 +916,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} m_SizeDelta: {x: 60, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1138005901 MonoBehaviour: m_ObjectHideFlags: 0 @@ -960,6 +976,7 @@ 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 @@ -967,7 +984,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 31, y: 0} m_SizeDelta: {x: 60, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1149683277 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1028,14 +1045,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} - m_SizeDelta: {x: 204.699997, y: 0} - m_Pivot: {x: .5, y: .5} + m_SizeDelta: {x: 204.7, y: 0} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1166494020 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1077,6 +1095,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -1191,14 +1210,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} - m_SizeDelta: {x: 204.699997, y: 0} - m_Pivot: {x: .5, y: .5} + m_SizeDelta: {x: 204.7, y: 0} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1399100005 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1226,6 +1246,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -1278,14 +1299,15 @@ 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_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 177.5, y: 0} - m_SizeDelta: {x: 204.699997, y: 0} - m_Pivot: {x: .5, y: .5} + m_SizeDelta: {x: 204.7, y: 0} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1408280582 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1313,6 +1335,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -1411,6 +1434,7 @@ 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 @@ -1418,7 +1442,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 178, y: 78} m_SizeDelta: {x: 320, y: 128} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1552723602 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1446,6 +1470,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 0 + m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 @@ -1555,6 +1580,7 @@ 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} @@ -1564,7 +1590,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1679844151 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1626,6 +1652,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: 4 @@ -1676,6 +1703,7 @@ 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} @@ -1685,7 +1713,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1962593005 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1728,15 +1756,16 @@ 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_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: .252637833, y: 1} + m_AnchorMax: {x: 0.25263783, y: 1} m_AnchoredPosition: {x: 5, y: 50} m_SizeDelta: {x: -10, y: -120} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &2135305919 GameObject: m_ObjectHideFlags: 0 @@ -1759,9 +1788,10 @@ Transform: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 2135305919} - m_LocalRotation: {x: .241942912, y: -.49854365, z: .221075788, w: .802523136} - m_LocalPosition: {x: 6.10041475, y: 15.5403843, z: -20.5662251} + 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 @@ -1775,16 +1805,17 @@ Light: serializedVersion: 6 m_Type: 1 m_Color: {r: 1, g: 1, b: 1, a: 1} - m_Intensity: 1.29999995 + m_Intensity: 1.3 m_Range: 10 m_SpotAngle: 30 m_CookieSize: 10 m_Shadows: m_Type: 2 m_Resolution: 3 - m_Strength: .560000002 - m_Bias: .100000001 - m_NormalBias: .400000006 + 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} From 61a2c6398fd9f8c71f462006d0519760f72d423a Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 30 Oct 2016 23:28:59 +0300 Subject: [PATCH 107/211] Deleted UI folder. --- Source/Assets/TouchScript/Scripts/Gestures/UI.meta | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 Source/Assets/TouchScript/Scripts/Gestures/UI.meta diff --git a/Source/Assets/TouchScript/Scripts/Gestures/UI.meta b/Source/Assets/TouchScript/Scripts/Gestures/UI.meta deleted file mode 100644 index a301f4b21..000000000 --- a/Source/Assets/TouchScript/Scripts/Gestures/UI.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: ddd34b98b8bbe42a597fffd736c87e30 -folderAsset: yes -timeCreated: 1447582128 -licenseType: Pro -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: From d184ec48a1d64af633586e5facbc9924f7f39859 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Mon, 31 Oct 2016 01:49:49 +0300 Subject: [PATCH 108/211] Refactored TransformGestures and Transformer - All TransformGestures implement ITransformGesture interface with (translation, rotation, scale and axis). - Added TransformMask. - Removed ITransformGesture.ApplyTransform. - Transformer now applies transformation itself. --- .../TouchScript/Examples/Camera/Camera.unity | 6 +- .../Examples/Checkers/Checkers.unity | 1 + .../Scripts/Behaviors/Transformer.cs | 7 +- .../Base/OnePointTrasformGestureBase.cs | 320 ++++++++++++ ...ta => OnePointTrasformGestureBase.cs.meta} | 0 .../Base/PinnedTransformGestureBase.cs | 414 ---------------- .../Gestures/Base/TransformGestureBase.cs | 440 +---------------- .../Base/TwoPointTransformGestureBase.cs | 464 ++++++++++++++++++ .../Base/TwoPointTransformGestureBase.cs.meta | 12 + .../ClusteredPinnedTransformGesture.cs | 2 +- .../Scripts/Gestures/ITransformGesture.cs | 28 +- .../Gestures/PinnedTransformGesture.cs | 188 ++----- .../Gestures/ScreenTransformGesture.cs | 17 +- .../Scripts/Gestures/TransformGesture.cs | 44 +- 14 files changed, 921 insertions(+), 1022 deletions(-) create mode 100644 Source/Assets/TouchScript/Scripts/Gestures/Base/OnePointTrasformGestureBase.cs rename Source/Assets/TouchScript/Scripts/Gestures/Base/{PinnedTransformGestureBase.cs.meta => OnePointTrasformGestureBase.cs.meta} (100%) delete mode 100644 Source/Assets/TouchScript/Scripts/Gestures/Base/PinnedTransformGestureBase.cs create mode 100644 Source/Assets/TouchScript/Scripts/Gestures/Base/TwoPointTransformGestureBase.cs create mode 100644 Source/Assets/TouchScript/Scripts/Gestures/Base/TwoPointTransformGestureBase.cs.meta diff --git a/Source/Assets/TouchScript/Examples/Camera/Camera.unity b/Source/Assets/TouchScript/Examples/Camera/Camera.unity index 63bb63e85..eb7817c35 100644 --- a/Source/Assets/TouchScript/Examples/Camera/Camera.unity +++ b/Source/Assets/TouchScript/Examples/Camera/Camera.unity @@ -745,6 +745,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 74ae431eff8434b0897d3f7f1cff4311, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 1 advancedProps: 0 minPointers: 1 maxPointers: 1 @@ -756,8 +757,8 @@ MonoBehaviour: requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 1 - minScreenPointsDistance: 0.5 screenTransformThreshold: 0.05 + minScreenPointsDistance: 0.5 --- !u!54 &930800603 Rigidbody: m_ObjectHideFlags: 0 @@ -814,6 +815,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 74ae431eff8434b0897d3f7f1cff4311, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 1 advancedProps: 0 minPointers: 2 maxPointers: 10 @@ -825,8 +827,8 @@ MonoBehaviour: requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 7 - minScreenPointsDistance: 0.5 screenTransformThreshold: 0.2 + minScreenPointsDistance: 0.5 --- !u!1 &1138005899 GameObject: m_ObjectHideFlags: 0 diff --git a/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity b/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity index 77ce58a3f..7ddeb9c51 100644 --- a/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity +++ b/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity @@ -2598,6 +2598,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 38e07bff8743d4ee38bf724a7a2b4cbb, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 1 advancedProps: 0 minPointers: 0 maxPointers: 0 diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs index 76f257d46..baac6de0b 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs @@ -60,7 +60,12 @@ private void OnDisable() private void transformHandler(object sender, EventArgs e) { var gesture = sender as ITransformGesture; - gesture.ApplyTransform(cachedTransform); + var mask = gesture.TransformMask; + + if ((mask & TransformGesture.TransformType.Scaling) != 0) cachedTransform.localScale *= gesture.DeltaScale; + if ((mask & TransformGesture.TransformType.Rotation) != 0) + cachedTransform.rotation = Quaternion.AngleAxis(gesture.DeltaRotation, gesture.RotationAxis) * cachedTransform.rotation; + if ((mask & TransformGesture.TransformType.Translation) != 0) cachedTransform.position += gesture.DeltaPosition; } #endregion diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Base/OnePointTrasformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/Base/OnePointTrasformGestureBase.cs new file mode 100644 index 000000000..afe5fb639 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Gestures/Base/OnePointTrasformGestureBase.cs @@ -0,0 +1,320 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using System.Collections.Generic; +using TouchScript.Layers; +using TouchScript.Pointers; +using TouchScript.Utils.Geom; +using UnityEngine; + +#if TOUCHSCRIPT_DEBUG +using System.Collections; +using TouchScript.Utils.DebugUtils; +#endif + +namespace TouchScript.Gestures.Base +{ + ///

+ /// Abstract base class for Pinned Transform Gestures. + /// + public abstract class OnePointTrasformGestureBase : TransformGestureBase + { + #region Constants + + #endregion + + #region Events + + #endregion + + #region Public properties + + /// + public override Vector2 ScreenPosition + { + get + { + if (NumPointers == 0) return TouchManager.INVALID_POSITION; + return activePointers[0].Position; + } + } + + /// + public override Vector2 PreviousScreenPosition + { + get + { + if (NumPointers == 0) return TouchManager.INVALID_POSITION; + return activePointers[0].PreviousPosition; + } + } + + #endregion + + #region Private variables + + /// + /// Translation buffer. + /// + protected Vector2 screenPixelTranslationBuffer; + + /// + /// Rotation buffer. + /// + protected float screenPixelRotationBuffer; + + /// + /// Angle buffer. + /// + protected float angleBuffer; + + /// + /// Screen space scaling buffer. + /// + protected float screenPixelScalingBuffer; + + /// + /// Scaling buffer. + /// + protected float scaleBuffer; + + #endregion + + #region Unity methods + +#if TOUCHSCRIPT_DEBUG + /// + protected override void Awake() + { + base.Awake(); + + debugID = DebugHelper.GetDebugId(this); + debugPointerSize = Vector2.one * TouchManager.Instance.DotsPerCentimeter * 1.1f; + } +#endif + + #endregion + + #region Gesture callbacks + + /// + protected override void pointersUpdated(IList pointers) + { + base.pointersUpdated(pointers); + + var projectionParams = activePointers[0].ProjectionParams; + var dR = deltaRotation = 0; + var dS = deltaScale = 1f; + +#if TOUCHSCRIPT_DEBUG + var worldCenter = cachedTransform.position; + var screenCenter = projectionParams.ProjectFrom(worldCenter); + var newScreenPos = getPointScreenPosition(); + drawDebug(screenCenter, newScreenPos); +#endif + + if (pointersNumState != PointersNumState.InRange) return; + + var rotationEnabled = (Type & TransformGesture.TransformType.Rotation) == TransformGesture.TransformType.Rotation; + var scalingEnabled = (Type & TransformGesture.TransformType.Scaling) == TransformGesture.TransformType.Scaling; + if (!rotationEnabled && !scalingEnabled) return; + if (!relevantPointers(pointers)) return; + +#if !TOUCHSCRIPT_DEBUG + var thePointer = activePointers[0]; + var worldCenter = cachedTransform.position; + var screenCenter = projectionParams.ProjectFrom(worldCenter); + var newScreenPos = thePointer.Position; +#endif + + // Here we can't reuse last frame screen positions because points 0 and 1 can change. + // For example if the first of 3 fingers is lifted off. + var oldScreenPos = getPointPreviousScreenPosition(); + + if (rotationEnabled) + { + if (isTransforming) + { + dR = doRotation(worldCenter, oldScreenPos, newScreenPos, projectionParams); + } + else + { + // Find how much we moved perpendicular to the line (center, oldScreenPos) + screenPixelRotationBuffer += TwoD.PointToLineDistance(screenCenter, oldScreenPos, newScreenPos); + angleBuffer += doRotation(worldCenter, oldScreenPos, newScreenPos, projectionParams); + + if (screenPixelRotationBuffer * screenPixelRotationBuffer >= + screenTransformPixelThresholdSquared) + { + isTransforming = true; + dR = angleBuffer; + } + } + } + + if (scalingEnabled) + { + if (isTransforming) + { + dS *= doScaling(worldCenter, oldScreenPos, newScreenPos, projectionParams); + } + else + { + screenPixelScalingBuffer += (newScreenPos - screenCenter).magnitude - + (oldScreenPos - screenCenter).magnitude; + scaleBuffer *= doScaling(worldCenter, oldScreenPos, newScreenPos, projectionParams); + + if (screenPixelScalingBuffer * screenPixelScalingBuffer >= + screenTransformPixelThresholdSquared) + { + isTransforming = true; + dS = scaleBuffer; + } + } + } + + if (dR != 0) transformMask |= TransformGesture.TransformType.Rotation; + if (dS != 1) transformMask |= TransformGesture.TransformType.Scaling; + + if (transformMask != 0) + { + if (State == GestureState.Possible) setState(GestureState.Began); + switch (State) + { + case GestureState.Began: + case GestureState.Changed: + deltaRotation = dR; + deltaScale = dS; + setState(GestureState.Changed); + break; + } + } + } + + /// + protected override void reset() + { + base.reset(); + + screenPixelTranslationBuffer = Vector2.zero; + screenPixelRotationBuffer = 0f; + angleBuffer = 0; + screenPixelScalingBuffer = 0f; + scaleBuffer = 1f; + +#if TOUCHSCRIPT_DEBUG + clearDebug(); +#endif + } + + #endregion + + #region Protected methods + + /// + /// Calculates rotation. + /// + /// Center screen position. + /// Pointer old screen position. + /// Pointer new screen position. + /// Layer projection parameters. + /// Angle in degrees. + protected virtual float doRotation(Vector3 center, Vector2 oldScreenPos, Vector2 newScreenPos, + ProjectionParams projectionParams) + { + return 0; + } + + /// + /// Calculates scaling. + /// + /// Center screen position. + /// Pointer old screen position. + /// Pointer new screen position. + /// Layer projection parameters. + /// Multiplicative delta scaling. + protected virtual float doScaling(Vector3 center, Vector2 oldScreenPos, Vector2 newScreenPos, + ProjectionParams projectionParams) + { + return 1; + } + + /// + /// Checks if there are pointers in the list which matter for the gesture. + /// + /// List of pointers + /// true if there are relevant pointers; false otherwise. + protected virtual bool relevantPointers(IList pointers) + { + // We care only about the first pointer + var count = pointers.Count; + for (var i = 0; i < count; i++) + { + if (pointers[i] == activePointers[0]) return true; + } + return false; + } + + /// + /// Returns screen position of a point with index 0. + /// + protected virtual Vector2 getPointScreenPosition() + { + return activePointers[0].Position; + } + + /// + /// Returns previous screen position of a point with index 0. + /// + protected virtual Vector2 getPointPreviousScreenPosition() + { + return activePointers[0].PreviousPosition; + } + + protected override void updateType() + { + type = type & ~TransformGesture.TransformType.Translation; + } + +#if TOUCHSCRIPT_DEBUG + protected virtual void clearDebug() + { + GLDebug.RemoveFigure(debugID); + GLDebug.RemoveFigure(debugID + 1); + GLDebug.RemoveFigure(debugID + 2); + + if (debugCoroutine != null) StopCoroutine(debugCoroutine); + debugCoroutine = null; + } + + protected void drawDebugDelayed(Vector2 point1, Vector2 point2) + { + if (debugCoroutine != null) StopCoroutine(debugCoroutine); + debugCoroutine = StartCoroutine(doDrawDebug(point1, point2)); + } + + protected virtual void drawDebug(Vector2 point1, Vector2 point2) + { + if (!DebugMode) return; + + var color = State == GestureState.Possible ? Color.red : Color.green; + GLDebug.DrawSquareScreenSpace(debugID + 1, point2, 0f, debugPointerSize, color, float.PositiveInfinity); + GLDebug.DrawLineScreenSpace(debugID + 2, point1, point2, color, float.PositiveInfinity); + } + + private IEnumerator doDrawDebug(Vector2 point1, Vector2 point2) + { + yield return new WaitForEndOfFrame(); + + drawDebug(point1, point2); + } +#endif + + #endregion + + #region Private functions + + #endregion + } +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Base/PinnedTransformGestureBase.cs.meta b/Source/Assets/TouchScript/Scripts/Gestures/Base/OnePointTrasformGestureBase.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/Gestures/Base/PinnedTransformGestureBase.cs.meta rename to Source/Assets/TouchScript/Scripts/Gestures/Base/OnePointTrasformGestureBase.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Base/PinnedTransformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/Base/PinnedTransformGestureBase.cs deleted file mode 100644 index 2f11364bd..000000000 --- a/Source/Assets/TouchScript/Scripts/Gestures/Base/PinnedTransformGestureBase.cs +++ /dev/null @@ -1,414 +0,0 @@ -/* - * @author Valentin Simonov / http://va.lent.in/ - */ - -using System; -using System.Collections.Generic; -using TouchScript.Utils; -using TouchScript.Pointers; -using UnityEngine; - -#if TOUCHSCRIPT_DEBUG -using System.Collections; -using TouchScript.Utils.DebugUtils; -#endif - -namespace TouchScript.Gestures.Base -{ - /// - /// Abstract base class for Pinned Transform Gestures. - /// - public abstract class PinnedTrasformGestureBase : Gesture - { - #region Constants - - /// - /// Types of transformation. - /// - [Flags] - public enum TransformType - { - /// - /// Rotation. - /// - Rotation = 0x2, - - /// - /// Scaling. - /// - Scaling = 0x4 - } - - /// - /// Message name when gesture starts - /// - public const string TRANSFORM_START_MESSAGE = "OnTransformStart"; - - /// - /// Message name when gesture updates - /// - public const string TRANSFORM_MESSAGE = "OnTransform"; - - /// - /// Message name when gesture ends - /// - public const string TRANSFORM_COMPLETE_MESSAGE = "OnTransformComplete"; - - #endregion - - #region Events - - /// - public event EventHandler TransformStarted - { - add { transformStartedInvoker += value; } - remove { transformStartedInvoker -= value; } - } - - /// - public event EventHandler Transformed - { - add { transformedInvoker += value; } - remove { transformedInvoker -= value; } - } - - /// - public event EventHandler TransformCompleted - { - add { transformCompletedInvoker += value; } - remove { transformCompletedInvoker -= value; } - } - - // Needed to overcome iOS AOT limitations - private EventHandler transformStartedInvoker, transformedInvoker, transformCompletedInvoker; - - #endregion - - #region Public properties - - /// - /// Gets or sets types of transformation this gesture supports. - /// - /// Type flags. - public TransformType Type - { - get { return type; } - set { type = value; } - } - - /// - /// Gets or sets minimum distance in cm for pointers to move for gesture to begin. - /// - /// Minimum value in cm user must move their fingers to start this gesture. - public float ScreenTransformThreshold - { - get { return screenTransformThreshold; } - set - { - screenTransformThreshold = value; - updateScreenTransformThreshold(); - } - } - - /// - /// Gets delta rotation between this frame and last frame in degrees. - /// - public float DeltaRotation - { - get { return deltaRotation; } - } - - /// - /// 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. - /// - public float DeltaScale - { - get { return deltaScale; } - } - - /// - public override Vector2 ScreenPosition - { - get - { - if (NumPointers == 0) return TouchManager.INVALID_POSITION; - return activePointers[0].Position; - } - } - - /// - public override Vector2 PreviousScreenPosition - { - get - { - if (NumPointers == 0) return TouchManager.INVALID_POSITION; - return activePointers[0].PreviousPosition; - } - } - - #endregion - - #region Private variables - - /// - /// in pixels. - /// - protected float screenTransformPixelThreshold; - - /// - /// in pixels squared. - /// - protected float screenTransformPixelThresholdSquared; - - /// - /// The cached collider. - /// - protected Collider cachedCollider; - - /// - /// Calculated delta rotation. - /// - protected float deltaRotation; - - /// - /// Calculated delta scale. - /// - protected float deltaScale; - - /// - /// Translation buffer. - /// - protected Vector2 screenPixelTranslationBuffer; - - /// - /// Rotation buffer. - /// - protected float screenPixelRotationBuffer; - - /// - /// Angle buffer. - /// - protected float angleBuffer; - - /// - /// Screen space scaling buffer. - /// - protected float screenPixelScalingBuffer; - - /// - /// Scaling buffer. - /// - protected float scaleBuffer; - - /// - /// Indicates whether transformation started; - /// - protected bool isTransforming = false; - - [SerializeField] - private TransformType type = TransformType.Scaling | TransformType.Rotation; - - [SerializeField] - private float screenTransformThreshold = 0.1f; - - #endregion - - #region Unity methods - -#if TOUCHSCRIPT_DEBUG - /// - protected override void Awake() - { - base.Awake(); - - debugID = DebugHelper.GetDebugId(this); - debugPointerSize = Vector2.one * TouchManager.Instance.DotsPerCentimeter * 1.1f; - } -#endif - - /// - protected override void OnEnable() - { - base.OnEnable(); - - cachedCollider = GetComponent(); - updateScreenTransformThreshold(); - } - - #endregion - - #region Gesture callbacks - - /// - protected override void pointersPressed(IList pointers) - { - base.pointersPressed(pointers); - - if (pointersNumState == PointersNumState.PassedMaxThreshold || - pointersNumState == PointersNumState.PassedMinMaxThreshold) - { - switch (State) - { - case GestureState.Began: - case GestureState.Changed: - setState(GestureState.Ended); - break; - } - } - } - - /// - protected override void pointersReleased(IList pointers) - { - base.pointersReleased(pointers); - - if (pointersNumState == PointersNumState.PassedMinThreshold) - { - switch (State) - { - case GestureState.Began: - case GestureState.Changed: - setState(GestureState.Ended); - break; - } - } - } - - /// - protected override void onBegan() - { - base.onBegan(); - if (transformStartedInvoker != null) transformStartedInvoker.InvokeHandleExceptions(this, EventArgs.Empty); - if (UseSendMessage && SendMessageTarget != null) - { - SendMessageTarget.SendMessage(TRANSFORM_START_MESSAGE, this, SendMessageOptions.DontRequireReceiver); - } - } - - /// - protected override void onChanged() - { - base.onChanged(); - if (transformedInvoker != null) transformedInvoker.InvokeHandleExceptions(this, EventArgs.Empty); - if (UseSendMessage && SendMessageTarget != null) - SendMessageTarget.SendMessage(TRANSFORM_MESSAGE, this, SendMessageOptions.DontRequireReceiver); - } - - /// - protected override void onRecognized() - { - base.onRecognized(); - - if (transformCompletedInvoker != null) - transformCompletedInvoker.InvokeHandleExceptions(this, EventArgs.Empty); - if (UseSendMessage && SendMessageTarget != null) - SendMessageTarget.SendMessage(TRANSFORM_COMPLETE_MESSAGE, this, SendMessageOptions.DontRequireReceiver); - } - - /// - protected override void reset() - { - base.reset(); - - deltaRotation = 0f; - deltaScale = 1f; - - screenPixelTranslationBuffer = Vector2.zero; - screenPixelRotationBuffer = 0f; - angleBuffer = 0; - screenPixelScalingBuffer = 0f; - scaleBuffer = 1f; - - isTransforming = false; - -#if TOUCHSCRIPT_DEBUG - clearDebug(); -#endif - } - - #endregion - - #region Protected methods - - /// - /// Checks if there are pointers in the list which matter for the gesture. - /// - /// List of pointers - /// true if there are relevant pointers; false otherwise. - protected virtual bool relevantPointers(IList pointers) - { - // We care only about the first pointer - var count = pointers.Count; - for (var i = 0; i < count; i++) - { - if (pointers[i] == activePointers[0]) return true; - } - return false; - } - - /// - /// Returns screen position of a point with index 0. - /// - protected virtual Vector2 getPointScreenPosition() - { - return activePointers[0].Position; - } - - /// - /// Returns previous screen position of a point with index 0. - /// - protected virtual Vector2 getPointPreviousScreenPosition() - { - return activePointers[0].PreviousPosition; - } - -#if TOUCHSCRIPT_DEBUG - protected int debugID; - protected Coroutine debugCoroutine; - protected Vector2 debugPointerSize; - - protected virtual void clearDebug() - { - GLDebug.RemoveFigure(debugID); - GLDebug.RemoveFigure(debugID + 1); - GLDebug.RemoveFigure(debugID + 2); - - if (debugCoroutine != null) StopCoroutine(debugCoroutine); - debugCoroutine = null; - } - - protected void drawDebugDelayed(Vector2 point1, Vector2 point2) - { - if (debugCoroutine != null) StopCoroutine(debugCoroutine); - debugCoroutine = StartCoroutine(doDrawDebug(point1, point2)); - } - - protected virtual void drawDebug(Vector2 point1, Vector2 point2) - { - var color = State == GestureState.Possible ? Color.red : Color.green; - GLDebug.DrawSquareScreenSpace(debugID + 1, point2, 0f, debugPointerSize, color, float.PositiveInfinity); - GLDebug.DrawLineScreenSpace(debugID + 2, point1, point2, color, float.PositiveInfinity); - } - - private IEnumerator doDrawDebug(Vector2 point1, Vector2 point2) - { - yield return new WaitForEndOfFrame(); - - drawDebug(point1, point2); - } -#endif - - #endregion - - #region Private functions - - private void updateScreenTransformThreshold() - { - screenTransformPixelThreshold = screenTransformThreshold * touchManager.DotsPerCentimeter; - screenTransformPixelThresholdSquared = screenTransformPixelThreshold * screenTransformPixelThreshold; - } - - #endregion - } -} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs index f432dd7bd..2d5506eb7 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs @@ -4,9 +4,7 @@ using System; using System.Collections.Generic; -using TouchScript.Layers; using TouchScript.Utils; -using TouchScript.Utils.Geom; using TouchScript.Pointers; using UnityEngine; @@ -20,32 +18,10 @@ namespace TouchScript.Gestures.Base /// /// Abstract base class for Transform Gestures. /// - public abstract class TransformGestureBase : Gesture + public abstract class TransformGestureBase : Gesture, ITransformGesture { #region Constants - /// - /// Types of transformation. - /// - [Flags] - public enum TransformType - { - /// - /// Translation. - /// - Translation = 0x1, - - /// - /// Rotation. - /// - Rotation = 0x2, - - /// - /// Scaling. - /// - Scaling = 0x4 - } - /// /// Message name when gesture starts /// @@ -97,23 +73,13 @@ public event EventHandler TransformCompleted /// Gets or sets types of transformation this gesture supports. ///
/// Type flags. - public TransformType Type + public TransformGesture.TransformType Type { get { return type; } - set { type = value; } - } - - /// - /// Gets or sets minimum distance between 2 points in cm for gesture to begin. - /// - /// Minimum distance. - public virtual float MinScreenPointsDistance - { - get { return minScreenPointsDistance; } set { - minScreenPointsDistance = value; - updateMinScreenPointsDistance(); + type = value; + updateType(); } } @@ -131,67 +97,40 @@ public float ScreenTransformThreshold } } - /// - /// Gets delta position between this frame and the last frame in world coordinates. - /// + /// + public TransformGesture.TransformType TransformMask + { + get { return transformMask; } + } + + /// public Vector3 DeltaPosition { get { return deltaPosition; } } - /// - /// Gets delta rotation between this frame and last frame in degrees. - /// + /// public float DeltaRotation { get { return deltaRotation; } } - /// - /// 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. - /// + /// public float DeltaScale { get { return deltaScale; } } /// - 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 + public Vector3 RotationAxis { - get - { - if (NumPointers == 0) return TouchManager.INVALID_POSITION; - if (NumPointers == 1) return activePointers[0].PreviousPosition; - return (getPointPreviousScreenPosition(0) + getPointPreviousScreenPosition(1)) * .5f; - } + get { return rotationAxis; } } #endregion #region Private variables - /// - /// in pixels for internal use. - /// - protected float minScreenPointsPixelDistance; - - /// - /// squared in pixels for internal use. - /// - protected float minScreenPointsPixelDistanceSquared; - /// /// in pixels. /// @@ -202,6 +141,8 @@ public override Vector2 PreviousScreenPosition ///
protected float screenTransformPixelThresholdSquared; + protected TransformGesture.TransformType transformMask; + /// /// Calculated delta position. /// @@ -218,29 +159,9 @@ public override Vector2 PreviousScreenPosition protected float deltaScale; /// - /// Translation buffer. - /// - protected Vector2 screenPixelTranslationBuffer; - - /// - /// Rotation buffer. - /// - protected float screenPixelRotationBuffer; - - /// - /// Angle buffer. - /// - protected float angleBuffer; - - /// - /// Screen space scaling buffer. - /// - protected float screenPixelScalingBuffer; - - /// - /// Scaling buffer. + /// Rotation axis to use with deltaRotation. /// - protected float scaleBuffer; + protected Vector3 rotationAxis = new Vector3(0, 0, 1); /// /// Indicates whether transformation started; @@ -248,11 +169,8 @@ public override Vector2 PreviousScreenPosition protected bool isTransforming = false; [SerializeField] - private TransformType type = TransformType.Translation | TransformType.Scaling | - TransformType.Rotation; - - [SerializeField] - private float minScreenPointsDistance = 0.5f; + protected TransformGesture.TransformType type = TransformGesture.TransformType.Translation | TransformGesture.TransformType.Scaling | + TransformGesture.TransformType.Rotation; [SerializeField] private float screenTransformThreshold = 0.1f; @@ -262,7 +180,7 @@ public override Vector2 PreviousScreenPosition #region Unity methods #if TOUCHSCRIPT_DEBUG - /// + /// protected override void Awake() { base.Awake(); @@ -276,9 +194,8 @@ protected override void Awake() protected override void OnEnable() { base.OnEnable(); - - updateMinScreenPointsDistance(); updateScreenTransformThreshold(); + updateType(); } #endregion @@ -301,131 +218,6 @@ protected override void pointersPressed(IList pointers) break; } } -#if TOUCHSCRIPT_DEBUG - else drawDebugDelayed(getNumPoints()); -#endif - } - - /// - protected override void pointersUpdated(IList pointers) - { - base.pointersUpdated(pointers); - - var projectionParams = activePointers[0].ProjectionParams; - var dP = deltaPosition = Vector3.zero; - var dR = deltaRotation = 0; - var dS = deltaScale = 1f; - -#if TOUCHSCRIPT_DEBUG - drawDebugDelayed(getNumPoints()); -#endif - - if (pointersNumState != PointersNumState.InRange) return; - - var translationEnabled = (Type & TransformType.Translation) == TransformType.Translation; - var rotationEnabled = (Type & TransformType.Rotation) == TransformType.Rotation; - var scalingEnabled = (Type & TransformType.Scaling) == TransformType.Scaling; - - // one pointer or one cluster (points might be too close to each other for 2 clusters) - if (getNumPoints() == 1 || (!rotationEnabled && !scalingEnabled)) - { - if (!translationEnabled) return; // don't look for translates - if (!relevantPointers1(pointers)) return; - - // translate using one point - dP = doOnePointTranslation(getPointPreviousScreenPosition(0), getPointScreenPosition(0), projectionParams); - } - else - { - // Make sure that we actually care about the pointers moved. - if (!relevantPointers2(pointers)) return; - - var newScreenPos1 = getPointScreenPosition(0); - var newScreenPos2 = getPointScreenPosition(1); - - // Here we can't reuse last frame screen positions because points 0 and 1 can change. - // For example if the first of 3 fingers is lifted off. - var oldScreenPos1 = getPointPreviousScreenPosition(0); - var oldScreenPos2 = getPointPreviousScreenPosition(1); - - var newScreenDelta = newScreenPos2 - newScreenPos1; - if (newScreenDelta.sqrMagnitude > minScreenPointsPixelDistanceSquared) - { - if (rotationEnabled) - { - if (isTransforming) - { - dR = doRotation(oldScreenPos1, oldScreenPos2, newScreenPos1, newScreenPos2, projectionParams); - } - else - { - float d1, d2; - // Find how much we moved perpendicular to the line (oldScreenPos1, oldScreenPos2) - TwoD.PointToLineDistance2(oldScreenPos1, oldScreenPos2, newScreenPos1, newScreenPos2, - out d1, out d2); - screenPixelRotationBuffer += (d1 - d2); - angleBuffer += doRotation(oldScreenPos1, oldScreenPos2, newScreenPos1, newScreenPos2, projectionParams); - - if (screenPixelRotationBuffer * screenPixelRotationBuffer >= - screenTransformPixelThresholdSquared) - { - isTransforming = true; - dR = angleBuffer; - } - } - } - - if (scalingEnabled) - { - if (isTransforming) - { - dS *= doScaling(oldScreenPos1, oldScreenPos2, newScreenPos1, newScreenPos2, projectionParams); - } - else - { - var oldScreenDelta = oldScreenPos2 - oldScreenPos1; - var newDistance = newScreenDelta.magnitude; - var oldDistance = oldScreenDelta.magnitude; - screenPixelScalingBuffer += newDistance - oldDistance; - scaleBuffer *= doScaling(oldScreenPos1, oldScreenPos2, newScreenPos1, newScreenPos2, projectionParams); - - if (screenPixelScalingBuffer * screenPixelScalingBuffer >= - screenTransformPixelThresholdSquared) - { - isTransforming = true; - dS = scaleBuffer; - } - } - } - - if (translationEnabled) - { - if (dR == 0 && dS == 1) dP = doOnePointTranslation(oldScreenPos1, newScreenPos1, projectionParams); - else - dP = doTwoPointTranslation(oldScreenPos1, oldScreenPos2, newScreenPos1, newScreenPos2, dR, dS, projectionParams); - } - } - else if (translationEnabled) - { - // points are too close, translate using one point - dP = doOnePointTranslation(oldScreenPos1, newScreenPos1, projectionParams); - } - } - - if (dP != Vector3.zero || dR != 0 || dS != 1) - { - if (State == GestureState.Possible) setState(GestureState.Began); - switch (State) - { - case GestureState.Began: - case GestureState.Changed: - deltaPosition = dP; - deltaRotation = dR; - deltaScale = dS; - setState(GestureState.Changed); - break; - } - } } /// @@ -485,208 +277,26 @@ protected override void reset() deltaRotation = 0f; deltaScale = 1f; - screenPixelTranslationBuffer = Vector2.zero; - screenPixelRotationBuffer = 0f; - angleBuffer = 0; - screenPixelScalingBuffer = 0f; - scaleBuffer = 1f; - + transformMask = 0; isTransforming = false; - -#if TOUCHSCRIPT_DEBUG - clearDebug(); -#endif } #endregion #region Protected methods - /// - /// Calculates rotation. - /// - /// Finger one old screen position. - /// Finger two old screen position. - /// Finger one new screen position. - /// Finger two new screen position. - /// Layer projection parameters. - /// Angle in degrees. - protected virtual float doRotation(Vector2 oldScreenPos1, Vector2 oldScreenPos2, Vector2 newScreenPos1, - Vector2 newScreenPos2, ProjectionParams projectionParams) - { - return 0; - } - - /// - /// Calculates scaling. - /// - /// Finger one old screen position. - /// Finger two old screen position. - /// Finger one new screen position. - /// Finger two new screen position. - /// Layer projection parameters. - /// Multiplicative delta scaling. - protected virtual float doScaling(Vector2 oldScreenPos1, Vector2 oldScreenPos2, Vector2 newScreenPos1, - Vector2 newScreenPos2, ProjectionParams projectionParams) - { - return 1; - } - - /// - /// Calculates single finger translation. - /// - /// Finger old screen position. - /// Finger new screen position. - /// Layer projection parameters. - /// Delta translation vector. - protected virtual Vector3 doOnePointTranslation(Vector2 oldScreenPos, Vector2 newScreenPos, - ProjectionParams projectionParams) - { - return Vector3.zero; - } - - /// - /// Calculated two finger translation with respect to rotation and scaling. - /// - /// Finger one old screen position. - /// Finger two old screen position. - /// Finger one new screen position. - /// Finger two new screen position. - /// Calculated delta rotation. - /// Calculated delta scaling. - /// Layer projection parameters. - /// Delta translation vector. - protected virtual Vector3 doTwoPointTranslation(Vector2 oldScreenPos1, Vector2 oldScreenPos2, - Vector2 newScreenPos1, Vector2 newScreenPos2, float dR, float dS, ProjectionParams projectionParams) - { - return Vector3.zero; - } - - /// - /// Gets the number of points. - /// - /// Number of points. - protected virtual int getNumPoints() - { - return NumPointers; - } - - /// - /// Checks if there are pointers in the list which matter for the gesture. - /// - /// List of pointers. - /// true if there are relevant pointers; false otherwise. - protected virtual bool relevantPointers1(IList pointers) - { - // We care only about the first pointer - var count = pointers.Count; - for (var i = 0; i < count; i++) - { - if (pointers[i] == activePointers[0]) return true; - } - return false; - } - - /// - /// Checks if there are pointers in the list which matter for the gesture. - /// - /// List of pointers. - /// true if there are relevant pointers; false otherwise. - protected virtual bool relevantPointers2(IList pointers) - { - // We care only about the first and the second pointers - var count = pointers.Count; - for (var i = 0; i < count; i++) - { - var pointer = pointers[i]; - if (pointer == activePointers[0] || pointer == activePointers[1]) return true; - } - return false; - } - - /// - /// Returns screen position of a point with index 0 or 1 - /// - /// The index. - protected virtual Vector2 getPointScreenPosition(int index) - { - return activePointers[index].Position; - } - - /// - /// Returns previous screen position of a point with index 0 or 1 - /// - /// The index. - protected virtual Vector2 getPointPreviousScreenPosition(int index) - { - return activePointers[index].PreviousPosition; - } + protected virtual void updateType() {} #if TOUCHSCRIPT_DEBUG protected int debugID; protected Coroutine debugCoroutine; protected Vector2 debugPointerSize; - - protected virtual void clearDebug() - { - GLDebug.RemoveFigure(debugID); - GLDebug.RemoveFigure(debugID + 1); - GLDebug.RemoveFigure(debugID + 2); - - if (debugCoroutine != null) StopCoroutine(debugCoroutine); - debugCoroutine = null; - } - - protected void drawDebugDelayed(int touchPoints) - { - if (debugCoroutine != null) StopCoroutine(debugCoroutine); - debugCoroutine = StartCoroutine(doDrawDebug(touchPoints)); - } - - protected virtual void drawDebug(int touchPoints) - { - if (!DebugMode) return; - - var color = State == GestureState.Possible ? Color.red : Color.green; - switch (touchPoints) - { - case 1: - GLDebug.DrawSquareScreenSpace(debugID, getPointScreenPosition(0), 0f, debugPointerSize, color, - float.PositiveInfinity); - GLDebug.RemoveFigure(debugID + 1); - GLDebug.RemoveFigure(debugID + 2); - break; - default: - var newScreenPos1 = getPointScreenPosition(0); - var newScreenPos2 = getPointScreenPosition(1); - GLDebug.DrawSquareScreenSpace(debugID, newScreenPos1, 0f, debugPointerSize, color, - float.PositiveInfinity); - GLDebug.DrawSquareScreenSpace(debugID + 1, newScreenPos2, 0f, debugPointerSize, color, - float.PositiveInfinity); - GLDebug.DrawLineWithCrossScreenSpace(debugID + 2, newScreenPos1, newScreenPos2, .5f, - debugPointerSize * .3f, color, float.PositiveInfinity); - break; - } - } - - private IEnumerator doDrawDebug(int touchPoints) - { - yield return new WaitForEndOfFrame(); - - drawDebug(touchPoints); - } #endif #endregion #region Private functions - private void updateMinScreenPointsDistance() - { - minScreenPointsPixelDistance = minScreenPointsDistance * touchManager.DotsPerCentimeter; - minScreenPointsPixelDistanceSquared = minScreenPointsPixelDistance * minScreenPointsPixelDistance; - } - private void updateScreenTransformThreshold() { screenTransformPixelThreshold = screenTransformThreshold * touchManager.DotsPerCentimeter; diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Base/TwoPointTransformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/Base/TwoPointTransformGestureBase.cs new file mode 100644 index 000000000..d407311c2 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Gestures/Base/TwoPointTransformGestureBase.cs @@ -0,0 +1,464 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using System.Collections.Generic; +using TouchScript.Layers; +using TouchScript.Utils.Geom; +using TouchScript.Pointers; +using UnityEngine; + +#if TOUCHSCRIPT_DEBUG +using System.Collections; +using TouchScript.Utils.DebugUtils; +#endif + +namespace TouchScript.Gestures.Base +{ + public abstract class TwoPointTransformGestureBase : TransformGestureBase + { + #region Constants + + #endregion + + #region Events + + #endregion + + #region Public properties + + /// + /// Gets or sets minimum distance between 2 points in cm for gesture to begin. + /// + /// Minimum distance. + public virtual float MinScreenPointsDistance + { + get { return minScreenPointsDistance; } + set + { + minScreenPointsDistance = value; + updateMinScreenPointsDistance(); + } + } + + /// + 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 + + /// + /// in pixels for internal use. + /// + protected float minScreenPointsPixelDistance; + + /// + /// squared in pixels for internal use. + /// + protected float minScreenPointsPixelDistanceSquared; + + /// + /// Translation buffer. + /// + protected Vector2 screenPixelTranslationBuffer; + + /// + /// Rotation buffer. + /// + protected float screenPixelRotationBuffer; + + /// + /// Angle buffer. + /// + protected float angleBuffer; + + /// + /// Screen space scaling buffer. + /// + protected float screenPixelScalingBuffer; + + /// + /// Scaling buffer. + /// + protected float scaleBuffer; + + [SerializeField] + private float minScreenPointsDistance = 0.5f; + + #endregion + + #region Unity methods + + /// + protected override void OnEnable() + { + base.OnEnable(); + updateMinScreenPointsDistance(); + } + + #endregion + + #region Gesture callbacks + +#if TOUCHSCRIPT_DEBUG + /// + protected override void pointersPressed(IList pointers) + { + base.pointersPressed(pointers); + + if (!(pointersNumState == PointersNumState.PassedMaxThreshold || + pointersNumState == PointersNumState.PassedMinMaxThreshold)) + drawDebugDelayed(getNumPoints()); + } +#endif + + /// + protected override void pointersUpdated(IList pointers) + { + base.pointersUpdated(pointers); + + var projectionParams = activePointers[0].ProjectionParams; + var dP = deltaPosition = Vector3.zero; + var dR = deltaRotation = 0; + var dS = deltaScale = 1f; + +#if TOUCHSCRIPT_DEBUG + drawDebugDelayed(getNumPoints()); +#endif + + if (pointersNumState != PointersNumState.InRange) return; + + var translationEnabled = (Type & TransformGesture.TransformType.Translation) == TransformGesture.TransformType.Translation; + var rotationEnabled = (Type & TransformGesture.TransformType.Rotation) == TransformGesture.TransformType.Rotation; + var scalingEnabled = (Type & TransformGesture.TransformType.Scaling) == TransformGesture.TransformType.Scaling; + + // one pointer or one cluster (points might be too close to each other for 2 clusters) + if (getNumPoints() == 1 || (!rotationEnabled && !scalingEnabled)) + { + if (!translationEnabled) return; // don't look for translates + if (!relevantPointers1(pointers)) return; + + // translate using one point + dP = doOnePointTranslation(getPointPreviousScreenPosition(0), getPointScreenPosition(0), projectionParams); + } + else + { + // Make sure that we actually care about the pointers moved. + if (!relevantPointers2(pointers)) return; + + var newScreenPos1 = getPointScreenPosition(0); + var newScreenPos2 = getPointScreenPosition(1); + + // Here we can't reuse last frame screen positions because points 0 and 1 can change. + // For example if the first of 3 fingers is lifted off. + var oldScreenPos1 = getPointPreviousScreenPosition(0); + var oldScreenPos2 = getPointPreviousScreenPosition(1); + + var newScreenDelta = newScreenPos2 - newScreenPos1; + if (newScreenDelta.sqrMagnitude > minScreenPointsPixelDistanceSquared) + { + if (rotationEnabled) + { + if (isTransforming) + { + dR = doRotation(oldScreenPos1, oldScreenPos2, newScreenPos1, newScreenPos2, projectionParams); + } + else + { + float d1, d2; + // Find how much we moved perpendicular to the line (oldScreenPos1, oldScreenPos2) + TwoD.PointToLineDistance2(oldScreenPos1, oldScreenPos2, newScreenPos1, newScreenPos2, + out d1, out d2); + screenPixelRotationBuffer += (d1 - d2); + angleBuffer += doRotation(oldScreenPos1, oldScreenPos2, newScreenPos1, newScreenPos2, projectionParams); + + if (screenPixelRotationBuffer * screenPixelRotationBuffer >= + screenTransformPixelThresholdSquared) + { + isTransforming = true; + dR = angleBuffer; + } + } + } + + if (scalingEnabled) + { + if (isTransforming) + { + dS *= doScaling(oldScreenPos1, oldScreenPos2, newScreenPos1, newScreenPos2, projectionParams); + } + else + { + var oldScreenDelta = oldScreenPos2 - oldScreenPos1; + var newDistance = newScreenDelta.magnitude; + var oldDistance = oldScreenDelta.magnitude; + screenPixelScalingBuffer += newDistance - oldDistance; + scaleBuffer *= doScaling(oldScreenPos1, oldScreenPos2, newScreenPos1, newScreenPos2, projectionParams); + + if (screenPixelScalingBuffer * screenPixelScalingBuffer >= + screenTransformPixelThresholdSquared) + { + isTransforming = true; + dS = scaleBuffer; + } + } + } + + if (translationEnabled) + { + if (dR == 0 && dS == 1) dP = doOnePointTranslation(oldScreenPos1, newScreenPos1, projectionParams); + else + dP = doTwoPointTranslation(oldScreenPos1, oldScreenPos2, newScreenPos1, newScreenPos2, dR, dS, projectionParams); + } + } + else if (translationEnabled) + { + // points are too close, translate using one point + dP = doOnePointTranslation(oldScreenPos1, newScreenPos1, projectionParams); + } + } + + if (dP != Vector3.zero) transformMask |= TransformGesture.TransformType.Translation; + if (dR != 0) transformMask |= TransformGesture.TransformType.Rotation; + if (dS != 1) transformMask |= TransformGesture.TransformType.Scaling; + + if (transformMask != 0) + { + if (State == GestureState.Possible) setState(GestureState.Began); + switch (State) + { + case GestureState.Began: + case GestureState.Changed: + deltaPosition = dP; + deltaRotation = dR; + deltaScale = dS; + setState(GestureState.Changed); + break; + } + } + } + + /// + protected override void reset() + { + base.reset(); + + screenPixelTranslationBuffer = Vector2.zero; + screenPixelRotationBuffer = 0f; + angleBuffer = 0; + screenPixelScalingBuffer = 0f; + scaleBuffer = 1f; + +#if TOUCHSCRIPT_DEBUG + clearDebug(); +#endif + } + + #endregion + + #region Protected methods + + /// + /// Calculates rotation. + /// + /// Finger one old screen position. + /// Finger two old screen position. + /// Finger one new screen position. + /// Finger two new screen position. + /// Layer projection parameters. + /// Angle in degrees. + protected virtual float doRotation(Vector2 oldScreenPos1, Vector2 oldScreenPos2, Vector2 newScreenPos1, + Vector2 newScreenPos2, ProjectionParams projectionParams) + { + return 0; + } + + /// + /// Calculates scaling. + /// + /// Finger one old screen position. + /// Finger two old screen position. + /// Finger one new screen position. + /// Finger two new screen position. + /// Layer projection parameters. + /// Multiplicative delta scaling. + protected virtual float doScaling(Vector2 oldScreenPos1, Vector2 oldScreenPos2, Vector2 newScreenPos1, + Vector2 newScreenPos2, ProjectionParams projectionParams) + { + return 1; + } + + /// + /// Calculates single finger translation. + /// + /// Finger old screen position. + /// Finger new screen position. + /// Layer projection parameters. + /// Delta translation vector. + protected virtual Vector3 doOnePointTranslation(Vector2 oldScreenPos, Vector2 newScreenPos, + ProjectionParams projectionParams) + { + return Vector3.zero; + } + + /// + /// Calculated two finger translation with respect to rotation and scaling. + /// + /// Finger one old screen position. + /// Finger two old screen position. + /// Finger one new screen position. + /// Finger two new screen position. + /// Calculated delta rotation. + /// Calculated delta scaling. + /// Layer projection parameters. + /// Delta translation vector. + protected virtual Vector3 doTwoPointTranslation(Vector2 oldScreenPos1, Vector2 oldScreenPos2, + Vector2 newScreenPos1, Vector2 newScreenPos2, float dR, float dS, ProjectionParams projectionParams) + { + return Vector3.zero; + } + + /// + /// Gets the number of points. + /// + /// Number of points. + protected virtual int getNumPoints() + { + return NumPointers; + } + + /// + /// Checks if there are pointers in the list which matter for the gesture. + /// + /// List of pointers. + /// true if there are relevant pointers; false otherwise. + protected virtual bool relevantPointers1(IList pointers) + { + // We care only about the first pointer + var count = pointers.Count; + for (var i = 0; i < count; i++) + { + if (pointers[i] == activePointers[0]) return true; + } + return false; + } + + /// + /// Checks if there are pointers in the list which matter for the gesture. + /// + /// List of pointers. + /// true if there are relevant pointers; false otherwise. + protected virtual bool relevantPointers2(IList pointers) + { + // We care only about the first and the second pointers + var count = pointers.Count; + for (var i = 0; i < count; i++) + { + var pointer = pointers[i]; + if (pointer == activePointers[0] || pointer == activePointers[1]) return true; + } + return false; + } + + /// + /// Returns screen position of a point with index 0 or 1 + /// + /// The index. + protected virtual Vector2 getPointScreenPosition(int index) + { + return activePointers[index].Position; + } + + /// + /// Returns previous screen position of a point with index 0 or 1 + /// + /// The index. + protected virtual Vector2 getPointPreviousScreenPosition(int index) + { + return activePointers[index].PreviousPosition; + } + +#if TOUCHSCRIPT_DEBUG + protected virtual void clearDebug() + { + GLDebug.RemoveFigure(debugID); + GLDebug.RemoveFigure(debugID + 1); + GLDebug.RemoveFigure(debugID + 2); + + if (debugCoroutine != null) StopCoroutine(debugCoroutine); + debugCoroutine = null; + } + + protected void drawDebugDelayed(int touchPoints) + { + if (debugCoroutine != null) StopCoroutine(debugCoroutine); + debugCoroutine = StartCoroutine(doDrawDebug(touchPoints)); + } + + protected virtual void drawDebug(int touchPoints) + { + if (!DebugMode) return; + + var color = State == GestureState.Possible ? Color.red : Color.green; + switch (touchPoints) + { + case 1: + GLDebug.DrawSquareScreenSpace(debugID, getPointScreenPosition(0), 0f, debugPointerSize, color, + float.PositiveInfinity); + GLDebug.RemoveFigure(debugID + 1); + GLDebug.RemoveFigure(debugID + 2); + break; + default: + var newScreenPos1 = getPointScreenPosition(0); + var newScreenPos2 = getPointScreenPosition(1); + GLDebug.DrawSquareScreenSpace(debugID, newScreenPos1, 0f, debugPointerSize, color, + float.PositiveInfinity); + GLDebug.DrawSquareScreenSpace(debugID + 1, newScreenPos2, 0f, debugPointerSize, color, + float.PositiveInfinity); + GLDebug.DrawLineWithCrossScreenSpace(debugID + 2, newScreenPos1, newScreenPos2, .5f, + debugPointerSize * .3f, color, float.PositiveInfinity); + break; + } + } + + private IEnumerator doDrawDebug(int touchPoints) + { + yield return new WaitForEndOfFrame(); + + drawDebug(touchPoints); + } +#endif + + #endregion + + #region Private functions + + private void updateMinScreenPointsDistance() + { + minScreenPointsPixelDistance = minScreenPointsDistance * touchManager.DotsPerCentimeter; + minScreenPointsPixelDistanceSquared = minScreenPointsPixelDistance * minScreenPointsPixelDistance; + } + + #endregion + } +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Base/TwoPointTransformGestureBase.cs.meta b/Source/Assets/TouchScript/Scripts/Gestures/Base/TwoPointTransformGestureBase.cs.meta new file mode 100644 index 000000000..d70fd5673 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Gestures/Base/TwoPointTransformGestureBase.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f8c5d5231ca8e465ab5739f62d26e8fa +timeCreated: 1477866827 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredPinnedTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredPinnedTransformGesture.cs index 2479ed0f2..90e911204 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredPinnedTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredPinnedTransformGesture.cs @@ -10,7 +10,7 @@ namespace TouchScript.Gestures.Clustered { /// - /// ScreenTransformGesture which works with centroid of all pointers instead of with just the first one. + /// PinnedTransformGesture which works with centroid of all pointers instead of with just the first one. /// Should be used for large touch surfaces. /// [AddComponentMenu("TouchScript/Gestures/Clustered/Pinned Transform Gesture (Clustered)")] diff --git a/Source/Assets/TouchScript/Scripts/Gestures/ITransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/ITransformGesture.cs index 842bdde17..c06060ccd 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/ITransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/ITransformGesture.cs @@ -12,6 +12,7 @@ namespace TouchScript.Gestures /// public interface ITransformGesture { + /// /// Occurs when gesture starts. /// @@ -28,9 +29,30 @@ public interface ITransformGesture event EventHandler TransformCompleted; /// - /// Applies gesture's transform for this frame to target Transform. + /// Contains transform operations which happened this frame. + /// + 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 rotation axis of the gesture in world coordinates. /// - /// Object to transform. - void ApplyTransform(Transform target); + /// Rotation axis of the gesture in world coordinates. + Vector3 RotationAxis { get; } } } \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs index 8d47dd1e1..3d8d2dd99 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs @@ -19,31 +19,10 @@ namespace TouchScript.Gestures ///
[AddComponentMenu("TouchScript/Gestures/Pinned Transform Gesture")] [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Gestures_PinnedTransformGesture.htm")] - public class PinnedTransformGesture : PinnedTrasformGestureBase, ITransformGesture + public class PinnedTransformGesture : OnePointTrasformGestureBase { #region Constants - /// - /// Transform's projection type. - /// - public enum ProjectionType - { - /// - /// Use a plane with normal vector defined by layer. - /// - Layer, - - /// - /// Use a plane with certain normal vector in local coordinates. - /// - Object, - - /// - /// Use a plane with certain normal vector in global coordinates. - /// - Global - } - #endregion #region Public properties @@ -52,7 +31,7 @@ public enum ProjectionType /// Gets or sets transform's projection type. ///
/// Projection type. - public ProjectionType Projection + public TransformGesture.ProjectionType Projection { get { return projection; } set @@ -71,12 +50,12 @@ public Vector3 ProjectionPlaneNormal { get { - if (projection == ProjectionType.Layer) return projectionLayer.WorldProjectionNormal; + if (projection == TransformGesture.ProjectionType.Layer) return projectionLayer.WorldProjectionNormal; return projectionPlaneNormal; } set { - if (projection == ProjectionType.Layer) projection = ProjectionType.Object; + if (projection == TransformGesture.ProjectionType.Layer) projection = TransformGesture.ProjectionType.Object; value.Normalize(); if (projectionPlaneNormal == value) return; projectionPlaneNormal = value; @@ -92,21 +71,12 @@ public Plane TransformPlane get { return transformPlane; } } - /// - /// Gets rotation axis of the gesture in world coordinates. - /// - /// Rotation axis of the gesture in world coordinates. - public Vector3 RotationAxis - { - get { return transformPlane.normal; } - } - #endregion #region Private variables [SerializeField] - private ProjectionType projection = ProjectionType.Layer; + private TransformGesture.ProjectionType projection = TransformGesture.ProjectionType.Layer; [SerializeField] private Vector3 projectionPlaneNormal = Vector3.forward; @@ -118,14 +88,6 @@ public Vector3 RotationAxis #region Public methods - /// - public void ApplyTransform(Transform target) - { - if (!Mathf.Approximately(DeltaRotation, 0f)) - target.rotation = Quaternion.AngleAxis(DeltaRotation, RotationAxis) * target.rotation; - if (!Mathf.Approximately(DeltaScale, 1f)) target.localScale *= DeltaScale; - } - #endregion #region Unity methods @@ -166,97 +128,6 @@ protected override void pointersPressed(IList pointers) } } - /// - protected override void pointersUpdated(IList pointers) - { - base.pointersUpdated(pointers); - - var projectionParams = activePointers[0].ProjectionParams; - var dR = deltaRotation = 0; - var dS = deltaScale = 1f; - -#if TOUCHSCRIPT_DEBUG - var worldCenter = cachedTransform.position; - var screenCenter = projectionParams.ProjectFrom(worldCenter); - var newScreenPos = getPointScreenPosition(); - drawDebug(screenCenter, newScreenPos); -#endif - - if (pointersNumState != PointersNumState.InRange) return; - - var rotationEnabled = (Type & TransformType.Rotation) == TransformType.Rotation; - var scalingEnabled = (Type & TransformType.Scaling) == TransformType.Scaling; - if (!rotationEnabled && !scalingEnabled) return; - if (!relevantPointers(pointers)) return; - -#if !TOUCHSCRIPT_DEBUG - var thePointer = activePointers[0]; - var worldCenter = cachedTransform.position; - var screenCenter = projectionParams.ProjectFrom(worldCenter); - var newScreenPos = thePointer.Position; -#endif - - // Here we can't reuse last frame screen positions because points 0 and 1 can change. - // For example if the first of 3 fingers is lifted off. - var oldScreenPos = getPointPreviousScreenPosition(); - - if (rotationEnabled) - { - if (isTransforming) - { - dR = doRotation(worldCenter, oldScreenPos, newScreenPos, projectionParams); - } - else - { - // Find how much we moved perpendicular to the line (center, oldScreenPos) - screenPixelRotationBuffer += TwoD.PointToLineDistance(screenCenter, oldScreenPos, newScreenPos); - angleBuffer += doRotation(worldCenter, oldScreenPos, newScreenPos, projectionParams); - - if (screenPixelRotationBuffer * screenPixelRotationBuffer >= - screenTransformPixelThresholdSquared) - { - isTransforming = true; - dR = angleBuffer; - } - } - } - - if (scalingEnabled) - { - if (isTransforming) - { - dS *= doScaling(worldCenter, oldScreenPos, newScreenPos, projectionParams); - } - else - { - screenPixelScalingBuffer += (newScreenPos - screenCenter).magnitude - - (oldScreenPos - screenCenter).magnitude; - scaleBuffer *= doScaling(worldCenter, oldScreenPos, newScreenPos, projectionParams); - - if (screenPixelScalingBuffer * screenPixelScalingBuffer >= - screenTransformPixelThresholdSquared) - { - isTransforming = true; - dS = scaleBuffer; - } - } - } - - if (dR != 0 || dS != 1) - { - if (State == GestureState.Possible) setState(GestureState.Began); - switch (State) - { - case GestureState.Began: - case GestureState.Changed: - deltaRotation = dR; - deltaScale = dS; - setState(GestureState.Changed); - break; - } - } - } - #if TOUCHSCRIPT_DEBUG /// protected override void pointersReleased(IList pointers) @@ -272,6 +143,27 @@ protected override void pointersReleased(IList pointers) #region Protected methods + /// + protected override float doRotation(Vector3 center, Vector2 oldScreenPos, Vector2 newScreenPos, + ProjectionParams projectionParams) + { + var newVector = projectionParams.ProjectTo(newScreenPos, TransformPlane) - center; + var oldVector = projectionParams.ProjectTo(oldScreenPos, TransformPlane) - center; + var angle = Vector3.Angle(oldVector, newVector); + if (Vector3.Dot(Vector3.Cross(oldVector, newVector), TransformPlane.normal) < 0) + angle = -angle; + return angle; + } + + /// + protected override float doScaling(Vector3 center, Vector2 oldScreenPos, Vector2 newScreenPos, + ProjectionParams projectionParams) + { + var newVector = projectionParams.ProjectTo(newScreenPos, TransformPlane) - center; + var oldVector = projectionParams.ProjectTo(oldScreenPos, TransformPlane) - center; + return newVector.magnitude / oldVector.magnitude; + } + #if TOUCHSCRIPT_DEBUG protected override void clearDebug() { @@ -284,6 +176,7 @@ protected override void drawDebug(Vector2 point1, Vector2 point2) { base.drawDebug(point1, point2); + if (!DebugMode) return; GLDebug.DrawPlaneWithNormal(debugID + 3, cachedTransform.position, RotationAxis, 1f, GLDebug.MULTIPLY, float.PositiveInfinity); } #endif @@ -292,45 +185,28 @@ protected override void drawDebug(Vector2 point1, Vector2 point2) #region Private functions - private float doRotation(Vector3 center, Vector2 oldScreenPos, Vector2 newScreenPos, - ProjectionParams projectionParams) - { - var newVector = projectionParams.ProjectTo(newScreenPos, TransformPlane) - center; - var oldVector = projectionParams.ProjectTo(oldScreenPos, TransformPlane) - center; - var angle = Vector3.Angle(oldVector, newVector); - if (Vector3.Dot(Vector3.Cross(oldVector, newVector), TransformPlane.normal) < 0) - angle = -angle; - return angle; - } - - private float doScaling(Vector3 center, Vector2 oldScreenPos, Vector2 newScreenPos, - ProjectionParams projectionParams) - { - var newVector = projectionParams.ProjectTo(newScreenPos, TransformPlane) - center; - var oldVector = projectionParams.ProjectTo(oldScreenPos, TransformPlane) - center; - return newVector.magnitude / oldVector.magnitude; - } - private void updateProjectionPlane() { if (!Application.isPlaying) return; switch (projection) { - case ProjectionType.Layer: + case TransformGesture.ProjectionType.Layer: if (projectionLayer == null) transformPlane = new Plane(cachedTransform.TransformDirection(Vector3.forward), cachedTransform.position); else transformPlane = new Plane(projectionLayer.WorldProjectionNormal, cachedTransform.position); break; - case ProjectionType.Object: + case TransformGesture.ProjectionType.Object: transformPlane = new Plane(cachedTransform.TransformDirection(projectionPlaneNormal), cachedTransform.position); break; - case ProjectionType.Global: + case TransformGesture.ProjectionType.Global: transformPlane = new Plane(projectionPlaneNormal, cachedTransform.position); break; } + + rotationAxis = transformPlane.normal; } #endregion diff --git a/Source/Assets/TouchScript/Scripts/Gestures/ScreenTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/ScreenTransformGesture.cs index 43692d8a0..8fc9957df 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/ScreenTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/ScreenTransformGesture.cs @@ -2,12 +2,14 @@ * @author Valentin Simonov / http://va.lent.in/ */ -using System.Collections.Generic; using TouchScript.Gestures.Base; using TouchScript.Layers; -using TouchScript.Pointers; using TouchScript.Utils.Geom; using UnityEngine; +#if TOUCHSCRIPT_DEBUG +using System.Collections.Generic; +using TouchScript.Pointers; +#endif namespace TouchScript.Gestures { @@ -16,19 +18,10 @@ namespace TouchScript.Gestures ///
[AddComponentMenu("TouchScript/Gestures/Screen Transform Gesture")] [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Gestures_ScreenTransformGesture.htm")] - public class ScreenTransformGesture : TransformGestureBase, ITransformGesture + public class ScreenTransformGesture : TwoPointTransformGestureBase { #region Public methods - /// - public void ApplyTransform(Transform target) - { - if (DeltaPosition != Vector3.zero) target.position += DeltaPosition; - if (!Mathf.Approximately(DeltaRotation, 0f)) - target.rotation = Quaternion.Euler(0, 0, DeltaRotation) * target.rotation; - if (!Mathf.Approximately(DeltaScale, 1f)) target.localScale *= DeltaScale; - } - #endregion #region Gesture callbacks diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs index 5affef262..8d8c7452a 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs @@ -2,6 +2,7 @@ * @author Valentin Simonov / http://va.lent.in/ */ +using System; using System.Collections.Generic; using TouchScript.Gestures.Base; using TouchScript.Layers; @@ -19,10 +20,32 @@ namespace TouchScript.Gestures ///
[AddComponentMenu("TouchScript/Gestures/Transform Gesture")] [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Gestures_TransformGesture.htm")] - public class TransformGesture : TransformGestureBase, ITransformGesture + public class TransformGesture : TwoPointTransformGestureBase { #region Constants + /// + /// Types of transformation. + /// + [Flags] + public enum TransformType + { + /// + /// Translation. + /// + Translation = 0x1, + + /// + /// Rotation. + /// + Rotation = 0x2, + + /// + /// Scaling. + /// + Scaling = 0x4 + } + /// /// Transform's projection type. /// @@ -101,15 +124,6 @@ public Vector3 LocalDeltaPosition get { return TransformUtils.GlobalToLocalVector(cachedTransform, DeltaPosition); } } - /// - /// Gets rotation axis of the gesture in world coordinates. - /// - /// Rotation axis of the gesture in world coordinates. - public Vector3 RotationAxis - { - get { return transformPlane.normal; } - } - #endregion #region Private variables @@ -127,14 +141,6 @@ public Vector3 RotationAxis #region Public methods - /// - public void ApplyTransform(Transform target) - { - if (!Mathf.Approximately(DeltaScale, 1f)) target.localScale *= DeltaScale; - if (!Mathf.Approximately(DeltaRotation, 0f)) target.rotation = Quaternion.AngleAxis(DeltaRotation, RotationAxis) * target.rotation; - if (DeltaPosition != Vector3.zero) target.position += DeltaPosition; - } - #endregion #region Unity methods @@ -316,6 +322,8 @@ private void updateProjectionPlane() transformPlane = new Plane(projectionPlaneNormal, cachedTransform.position); break; } + + rotationAxis = transformPlane.normal; } #endregion From c1f1643bd113f93b815ca0216658e3a2f8d717bd Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Mon, 31 Oct 2016 01:54:51 +0300 Subject: [PATCH 109/211] Fixed wrong layer settings in Colors example. --- Source/Assets/TouchScript/Examples/Colors/Colors.unity | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/Assets/TouchScript/Examples/Colors/Colors.unity b/Source/Assets/TouchScript/Examples/Colors/Colors.unity index 4d7cd24cc..7c3e45486 100644 --- a/Source/Assets/TouchScript/Examples/Colors/Colors.unity +++ b/Source/Assets/TouchScript/Examples/Colors/Colors.unity @@ -131,10 +131,10 @@ MonoBehaviour: m_EditorClassIdentifier: Name: Camera advancedProps: 0 - hit3DObjects: 1 - hit2DObjects: 0 + hit3DObjects: 0 + hit2DObjects: 1 hitWorldSpaceUI: 0 - hitScreenSpaceUI: 1 + hitScreenSpaceUI: 0 layerMask: serializedVersion: 2 m_Bits: 4294967295 From b4e3ee2d47eef315737583152dc99fa62303dadd Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Mon, 31 Oct 2016 02:06:00 +0300 Subject: [PATCH 110/211] Updated layers on examples. --- .../Examples/Checkers/Checkers.unity | 2 +- .../TouchScript/Examples/Cube/Cube.unity | 8 +++-- .../TouchScript/Examples/Examples.unity | 9 ++--- .../Examples/Multiuser/Multiuser.unity | 25 ++++++++----- .../TouchScript/Examples/Photos/Photos.unity | 30 +++++++++++----- .../TouchScript/Examples/Portal/Portal.unity | 24 +++++++++---- .../Examples/RawInput/RawInput.unity | 36 ++++++------------- .../TouchScript/Examples/Taps/Taps.unity | 3 +- .../Layers/UI/TouchScriptInputModule.cs | 2 +- 9 files changed, 80 insertions(+), 59 deletions(-) diff --git a/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity b/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity index 7ddeb9c51..1e476ecba 100644 --- a/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity +++ b/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity @@ -188,7 +188,7 @@ MonoBehaviour: hit3DObjects: 1 hit2DObjects: 0 hitWorldSpaceUI: 0 - hitScreenSpaceUI: 1 + hitScreenSpaceUI: 0 layerMask: serializedVersion: 2 m_Bits: 4294967295 diff --git a/Source/Assets/TouchScript/Examples/Cube/Cube.unity b/Source/Assets/TouchScript/Examples/Cube/Cube.unity index 9591d906f..0e64d6a14 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Cube.unity +++ b/Source/Assets/TouchScript/Examples/Cube/Cube.unity @@ -114,7 +114,7 @@ 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: 0, y: 0, z: 0} + m_LocalEulerAnglesHint: {x: 23.6635, y: -180, z: -180} m_Children: [] m_Father: {fileID: 930800601} m_RootOrder: 1 @@ -134,7 +134,7 @@ MonoBehaviour: hit3DObjects: 1 hit2DObjects: 0 hitWorldSpaceUI: 0 - hitScreenSpaceUI: 1 + hitScreenSpaceUI: 0 layerMask: serializedVersion: 2 m_Bits: 4294967295 @@ -776,6 +776,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -787,8 +788,8 @@ MonoBehaviour: requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 7 - minScreenPointsDistance: 0.5 screenTransformThreshold: 0.1 + minScreenPointsDistance: 0.5 projection: 0 projectionPlaneNormal: {x: 0, y: 0, z: 1} --- !u!1 &1138005899 @@ -1306,6 +1307,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 3fd90a8856e1a49eba25728d5aaac9f2, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 diff --git a/Source/Assets/TouchScript/Examples/Examples.unity b/Source/Assets/TouchScript/Examples/Examples.unity index d2fb4ae69..9b15c83bb 100644 --- a/Source/Assets/TouchScript/Examples/Examples.unity +++ b/Source/Assets/TouchScript/Examples/Examples.unity @@ -4661,10 +4661,11 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Name: ScreenSpace UI Layer - lookFor3DObjects: 0 - lookFor2DObjects: 0 - lookForWorldSpaceUI: 0 - lookForScreenSpaceUI: 1 + advancedProps: 0 + hit3DObjects: 0 + hit2DObjects: 0 + hitWorldSpaceUI: 0 + hitScreenSpaceUI: 1 layerMask: serializedVersion: 2 m_Bits: 4294967295 diff --git a/Source/Assets/TouchScript/Examples/Multiuser/Multiuser.unity b/Source/Assets/TouchScript/Examples/Multiuser/Multiuser.unity index d4105c102..861367bcb 100644 --- a/Source/Assets/TouchScript/Examples/Multiuser/Multiuser.unity +++ b/Source/Assets/TouchScript/Examples/Multiuser/Multiuser.unity @@ -728,6 +728,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 7a878a6ff128243dfb1d89ca0273f059, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -938,6 +939,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 7a878a6ff128243dfb1d89ca0273f059, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1386,6 +1388,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1397,8 +1400,8 @@ MonoBehaviour: requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 1 - minScreenPointsDistance: 0.5 screenTransformThreshold: 0.1 + minScreenPointsDistance: 0.5 projection: 0 projectionPlaneNormal: {x: 0, y: 0, z: 1} --- !u!4 &739470077 stripped @@ -1644,7 +1647,7 @@ Transform: m_LocalRotation: {x: -0.42646128, y: 0.4520982, z: -0.2610191, w: -0.7386522} m_LocalPosition: {x: 104.46, y: 9.66, z: -2.17} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_LocalEulerAnglesHint: {x: 60, y: -62.9381, z: 0} m_Children: [] m_Father: {fileID: 655915741} m_RootOrder: 1 @@ -1664,7 +1667,7 @@ MonoBehaviour: hit3DObjects: 1 hit2DObjects: 0 hitWorldSpaceUI: 0 - hitScreenSpaceUI: 1 + hitScreenSpaceUI: 0 layerMask: serializedVersion: 2 m_Bits: 4294967295 @@ -1991,6 +1994,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 7a878a6ff128243dfb1d89ca0273f059, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -2150,6 +2154,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 38e07bff8743d4ee38bf724a7a2b4cbb, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -2621,6 +2626,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 38e07bff8743d4ee38bf724a7a2b4cbb, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -2825,10 +2831,10 @@ MonoBehaviour: m_EditorClassIdentifier: Name: 2D Camera advancedProps: 0 - hit3DObjects: 1 - hit2DObjects: 0 + hit3DObjects: 0 + hit2DObjects: 1 hitWorldSpaceUI: 0 - hitScreenSpaceUI: 1 + hitScreenSpaceUI: 0 layerMask: serializedVersion: 2 m_Bits: 4294967295 @@ -3494,7 +3500,7 @@ Transform: m_LocalRotation: {x: 0.4931347, y: 0.14301865, z: -0.082571894, w: 0.85413456} m_LocalPosition: {x: -101.98, y: 10.05, z: -4.74} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_LocalEulerAnglesHint: {x: 60, y: 19.0112, z: 0} m_Children: [] m_Father: {fileID: 655915741} m_RootOrder: 0 @@ -3548,7 +3554,7 @@ MonoBehaviour: hit3DObjects: 1 hit2DObjects: 0 hitWorldSpaceUI: 0 - hitScreenSpaceUI: 1 + hitScreenSpaceUI: 0 layerMask: serializedVersion: 2 m_Bits: 4294967295 @@ -3625,6 +3631,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -3636,8 +3643,8 @@ MonoBehaviour: requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 1 - minScreenPointsDistance: 0.5 screenTransformThreshold: 0.1 + minScreenPointsDistance: 0.5 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 717f9f6a1..91ca9fb2a 100644 --- a/Source/Assets/TouchScript/Examples/Photos/Photos.unity +++ b/Source/Assets/TouchScript/Examples/Photos/Photos.unity @@ -182,7 +182,7 @@ 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: 0, y: 0, z: 0} + m_LocalEulerAnglesHint: {x: 32.96, y: -45, z: 0} m_Children: [] m_Father: {fileID: 930800601} m_RootOrder: 2 @@ -199,9 +199,9 @@ MonoBehaviour: m_EditorClassIdentifier: Name: Main Camera advancedProps: 0 - hit3DObjects: 1 + hit3DObjects: 0 hit2DObjects: 0 - hitWorldSpaceUI: 0 + hitWorldSpaceUI: 1 hitScreenSpaceUI: 1 layerMask: serializedVersion: 2 @@ -933,6 +933,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -944,8 +945,8 @@ MonoBehaviour: requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 7 - minScreenPointsDistance: 0.5 screenTransformThreshold: 0.1 + minScreenPointsDistance: 0.5 projection: 2 projectionPlaneNormal: {x: 0, y: 1, z: 0} --- !u!114 &238072902 @@ -959,6 +960,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1524,6 +1526,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1557,6 +1560,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1568,8 +1572,8 @@ MonoBehaviour: requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 7 - minScreenPointsDistance: 0.5 screenTransformThreshold: 0.1 + minScreenPointsDistance: 0.5 projection: 2 projectionPlaneNormal: {x: 0, y: 1, z: 0} --- !u!114 &449324832 @@ -1736,6 +1740,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1769,6 +1774,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1780,8 +1786,8 @@ MonoBehaviour: requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 7 - minScreenPointsDistance: 0.5 screenTransformThreshold: 0.1 + minScreenPointsDistance: 0.5 projection: 2 projectionPlaneNormal: {x: 0, y: 1, z: 0} --- !u!114 &536919393 @@ -2683,6 +2689,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -2716,6 +2723,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -2727,8 +2735,8 @@ MonoBehaviour: requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 7 - minScreenPointsDistance: 0.5 screenTransformThreshold: 0.1 + minScreenPointsDistance: 0.5 projection: 2 projectionPlaneNormal: {x: 0, y: 1, z: 0} --- !u!114 &886654117 @@ -4500,6 +4508,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -4533,6 +4542,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -4544,8 +4554,8 @@ MonoBehaviour: requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 7 - minScreenPointsDistance: 0.5 screenTransformThreshold: 0.1 + minScreenPointsDistance: 0.5 projection: 2 projectionPlaneNormal: {x: 0, y: 1, z: 0} --- !u!114 &1485721907 @@ -5259,6 +5269,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -5292,6 +5303,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -5303,8 +5315,8 @@ MonoBehaviour: requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 7 - minScreenPointsDistance: 0.5 screenTransformThreshold: 0.1 + minScreenPointsDistance: 0.5 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 61074540e..7ad39d616 100644 --- a/Source/Assets/TouchScript/Examples/Portal/Portal.unity +++ b/Source/Assets/TouchScript/Examples/Portal/Portal.unity @@ -114,7 +114,7 @@ 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: 0, y: 0, z: 0} + m_LocalEulerAnglesHint: {x: 89.980194, y: 0, z: 0} m_Children: - {fileID: 498618157} m_Father: {fileID: 930800601} @@ -135,7 +135,7 @@ MonoBehaviour: hit3DObjects: 1 hit2DObjects: 0 hitWorldSpaceUI: 0 - hitScreenSpaceUI: 1 + hitScreenSpaceUI: 0 layerMask: serializedVersion: 2 m_Bits: 4294967295 @@ -368,6 +368,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -379,8 +380,8 @@ MonoBehaviour: requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 1 - minScreenPointsDistance: 0.5 screenTransformThreshold: 0.1 + minScreenPointsDistance: 0.5 projection: 1 projectionPlaneNormal: {x: 0, y: 0, z: 1} --- !u!114 &481822350 @@ -394,6 +395,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 141e75b9b7edb42df80a22a14f03ae4b, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -416,6 +418,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -798,6 +801,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -809,8 +813,8 @@ MonoBehaviour: requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 1 - minScreenPointsDistance: 0.5 screenTransformThreshold: 0.1 + minScreenPointsDistance: 0.5 projection: 1 projectionPlaneNormal: {x: 0, y: 0, z: 1} --- !u!135 &851559567 @@ -836,6 +840,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 141e75b9b7edb42df80a22a14f03ae4b, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -858,6 +863,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1002,6 +1008,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1013,8 +1020,8 @@ MonoBehaviour: requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 1 - minScreenPointsDistance: 0.5 screenTransformThreshold: 0.1 + minScreenPointsDistance: 0.5 projection: 1 projectionPlaneNormal: {x: 0, y: 0, z: 1} --- !u!114 &893756813 @@ -1028,6 +1035,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 141e75b9b7edb42df80a22a14f03ae4b, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1050,6 +1058,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1324,6 +1333,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 11ea9930ecb674732bee27116520fad8, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1335,8 +1345,8 @@ MonoBehaviour: requireGestureToFail: {fileID: 0} friendlyGestures: [] type: 1 - minScreenPointsDistance: 0.5 screenTransformThreshold: 0.1 + minScreenPointsDistance: 0.5 projection: 1 projectionPlaneNormal: {x: 0, y: 0, z: 1} --- !u!114 &1166789659 @@ -1350,6 +1360,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 141e75b9b7edb42df80a22a14f03ae4b, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 @@ -1372,6 +1383,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 diff --git a/Source/Assets/TouchScript/Examples/RawInput/RawInput.unity b/Source/Assets/TouchScript/Examples/RawInput/RawInput.unity index c5762e6b3..922e8cd9d 100644 --- a/Source/Assets/TouchScript/Examples/RawInput/RawInput.unity +++ b/Source/Assets/TouchScript/Examples/RawInput/RawInput.unity @@ -98,7 +98,6 @@ GameObject: - 124: {fileID: 62216955} - 81: {fileID: 62216954} - 114: {fileID: 62216953} - - 114: {fileID: 62216958} m_Layer: 0 m_Name: Camera m_TagString: MainCamera @@ -115,7 +114,7 @@ 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: 0, y: 0, z: 0} + m_LocalEulerAnglesHint: {x: 23.6635, y: -180, z: -180} m_Children: [] m_Father: {fileID: 930800601} m_RootOrder: 1 @@ -186,27 +185,6 @@ Camera: m_StereoConvergence: 10 m_StereoSeparation: 0.022 m_StereoMirrorMode: 0 ---- !u!114 &62216958 -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: Camera - advancedProps: 0 - hit3DObjects: 1 - hit2DObjects: 0 - hitWorldSpaceUI: 0 - hitScreenSpaceUI: 1 - layerMask: - serializedVersion: 2 - m_Bits: 4294967295 - useHitFilters: 0 --- !u!1 &250857269 GameObject: m_ObjectHideFlags: 0 @@ -271,7 +249,7 @@ Prefab: m_Modifications: - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: layers.Array.size - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 400002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: m_LocalPosition.x @@ -304,11 +282,19 @@ Prefab: - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} propertyPath: layers.Array.data[0] value: - objectReference: {fileID: 62216958} + 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 + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 11400000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} + propertyPath: shouldCreateCameraLayer + value: 0 + objectReference: {fileID: 0} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} m_IsPrefabParent: 0 diff --git a/Source/Assets/TouchScript/Examples/Taps/Taps.unity b/Source/Assets/TouchScript/Examples/Taps/Taps.unity index 36850bd1e..ff12183aa 100644 --- a/Source/Assets/TouchScript/Examples/Taps/Taps.unity +++ b/Source/Assets/TouchScript/Examples/Taps/Taps.unity @@ -134,7 +134,7 @@ MonoBehaviour: hit3DObjects: 1 hit2DObjects: 0 hitWorldSpaceUI: 0 - hitScreenSpaceUI: 1 + hitScreenSpaceUI: 0 layerMask: serializedVersion: 2 m_Bits: 4294967295 @@ -492,6 +492,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 7a878a6ff128243dfb1d89ca0273f059, type: 3} m_Name: m_EditorClassIdentifier: + debugMode: 0 advancedProps: 0 minPointers: 0 maxPointers: 0 diff --git a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs index d0f389c76..63834c81d 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs @@ -184,7 +184,7 @@ private void enable() private void disable() { - if (TouchManager.Instance != null) + if (TouchManager.Instance != null && ui != null) { TouchManager.Instance.PointersUpdated -= ui.ProcessUpdated; TouchManager.Instance.PointersPressed -= ui.ProcessPressed; From 695c5e82e86fc2d918a98324317d5063d44e4b28 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Mon, 31 Oct 2016 03:57:01 +0300 Subject: [PATCH 111/211] Added new Gesture state: Idle. Gesture now transitions to Possible when starts seeing a meaningful sequence in pointer data. --- .../Scripts/GestureManagerInstance.cs | 14 +++++----- .../Gestures/Base/TransformGestureBase.cs | 6 +++++ .../TouchScript/Scripts/Gestures/Gesture.cs | 26 ++++++++++++++----- .../Scripts/Gestures/LongPressGesture.cs | 1 + .../Scripts/Gestures/MetaGesture.cs | 2 +- .../Gestures/PinnedTransformGesture.cs | 2 +- .../Scripts/Gestures/PressGesture.cs | 11 +++++++- .../Scripts/Gestures/ReleaseGesture.cs | 17 ++++++++++++ .../Scripts/Gestures/TapGesture.cs | 11 +++++--- .../Scripts/Gestures/TransformGesture.cs | 2 +- 10 files changed, 72 insertions(+), 20 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs b/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs index 87f8bec64..014153a9a 100644 --- a/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/GestureManagerInstance.cs @@ -149,15 +149,17 @@ internal Gesture.GestureState INTERNAL_GestureChangeState(Gesture gesture, Gestu bool recognized = false; switch (state) { + case Gesture.GestureState.Idle: case Gesture.GestureState.Possible: break; case Gesture.GestureState.Began: switch (gesture.State) { + case Gesture.GestureState.Idle: case Gesture.GestureState.Possible: break; default: - print(String.Format("Gesture {0} erroneously tried to enter state {1} from state {2}", + print(string.Format("Gesture {0} erroneously tried to enter state {1} from state {2}", new object[] {gesture, state, gesture.State})); break; } @@ -175,7 +177,7 @@ internal Gesture.GestureState INTERNAL_GestureChangeState(Gesture gesture, Gestu case Gesture.GestureState.Changed: break; default: - print(String.Format("Gesture {0} erroneously tried to enter state {1} from state {2}", + print(string.Format("Gesture {0} erroneously tried to enter state {1} from state {2}", new object[] {gesture, state, gesture.State})); break; } @@ -187,12 +189,10 @@ internal Gesture.GestureState INTERNAL_GestureChangeState(Gesture gesture, Gestu if (!gesturesToReset.Contains(gesture)) gesturesToReset.Add(gesture); switch (gesture.State) { + case Gesture.GestureState.Idle: case Gesture.GestureState.Possible: recognized = recognizeGestureIfNotPrevented(gesture); - if (!recognized) - { - return Gesture.GestureState.Failed; - } + if (!recognized) return Gesture.GestureState.Failed; break; case Gesture.GestureState.Began: case Gesture.GestureState.Changed: @@ -408,7 +408,7 @@ private void resetGestures() var gesture = gesturesToReset[i]; if (gesture == null) continue; gesture.INTERNAL_Reset(); - gesture.INTERNAL_SetState(Gesture.GestureState.Possible); + gesture.INTERNAL_SetState(Gesture.GestureState.Idle); } gesturesToReset.Clear(); } diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs index 2d5506eb7..bd7cecf23 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs @@ -217,6 +217,9 @@ protected override void pointersPressed(IList pointers) setState(GestureState.Ended); break; } + } else if (pointersNumState == PointersNumState.PassedMinThreshold) + { + setState(GestureState.Possible); } } @@ -233,6 +236,9 @@ protected override void pointersReleased(IList pointers) case GestureState.Changed: setState(GestureState.Ended); break; + case GestureState.Possible: + setState(GestureState.Failed); + break; } } } diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs index e58689e04..67e23af46 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/Gesture.cs @@ -36,7 +36,12 @@ public abstract class Gesture : DebuggableMonoBehaviour public enum GestureState { /// - /// Gesture is possible. + /// Gesture is idle. + /// + Idle, + + /// + /// Gesture started looking for the patern. /// Possible, @@ -255,6 +260,9 @@ private set switch (value) { + case GestureState.Idle: + onIdle(); + break; case GestureState.Possible: onPossible(); break; @@ -458,10 +466,10 @@ protected IGestureManager gestureManager private ReadOnlyCollection readonlyActivePointers; private TimedSequence pointerSequence = new TimedSequence(); private GestureManagerInstance gestureManagerInstance; - private GestureState delayedStateChange = GestureState.Possible; + private GestureState delayedStateChange = GestureState.Idle; private bool requiredGestureFailed = false; private FakePointer fakePointer = new FakePointer(); - private GestureState state = GestureState.Possible; + private GestureState state = GestureState.Idle; /// /// Cached screen position. @@ -668,7 +676,7 @@ internal void INTERNAL_Reset() { activePointers.Clear(); numPointers = 0; - delayedStateChange = GestureState.Possible; + delayedStateChange = GestureState.Idle; pointersNumState = PointersNumState.TooFew; requiredGestureFailed = false; reset(); @@ -889,10 +897,11 @@ protected bool setState(GestureState value) return false; } break; + case GestureState.Idle: case GestureState.Possible: case GestureState.Failed: case GestureState.Cancelled: - delayedStateChange = GestureState.Possible; + delayedStateChange = GestureState.Idle; break; } } @@ -954,6 +963,11 @@ protected virtual void reset() cachedPreviousScreenPosition = TouchManager.INVALID_POSITION; } + /// + /// Called when state is changed to Idle. + /// + protected virtual void onIdle() {} + /// /// Called when state is changed to Possible. /// @@ -1034,7 +1048,7 @@ private void requiredToFailGestureStateChangedHandler(object sender, GestureStat { case GestureState.Failed: requiredGestureFailed = true; - if (delayedStateChange != GestureState.Possible) + if (delayedStateChange != GestureState.Idle) { setState(delayedStateChange); } diff --git a/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs index 89992a32d..2c5ead716 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs @@ -113,6 +113,7 @@ protected override void pointersPressed(IList pointers) } else if (pointersNumState == PointersNumState.PassedMinThreshold) { + setState(GestureState.Possible); StartCoroutine("wait"); } } diff --git a/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs index 56a233d32..379f19c2a 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/MetaGesture.cs @@ -94,7 +94,7 @@ protected override void pointersPressed(IList pointers) { base.pointersPressed(pointers); - if (State == GestureState.Possible) setState(GestureState.Began); + if (State == GestureState.Idle) setState(GestureState.Began); var length = pointers.Count; if (pointerPressedInvoker != null) diff --git a/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs index 3d8d2dd99..21a10149d 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs @@ -116,7 +116,7 @@ protected override void pointersPressed(IList pointers) { base.pointersPressed(pointers); - if (State != GestureState.Possible) return; + if (State != GestureState.Idle) return; if (NumPointers == pointers.Count) { projectionLayer = activePointers[0].GetPressData().Layer; diff --git a/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs index 2e8d82bec..7ec5d1288 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs @@ -97,7 +97,16 @@ protected override void pointersPressed(IList pointers) { base.pointersPressed(pointers); - if (pointersNumState == PointersNumState.PassedMinThreshold) setState(GestureState.Recognized); + if (pointersNumState == PointersNumState.PassedMinThreshold) + { + setState(GestureState.Recognized); + return; + } + if (pointersNumState == PointersNumState.PassedMinMaxThreshold) + { + setState(GestureState.Failed); + return; + } } /// diff --git a/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs index 6a8e0c90b..ddd37682d 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs @@ -92,6 +92,23 @@ public override bool CanBePreventedByGesture(Gesture gesture) return !Delegate.ShouldRecognizeSimultaneously(this, gesture); } + /// + protected override void pointersPressed(IList pointers) + { + base.pointersPressed(pointers); + + if (pointersNumState == PointersNumState.PassedMinThreshold) + { + if (State == GestureState.Idle) setState(GestureState.Possible); + return; + } + if (pointersNumState == PointersNumState.PassedMinMaxThreshold) + { + setState(GestureState.Failed); + return; + } + } + /// protected override void pointersReleased(IList pointers) { diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs index 27eb6ae8a..4dc374081 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs @@ -103,6 +103,8 @@ public float DistanceLimit private float distanceLimitInPixelsSquared; + // isActive works in a tap cycle (i.e. when double/tripple tap is being recognized) + // State -> Possible happens when the first pointer is detected private bool isActive = false; private int tapsDone; private Vector2 startPosition; @@ -146,7 +148,6 @@ protected override void pointersPressed(IList pointers) } else if (tapsDone >= numberOfTapsRequired) // Might be delayed and retapped while waiting { - setState(GestureState.Possible); reset(); startPosition = pointers[0].Position; if (timeLimit < float.PositiveInfinity) StartCoroutine("wait"); @@ -167,7 +168,11 @@ protected override void pointersPressed(IList pointers) { // Starting the gesture when it is already active? => we released one finger and pressed again if (isActive) setState(GestureState.Failed); - else isActive = true; + else + { + if (State == GestureState.Idle) setState(GestureState.Possible); + isActive = true; + } } } @@ -249,7 +254,7 @@ private IEnumerator wait() var targetTime = Time.unscaledTime + TimeLimit; while (targetTime > Time.unscaledTime) yield return null; - if (State == GestureState.Possible) setState(GestureState.Failed); + if (State == GestureState.Idle || State == GestureState.Possible) setState(GestureState.Failed); } #endregion diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs index 8d8c7452a..d1d467ac2 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs @@ -168,7 +168,7 @@ protected override void pointersPressed(IList pointers) { base.pointersPressed(pointers); - if (State != GestureState.Possible) return; + if (State != GestureState.Idle) return; if (NumPointers == pointers.Count) { projectionLayer = activePointers[0].GetPressData().Layer; From 8e58049da3807e55c096cab7df41476fd8549302 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Mon, 31 Oct 2016 17:21:16 +0300 Subject: [PATCH 112/211] Moved Transform Gestures into their own namespace. --- .../Editor/Gestures/TransformGestures.meta | 9 ++ .../{ => TransformGestures}/Base.meta | 0 .../Base/PinnedTransformGestureBaseEditor.cs | 65 +++++++++++ .../PinnedTransformGestureBaseEditor.cs.meta | 12 +++ .../Base/TransformGestureBaseEditor.cs | 72 +++++++++++++ .../Base/TransformGestureBaseEditor.cs.meta | 12 +++ .../PinnedTransformGestureEditor.cs | 6 +- .../PinnedTransformGestureEditor.cs.meta | 0 .../ScreenTransformGestureEditor.cs | 6 +- .../ScreenTransformGestureEditor.cs.meta | 0 .../TransformGestureEditor.cs | 6 +- .../TransformGestureEditor.cs.meta | 0 .../Camera/Scripts/CameraController.cs | 2 +- .../Examples/Checkers/Scripts/Board.cs | 2 +- .../Examples/Checkers/Scripts/Exclusive.cs | 1 + .../Examples/Colors/Scripts/Circle.cs | 1 + .../Examples/Portal/Scripts/Planet.cs | 1 + .../Examples/_misc/Scripts/Checker.cs | 2 +- .../Scripts/Behaviors/Transform.meta | 9 ++ .../Scripts/Behaviors/Transformer.cs | 1 + .../Scripts/Gestures/TransformGestures.meta | 9 ++ .../{ => TransformGestures}/Base.meta | 0 .../Base/OnePointTrasformGestureBase.cs | 2 +- .../Base/OnePointTrasformGestureBase.cs.meta | 0 .../Base/TransformGestureBase.cs | 2 +- .../Base/TransformGestureBase.cs.meta | 0 .../Base/TwoPointTransformGestureBase.cs | 2 +- .../Base/TwoPointTransformGestureBase.cs.meta | 0 .../{ => TransformGestures}/Clustered.meta | 0 .../ClusteredPinnedTransformGesture.cs | 42 ++++++++ .../ClusteredPinnedTransformGesture.cs.meta | 12 +++ .../ClusteredScreenTransformGesture.cs | 102 ++++++++++++++++++ .../ClusteredScreenTransformGesture.cs.meta | 12 +++ .../Clustered/ClusteredTransformGesture.cs | 102 ++++++++++++++++++ .../ClusteredTransformGesture.cs.meta | 12 +++ .../ITransformGesture.cs | 2 +- .../ITransformGesture.cs.meta | 0 .../PinnedTransformGesture.cs | 4 +- .../PinnedTransformGesture.cs.meta | 0 .../ScreenTransformGesture.cs | 4 +- .../ScreenTransformGesture.cs.meta | 0 .../TransformGesture.cs | 4 +- .../TransformGesture.cs.meta | 0 43 files changed, 496 insertions(+), 22 deletions(-) create mode 100644 Source/Assets/TouchScript/Editor/Gestures/TransformGestures.meta rename Source/Assets/TouchScript/Editor/Gestures/{ => TransformGestures}/Base.meta (100%) create mode 100644 Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/PinnedTransformGestureBaseEditor.cs create mode 100644 Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/PinnedTransformGestureBaseEditor.cs.meta create mode 100644 Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/TransformGestureBaseEditor.cs create mode 100644 Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/TransformGestureBaseEditor.cs.meta rename Source/Assets/TouchScript/Editor/Gestures/{ => TransformGestures}/PinnedTransformGestureEditor.cs (89%) rename Source/Assets/TouchScript/Editor/Gestures/{ => TransformGestures}/PinnedTransformGestureEditor.cs.meta (100%) rename Source/Assets/TouchScript/Editor/Gestures/{ => TransformGestures}/ScreenTransformGestureEditor.cs (58%) rename Source/Assets/TouchScript/Editor/Gestures/{ => TransformGestures}/ScreenTransformGestureEditor.cs.meta (100%) rename Source/Assets/TouchScript/Editor/Gestures/{ => TransformGestures}/TransformGestureEditor.cs (88%) rename Source/Assets/TouchScript/Editor/Gestures/{ => TransformGestures}/TransformGestureEditor.cs.meta (100%) create mode 100644 Source/Assets/TouchScript/Scripts/Behaviors/Transform.meta create mode 100644 Source/Assets/TouchScript/Scripts/Gestures/TransformGestures.meta rename Source/Assets/TouchScript/Scripts/Gestures/{ => TransformGestures}/Base.meta (100%) rename Source/Assets/TouchScript/Scripts/Gestures/{ => TransformGestures}/Base/OnePointTrasformGestureBase.cs (99%) rename Source/Assets/TouchScript/Scripts/Gestures/{ => TransformGestures}/Base/OnePointTrasformGestureBase.cs.meta (100%) rename Source/Assets/TouchScript/Scripts/Gestures/{ => TransformGestures}/Base/TransformGestureBase.cs (99%) rename Source/Assets/TouchScript/Scripts/Gestures/{ => TransformGestures}/Base/TransformGestureBase.cs.meta (100%) rename Source/Assets/TouchScript/Scripts/Gestures/{ => TransformGestures}/Base/TwoPointTransformGestureBase.cs (99%) rename Source/Assets/TouchScript/Scripts/Gestures/{ => TransformGestures}/Base/TwoPointTransformGestureBase.cs.meta (100%) rename Source/Assets/TouchScript/Scripts/Gestures/{ => TransformGestures}/Clustered.meta (100%) create mode 100644 Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredPinnedTransformGesture.cs create mode 100644 Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredPinnedTransformGesture.cs.meta create mode 100644 Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredScreenTransformGesture.cs create mode 100644 Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredScreenTransformGesture.cs.meta create mode 100644 Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredTransformGesture.cs create mode 100644 Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredTransformGesture.cs.meta rename Source/Assets/TouchScript/Scripts/Gestures/{ => TransformGestures}/ITransformGesture.cs (97%) rename Source/Assets/TouchScript/Scripts/Gestures/{ => TransformGestures}/ITransformGesture.cs.meta (100%) rename Source/Assets/TouchScript/Scripts/Gestures/{ => TransformGestures}/PinnedTransformGesture.cs (98%) rename Source/Assets/TouchScript/Scripts/Gestures/{ => TransformGestures}/PinnedTransformGesture.cs.meta (100%) rename Source/Assets/TouchScript/Scripts/Gestures/{ => TransformGestures}/ScreenTransformGesture.cs (97%) rename Source/Assets/TouchScript/Scripts/Gestures/{ => TransformGestures}/ScreenTransformGesture.cs.meta (100%) rename Source/Assets/TouchScript/Scripts/Gestures/{ => TransformGestures}/TransformGesture.cs (99%) rename Source/Assets/TouchScript/Scripts/Gestures/{ => TransformGestures}/TransformGesture.cs.meta (100%) diff --git a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures.meta b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures.meta new file mode 100644 index 000000000..32d8f6cfa --- /dev/null +++ b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 5a173685f455645ce85f70ce30426f30 +folderAsset: yes +timeCreated: 1477923463 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Editor/Gestures/Base.meta b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base.meta similarity index 100% rename from Source/Assets/TouchScript/Editor/Gestures/Base.meta rename to Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base.meta diff --git a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/PinnedTransformGestureBaseEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/PinnedTransformGestureBaseEditor.cs new file mode 100644 index 000000000..d801aa1ff --- /dev/null +++ b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/PinnedTransformGestureBaseEditor.cs @@ -0,0 +1,65 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using TouchScript.Gestures.TransformGestures; +using UnityEditor; +using UnityEngine; + +namespace TouchScript.Editor.Gestures.TransformGestures.Base +{ + internal class PinnedTransformGestureBaseEditor : GestureEditor + { + public static readonly GUIContent TYPE = new GUIContent("Transform Type", "Specifies what gestures should be detected: Rotation, Scaling."); + public static readonly GUIContent TYPE_ROTATION = new GUIContent(" Rotation", "Rotating with two or more fingers."); + public static readonly GUIContent TYPE_SCALING = new GUIContent(" Scaling", "Scaling with two or more fingers."); + public static readonly GUIContent SCREEN_TRANSFORM_THRESHOLD = new GUIContent("Movement Threshold (cm)", "Minimum distance in cm pointers must move for the gesture to begin."); + + protected SerializedProperty type; + protected SerializedProperty screenTransformThreshold; + + protected override void OnEnable() + { + base.OnEnable(); + + type = serializedObject.FindProperty("type"); + screenTransformThreshold = serializedObject.FindProperty("screenTransformThreshold"); + } + + public override void OnInspectorGUI() + { + serializedObject.UpdateIfDirtyOrScript(); + + var typeValue = type.intValue; + int newType = 0; + EditorGUILayout.LabelField(TYPE); + EditorGUI.indentLevel++; + EditorGUILayout.BeginHorizontal(); + if (EditorGUILayout.ToggleLeft(TYPE_ROTATION, + (typeValue & (int)TransformGesture.TransformType.Rotation) != 0, GUILayout.Width(80))) + newType |= (int)TransformGesture.TransformType.Rotation; + EditorGUI.indentLevel--; + if (EditorGUILayout.ToggleLeft(TYPE_SCALING, + (typeValue & (int)TransformGesture.TransformType.Scaling) != 0, GUILayout.Width(70))) + newType |= (int)TransformGesture.TransformType.Scaling; + type.intValue = newType; + EditorGUILayout.EndHorizontal(); + + doInspectorGUI(); + + serializedObject.ApplyModifiedProperties(); + base.OnInspectorGUI(); + } + + protected virtual void doInspectorGUI() { } + + protected override void drawAdvanced() + { + EditorGUIUtility.labelWidth = 160; + EditorGUILayout.PropertyField(screenTransformThreshold, SCREEN_TRANSFORM_THRESHOLD); + + base.drawAdvanced(); + } + + } +} diff --git a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/PinnedTransformGestureBaseEditor.cs.meta b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/PinnedTransformGestureBaseEditor.cs.meta new file mode 100644 index 000000000..db386297d --- /dev/null +++ b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/PinnedTransformGestureBaseEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9c7f8fc728f794dc691b2a87036a14fe +timeCreated: 1447582130 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/TransformGestureBaseEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/TransformGestureBaseEditor.cs new file mode 100644 index 000000000..831dcc562 --- /dev/null +++ b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/TransformGestureBaseEditor.cs @@ -0,0 +1,72 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using TouchScript.Gestures.TransformGestures; +using UnityEditor; +using UnityEngine; + +namespace TouchScript.Editor.Gestures.TransformGestures.Base +{ + internal class TransformGestureBaseEditor : GestureEditor + { + public static readonly GUIContent TYPE = new GUIContent("Transform Type", "Specifies what gestures should be detected: Translation, Rotation, Scaling."); + public static readonly GUIContent TYPE_TRANSLATION = new GUIContent(" Translation", "Dragging with one ore more fingers."); + public static readonly GUIContent TYPE_ROTATION = new GUIContent(" Rotation", "Rotating with two or more fingers."); + public static readonly GUIContent TYPE_SCALING = new GUIContent(" Scaling", "Scaling with two or more fingers."); + public static readonly GUIContent 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 SCREEN_TRANSFORM_THRESHOLD = new GUIContent("Movement Threshold (cm)", "Minimum distance in cm pointers must move for the gesture to begin."); + + protected SerializedProperty type; + protected SerializedProperty minScreenPointsDistance; + protected SerializedProperty screenTransformThreshold; + + protected override void OnEnable() + { + base.OnEnable(); + + type = serializedObject.FindProperty("type"); + minScreenPointsDistance = serializedObject.FindProperty("minScreenPointsDistance"); + screenTransformThreshold = serializedObject.FindProperty("screenTransformThreshold"); + } + + public override void OnInspectorGUI() + { + serializedObject.UpdateIfDirtyOrScript(); + + var typeValue = type.intValue; + int newType = 0; + EditorGUILayout.LabelField(TYPE); + EditorGUI.indentLevel++; + EditorGUILayout.BeginHorizontal(); + if (EditorGUILayout.ToggleLeft(TYPE_TRANSLATION, + (typeValue & (int)TransformGesture.TransformType.Translation) != 0, GUILayout.Width(100))) + newType |= (int)TransformGesture.TransformType.Translation; + EditorGUI.indentLevel--; + if (EditorGUILayout.ToggleLeft(TYPE_ROTATION, + (typeValue & (int)TransformGesture.TransformType.Rotation) != 0, GUILayout.Width(70))) + newType |= (int)TransformGesture.TransformType.Rotation; + if (EditorGUILayout.ToggleLeft(TYPE_SCALING, + (typeValue & (int)TransformGesture.TransformType.Scaling) != 0, GUILayout.Width(70))) + newType |= (int)TransformGesture.TransformType.Scaling; + type.intValue = newType; + EditorGUILayout.EndHorizontal(); + + doInspectorGUI(); + + serializedObject.ApplyModifiedProperties(); + base.OnInspectorGUI(); + } + + protected virtual void doInspectorGUI() {} + + protected override void drawAdvanced() + { + EditorGUIUtility.labelWidth = 160; + EditorGUILayout.PropertyField(minScreenPointsDistance, MIN_SCREEN_POINTS_DISTANCE); + EditorGUILayout.PropertyField(screenTransformThreshold, SCREEN_TRANSFORM_THRESHOLD); + + base.drawAdvanced(); + } + } +} diff --git a/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/TransformGestureBaseEditor.cs.meta b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/TransformGestureBaseEditor.cs.meta new file mode 100644 index 000000000..1f7eaa1c6 --- /dev/null +++ b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/Base/TransformGestureBaseEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0a7d71b067ae746e6b8c6f6adb9a455a +timeCreated: 1447582130 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Editor/Gestures/PinnedTransformGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/PinnedTransformGestureEditor.cs similarity index 89% rename from Source/Assets/TouchScript/Editor/Gestures/PinnedTransformGestureEditor.cs rename to Source/Assets/TouchScript/Editor/Gestures/TransformGestures/PinnedTransformGestureEditor.cs index f5946a0d4..2fbf64a2e 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/PinnedTransformGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/PinnedTransformGestureEditor.cs @@ -2,12 +2,12 @@ * @author Valentin Simonov / http://va.lent.in/ */ -using TouchScript.Editor.Gestures.Base; -using TouchScript.Gestures; +using TouchScript.Editor.Gestures.TransformGestures.Base; +using TouchScript.Gestures.TransformGestures; using UnityEditor; using UnityEngine; -namespace TouchScript.Editor.Gestures +namespace TouchScript.Editor.Gestures.TransformGestures { [CustomEditor(typeof(PinnedTransformGesture), true)] internal class PinnedTransformGestureEditor : PinnedTransformGestureBaseEditor diff --git a/Source/Assets/TouchScript/Editor/Gestures/PinnedTransformGestureEditor.cs.meta b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/PinnedTransformGestureEditor.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Editor/Gestures/PinnedTransformGestureEditor.cs.meta rename to Source/Assets/TouchScript/Editor/Gestures/TransformGestures/PinnedTransformGestureEditor.cs.meta diff --git a/Source/Assets/TouchScript/Editor/Gestures/ScreenTransformGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/ScreenTransformGestureEditor.cs similarity index 58% rename from Source/Assets/TouchScript/Editor/Gestures/ScreenTransformGestureEditor.cs rename to Source/Assets/TouchScript/Editor/Gestures/TransformGestures/ScreenTransformGestureEditor.cs index a00e1c8f0..e8a1f4aed 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/ScreenTransformGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/ScreenTransformGestureEditor.cs @@ -2,11 +2,11 @@ * @author Valentin Simonov / http://va.lent.in/ */ -using TouchScript.Editor.Gestures.Base; -using TouchScript.Gestures; +using TouchScript.Editor.Gestures.TransformGestures.Base; +using TouchScript.Gestures.TransformGestures; using UnityEditor; -namespace TouchScript.Editor.Gestures +namespace TouchScript.Editor.Gestures.TransformGestures { [CustomEditor(typeof(ScreenTransformGesture), true)] internal class ScreenTransformGestureEditor : TransformGestureBaseEditor diff --git a/Source/Assets/TouchScript/Editor/Gestures/ScreenTransformGestureEditor.cs.meta b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/ScreenTransformGestureEditor.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Editor/Gestures/ScreenTransformGestureEditor.cs.meta rename to Source/Assets/TouchScript/Editor/Gestures/TransformGestures/ScreenTransformGestureEditor.cs.meta diff --git a/Source/Assets/TouchScript/Editor/Gestures/TransformGestureEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/TransformGestureEditor.cs similarity index 88% rename from Source/Assets/TouchScript/Editor/Gestures/TransformGestureEditor.cs rename to Source/Assets/TouchScript/Editor/Gestures/TransformGestures/TransformGestureEditor.cs index 39b55a77b..3626dc5c8 100644 --- a/Source/Assets/TouchScript/Editor/Gestures/TransformGestureEditor.cs +++ b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/TransformGestureEditor.cs @@ -2,12 +2,12 @@ * @author Valentin Simonov / http://va.lent.in/ */ -using TouchScript.Editor.Gestures.Base; -using TouchScript.Gestures; +using TouchScript.Editor.Gestures.TransformGestures.Base; +using TouchScript.Gestures.TransformGestures; using UnityEditor; using UnityEngine; -namespace TouchScript.Editor.Gestures +namespace TouchScript.Editor.Gestures.TransformGestures { [CustomEditor(typeof(TransformGesture), true)] internal class TransformGestureEditor : TransformGestureBaseEditor diff --git a/Source/Assets/TouchScript/Editor/Gestures/TransformGestureEditor.cs.meta b/Source/Assets/TouchScript/Editor/Gestures/TransformGestures/TransformGestureEditor.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Editor/Gestures/TransformGestureEditor.cs.meta rename to Source/Assets/TouchScript/Editor/Gestures/TransformGestures/TransformGestureEditor.cs.meta diff --git a/Source/Assets/TouchScript/Examples/Camera/Scripts/CameraController.cs b/Source/Assets/TouchScript/Examples/Camera/Scripts/CameraController.cs index b7e234319..73938a3e4 100644 --- a/Source/Assets/TouchScript/Examples/Camera/Scripts/CameraController.cs +++ b/Source/Assets/TouchScript/Examples/Camera/Scripts/CameraController.cs @@ -3,7 +3,7 @@ */ using UnityEngine; -using TouchScript.Gestures; +using TouchScript.Gestures.TransformGestures; namespace TouchScript.Examples.CameraControl { diff --git a/Source/Assets/TouchScript/Examples/Checkers/Scripts/Board.cs b/Source/Assets/TouchScript/Examples/Checkers/Scripts/Board.cs index 04b34996f..8b8aee113 100644 --- a/Source/Assets/TouchScript/Examples/Checkers/Scripts/Board.cs +++ b/Source/Assets/TouchScript/Examples/Checkers/Scripts/Board.cs @@ -3,7 +3,7 @@ */ using UnityEngine; -using TouchScript.Gestures; +using TouchScript.Gestures.TransformGestures; namespace TouchScript.Examples.Checkers { diff --git a/Source/Assets/TouchScript/Examples/Checkers/Scripts/Exclusive.cs b/Source/Assets/TouchScript/Examples/Checkers/Scripts/Exclusive.cs index b57ec2075..dd94ceb07 100644 --- a/Source/Assets/TouchScript/Examples/Checkers/Scripts/Exclusive.cs +++ b/Source/Assets/TouchScript/Examples/Checkers/Scripts/Exclusive.cs @@ -3,6 +3,7 @@ */ using TouchScript.Gestures; +using TouchScript.Gestures.TransformGestures; using TouchScript.Pointers; using UnityEngine; diff --git a/Source/Assets/TouchScript/Examples/Colors/Scripts/Circle.cs b/Source/Assets/TouchScript/Examples/Colors/Scripts/Circle.cs index a660146d9..0c0248370 100644 --- a/Source/Assets/TouchScript/Examples/Colors/Scripts/Circle.cs +++ b/Source/Assets/TouchScript/Examples/Colors/Scripts/Circle.cs @@ -4,6 +4,7 @@ using UnityEngine; using TouchScript.Gestures; +using TouchScript.Gestures.TransformGestures; namespace TouchScript.Examples.Colors { diff --git a/Source/Assets/TouchScript/Examples/Portal/Scripts/Planet.cs b/Source/Assets/TouchScript/Examples/Portal/Scripts/Planet.cs index 093464481..5fde18802 100644 --- a/Source/Assets/TouchScript/Examples/Portal/Scripts/Planet.cs +++ b/Source/Assets/TouchScript/Examples/Portal/Scripts/Planet.cs @@ -4,6 +4,7 @@ using UnityEngine; using TouchScript.Gestures; +using TouchScript.Gestures.TransformGestures; namespace TouchScript.Examples.Portal { diff --git a/Source/Assets/TouchScript/Examples/_misc/Scripts/Checker.cs b/Source/Assets/TouchScript/Examples/_misc/Scripts/Checker.cs index 8d309dc8a..3782cf0d8 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Scripts/Checker.cs +++ b/Source/Assets/TouchScript/Examples/_misc/Scripts/Checker.cs @@ -4,8 +4,8 @@ using System; using UnityEngine; -using TouchScript.Gestures; using TouchScript.Behaviors; +using TouchScript.Gestures.TransformGestures; namespace TouchScript.Examples { diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Transform.meta b/Source/Assets/TouchScript/Scripts/Behaviors/Transform.meta new file mode 100644 index 000000000..a6e0f489a --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Transform.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 94c706edb4eee4fa8a0d0fa0aad1e396 +folderAsset: yes +timeCreated: 1477922543 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs index baac6de0b..de8cc67fa 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using TouchScript.Gestures; +using TouchScript.Gestures.TransformGestures; using UnityEngine; namespace TouchScript.Behaviors diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures.meta b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures.meta new file mode 100644 index 000000000..0afe2b9f2 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 01caabc0c3e0848afa70ede89294233e +folderAsset: yes +timeCreated: 1477921285 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Base.meta b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/Gestures/Base.meta rename to Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base.meta diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Base/OnePointTrasformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/OnePointTrasformGestureBase.cs similarity index 99% rename from Source/Assets/TouchScript/Scripts/Gestures/Base/OnePointTrasformGestureBase.cs rename to Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/OnePointTrasformGestureBase.cs index afe5fb639..94edb7991 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Base/OnePointTrasformGestureBase.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/OnePointTrasformGestureBase.cs @@ -13,7 +13,7 @@ using TouchScript.Utils.DebugUtils; #endif -namespace TouchScript.Gestures.Base +namespace TouchScript.Gestures.TransformGestures.Base { /// /// Abstract base class for Pinned Transform Gestures. diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Base/OnePointTrasformGestureBase.cs.meta b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/OnePointTrasformGestureBase.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/Gestures/Base/OnePointTrasformGestureBase.cs.meta rename to Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/OnePointTrasformGestureBase.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs similarity index 99% rename from Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs rename to Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs index bd7cecf23..3825fe297 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs @@ -13,7 +13,7 @@ using TouchScript.Utils.DebugUtils; #endif -namespace TouchScript.Gestures.Base +namespace TouchScript.Gestures.TransformGestures.Base { /// /// Abstract base class for Transform Gestures. diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs.meta b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/Gestures/Base/TransformGestureBase.cs.meta rename to Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Base/TwoPointTransformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TwoPointTransformGestureBase.cs similarity index 99% rename from Source/Assets/TouchScript/Scripts/Gestures/Base/TwoPointTransformGestureBase.cs rename to Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TwoPointTransformGestureBase.cs index d407311c2..bcfc90e81 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/Base/TwoPointTransformGestureBase.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TwoPointTransformGestureBase.cs @@ -13,7 +13,7 @@ using TouchScript.Utils.DebugUtils; #endif -namespace TouchScript.Gestures.Base +namespace TouchScript.Gestures.TransformGestures.Base { public abstract class TwoPointTransformGestureBase : TransformGestureBase { diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Base/TwoPointTransformGestureBase.cs.meta b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TwoPointTransformGestureBase.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/Gestures/Base/TwoPointTransformGestureBase.cs.meta rename to Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TwoPointTransformGestureBase.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Clustered.meta b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/Gestures/Clustered.meta rename to Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered.meta diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredPinnedTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredPinnedTransformGesture.cs new file mode 100644 index 000000000..6925bdb4d --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredPinnedTransformGesture.cs @@ -0,0 +1,42 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using System.Collections.Generic; +using TouchScript.Utils; +using TouchScript.Pointers; +using UnityEngine; + +namespace TouchScript.Gestures.TransformGestures.Clustered +{ + /// + /// PinnedTransformGesture which works with centroid of all pointers instead of with just the first one. + /// 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")] + public class ClusteredPinnedTransformGesture : PinnedTransformGesture + { + #region Protected methods + + /// + protected override bool relevantPointers(IList pointers) + { + return true; + } + + /// + protected override Vector2 getPointScreenPosition() + { + return ClusterUtils.Get2DCenterPosition(activePointers); + } + + /// + protected override Vector2 getPointPreviousScreenPosition() + { + return ClusterUtils.GetPrevious2DCenterPosition(activePointers); + } + + #endregion + } +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredPinnedTransformGesture.cs.meta b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredPinnedTransformGesture.cs.meta new file mode 100644 index 000000000..c89441338 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredPinnedTransformGesture.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a02b4354287c54e8b8a68cb3380b4266 +timeCreated: 1447582130 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredScreenTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredScreenTransformGesture.cs new file mode 100644 index 000000000..d64a99af6 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredScreenTransformGesture.cs @@ -0,0 +1,102 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using System.Collections.Generic; +using TouchScript.Utils; +using TouchScript.Pointers; +using UnityEngine; + +namespace TouchScript.Gestures.TransformGestures.Clustered +{ + /// + /// ScreenTransformGesture which splits all pointers into 2 clusters and works with them. + /// 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")] + public class ClusteredScreenTransformGesture : ScreenTransformGesture + { + #region Private variables + + private Clusters.Clusters2D clusters = new Clusters.Clusters2D(); + + #endregion + + #region Gesture callbacks + + /// + protected override void pointersPressed(IList pointers) + { + clusters.AddPoints(pointers); + + base.pointersPressed(pointers); + } + + /// + protected override void pointersUpdated(IList pointers) + { + clusters.Invalidate(); + + base.pointersUpdated(pointers); + } + + /// + protected override void pointersReleased(IList pointers) + { + clusters.RemovePoints(pointers); + + base.pointersReleased(pointers); + } + + /// + protected override void reset() + { + base.reset(); + + clusters.RemoveAllPoints(); + } + + #endregion + + #region Protected methods + + /// + protected override int getNumPoints() + { + if (clusters.HasClusters) return 2; + if (NumPointers > 0) return 1; + return 0; + } + + /// + protected override bool relevantPointers1(IList pointers) + { + return true; + } + + /// + protected override bool relevantPointers2(IList pointers) + { + return true; + } + + /// + protected override Vector2 getPointScreenPosition(int index) + { + if (!clusters.HasClusters) return ClusterUtils.Get2DCenterPosition(activePointers); + + return clusters.GetCenterPosition(index); + } + + /// + protected override Vector2 getPointPreviousScreenPosition(int index) + { + if (!clusters.HasClusters) return ClusterUtils.GetPrevious2DCenterPosition(activePointers); + + return clusters.GetPreviousCenterPosition(index); + } + + #endregion + } +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredScreenTransformGesture.cs.meta b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredScreenTransformGesture.cs.meta new file mode 100644 index 000000000..addbcced0 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredScreenTransformGesture.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 35c2dca9c55c34126a66ce1252fbad55 +timeCreated: 1447582130 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredTransformGesture.cs new file mode 100644 index 000000000..cd7c24ad7 --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredTransformGesture.cs @@ -0,0 +1,102 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using System.Collections.Generic; +using TouchScript.Utils; +using TouchScript.Pointers; +using UnityEngine; + +namespace TouchScript.Gestures.TransformGestures.Clustered +{ + /// + /// TransformGesture which splits all pointers into 2 clusters and works with them. + /// 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")] + public class ClusteredTransformGesture : TransformGesture + { + #region Private variables + + private Clusters.Clusters2D clusters = new Clusters.Clusters2D(); + + #endregion + + #region Gesture callbacks + + /// + protected override void pointersPressed(IList pointers) + { + clusters.AddPoints(pointers); + + base.pointersPressed(pointers); + } + + /// + protected override void pointersUpdated(IList pointers) + { + clusters.Invalidate(); + + base.pointersUpdated(pointers); + } + + /// + protected override void pointersReleased(IList pointers) + { + clusters.RemovePoints(pointers); + + base.pointersReleased(pointers); + } + + /// + protected override void reset() + { + base.reset(); + + clusters.RemoveAllPoints(); + } + + #endregion + + #region Protected methods + + /// + protected override int getNumPoints() + { + if (clusters.HasClusters) return 2; + if (NumPointers > 0) return 1; + return 0; + } + + /// + protected override bool relevantPointers1(IList pointers) + { + return true; + } + + /// + protected override bool relevantPointers2(IList pointers) + { + return true; + } + + /// + protected override Vector2 getPointScreenPosition(int index) + { + if (!clusters.HasClusters) return ClusterUtils.Get2DCenterPosition(activePointers); + + return clusters.GetCenterPosition(index); + } + + /// + protected override Vector2 getPointPreviousScreenPosition(int index) + { + if (!clusters.HasClusters) return ClusterUtils.GetPrevious2DCenterPosition(activePointers); + + return clusters.GetPreviousCenterPosition(index); + } + + #endregion + } +} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredTransformGesture.cs.meta b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredTransformGesture.cs.meta new file mode 100644 index 000000000..6e8f83d6b --- /dev/null +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredTransformGesture.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 72b38de9ff1ca4059868438f858d35a9 +timeCreated: 1447582130 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Gestures/ITransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/ITransformGesture.cs similarity index 97% rename from Source/Assets/TouchScript/Scripts/Gestures/ITransformGesture.cs rename to Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/ITransformGesture.cs index c06060ccd..ac1d60017 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/ITransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/ITransformGesture.cs @@ -5,7 +5,7 @@ using System; using UnityEngine; -namespace TouchScript.Gestures +namespace TouchScript.Gestures.TransformGestures { /// /// Gesture which performs some kind of transformation in 3d space, i.e. translation, rotation, scaling or a combination of these. diff --git a/Source/Assets/TouchScript/Scripts/Gestures/ITransformGesture.cs.meta b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/ITransformGesture.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/Gestures/ITransformGesture.cs.meta rename to Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/ITransformGesture.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs similarity index 98% rename from Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs rename to Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs index 21a10149d..f4e53f891 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs @@ -3,7 +3,7 @@ */ using System.Collections.Generic; -using TouchScript.Gestures.Base; +using TouchScript.Gestures.TransformGestures.Base; using TouchScript.Layers; using TouchScript.Utils.Geom; using TouchScript.Pointers; @@ -12,7 +12,7 @@ #endif using UnityEngine; -namespace TouchScript.Gestures +namespace TouchScript.Gestures.TransformGestures { /// /// Recognizes a transform gesture around center of the object, i.e. one finger rotation, scaling or a combination of these. diff --git a/Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs.meta b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/Gestures/PinnedTransformGesture.cs.meta rename to Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/Gestures/ScreenTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/ScreenTransformGesture.cs similarity index 97% rename from Source/Assets/TouchScript/Scripts/Gestures/ScreenTransformGesture.cs rename to Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/ScreenTransformGesture.cs index 8fc9957df..f357b5e60 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/ScreenTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/ScreenTransformGesture.cs @@ -2,7 +2,7 @@ * @author Valentin Simonov / http://va.lent.in/ */ -using TouchScript.Gestures.Base; +using TouchScript.Gestures.TransformGestures.Base; using TouchScript.Layers; using TouchScript.Utils.Geom; using UnityEngine; @@ -11,7 +11,7 @@ using TouchScript.Pointers; #endif -namespace TouchScript.Gestures +namespace TouchScript.Gestures.TransformGestures { /// /// Recognizes a transform gesture in screen space, i.e. translation, rotation, scaling or a combination of these. diff --git a/Source/Assets/TouchScript/Scripts/Gestures/ScreenTransformGesture.cs.meta b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/ScreenTransformGesture.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/Gestures/ScreenTransformGesture.cs.meta rename to Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/ScreenTransformGesture.cs.meta diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs similarity index 99% rename from Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs rename to Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs index d1d467ac2..a76993061 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; -using TouchScript.Gestures.Base; +using TouchScript.Gestures.TransformGestures.Base; using TouchScript.Layers; using TouchScript.Utils; using TouchScript.Pointers; @@ -13,7 +13,7 @@ #endif using UnityEngine; -namespace TouchScript.Gestures +namespace TouchScript.Gestures.TransformGestures { /// /// Recognizes a transform gesture, i.e. translation, rotation, scaling or a combination of these. diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs.meta b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs.meta similarity index 100% rename from Source/Assets/TouchScript/Scripts/Gestures/TransformGesture.cs.meta rename to Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs.meta From f9c3d367b6a9f3a000053e1435456a014a1f2b7c Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 1 Nov 2016 04:37:25 +0300 Subject: [PATCH 113/211] Added smoothing to Transformer. --- .../Editor/Behaviors/TransformerEditor.cs | 59 ++++ .../Behaviors/TransformerEditor.cs.meta | 12 + .../TouchScript/Examples/Photos/Photos.unity | 40 ++- .../Scripts/Behaviors/Transformer.cs | 266 ++++++++++++++++-- .../Base/TransformGestureBase.cs | 16 ++ .../TransformGestures/TransformGesture.cs | 5 +- 6 files changed, 373 insertions(+), 25 deletions(-) create mode 100644 Source/Assets/TouchScript/Editor/Behaviors/TransformerEditor.cs create mode 100644 Source/Assets/TouchScript/Editor/Behaviors/TransformerEditor.cs.meta diff --git a/Source/Assets/TouchScript/Editor/Behaviors/TransformerEditor.cs b/Source/Assets/TouchScript/Editor/Behaviors/TransformerEditor.cs new file mode 100644 index 000000000..969f6b584 --- /dev/null +++ b/Source/Assets/TouchScript/Editor/Behaviors/TransformerEditor.cs @@ -0,0 +1,59 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +using TouchScript.Behaviors; +using UnityEditor; +using UnityEngine; + +namespace TouchScript.Editorr.Behaviors +{ + [CustomEditor(typeof(Transformer), true)] + internal class TransformerEditor : UnityEditor.Editor + { + private static readonly GUIContent TEXT_ENABLE_SMOOTHING = new GUIContent("Smoothing", "Applies smoothing to transform actions. This allows to reduce jagged movements but adds some visual lag."); + private static readonly GUIContent TEXT_SMOOTHING_FACTOR = new GUIContent("Factor", "Indicates how much smoothing to apply. 0 - no smoothing, 10000 - maximum."); + private static readonly GUIContent TEXT_POSITION_THRESHOLD = new GUIContent("Position Threshold", "Minimum distance between target position and smoothed position when to stop automatic movement."); + private static readonly GUIContent TEXT_ROTATION_THRESHOLD = new GUIContent("Rotation Threshold", "Minimum angle between target rotation and smoothed rotation when to stop automatic movement."); + private static readonly GUIContent TEXT_SCALE_THRESHOLD = new GUIContent("Scale Threshold", "Minimum difference between target scale and smoothed scale when to stop automatic movement."); + private static readonly GUIContent TEXT_ALLOW_CHANGING = new GUIContent("Allow Changing From Outside", "Indicates if this transform can be changed from another script."); + + private SerializedProperty enableSmoothing; + private SerializedProperty smoothingFactor; + private SerializedProperty positionThreshold; + private SerializedProperty rotationThreshold; + private SerializedProperty scaleThreshold; + private SerializedProperty allowChangingFromOutside; + private Transformer instance; + + 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; + } + + public override void OnInspectorGUI() + { + serializedObject.UpdateIfDirtyOrScript(); + + EditorGUILayout.PropertyField(enableSmoothing, TEXT_ENABLE_SMOOTHING); + if (enableSmoothing.boolValue) + { + instance.SmoothingFactor = EditorGUILayout.FloatField(TEXT_SMOOTHING_FACTOR, instance.SmoothingFactor); + 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); + } + + serializedObject.ApplyModifiedProperties(); + } + + } +} diff --git a/Source/Assets/TouchScript/Editor/Behaviors/TransformerEditor.cs.meta b/Source/Assets/TouchScript/Editor/Behaviors/TransformerEditor.cs.meta new file mode 100644 index 000000000..d59c686ae --- /dev/null +++ b/Source/Assets/TouchScript/Editor/Behaviors/TransformerEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2b3b3cedc8dd446d991e87f97e19fdbc +timeCreated: 1477969520 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Examples/Photos/Photos.unity b/Source/Assets/TouchScript/Examples/Photos/Photos.unity index 91ca9fb2a..79d8a9d36 100644 --- a/Source/Assets/TouchScript/Examples/Photos/Photos.unity +++ b/Source/Assets/TouchScript/Examples/Photos/Photos.unity @@ -900,7 +900,7 @@ 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: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 20.6555} m_Children: - {fileID: 1593048785} - {fileID: 994844643} @@ -922,6 +922,12 @@ MonoBehaviour: 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 &238072901 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1549,6 +1555,12 @@ MonoBehaviour: 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 &449324831 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1706,7 +1718,7 @@ 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_LocalEulerAnglesHint: {x: 0, y: 0, z: 28.7244} m_Children: - {fileID: 1065855870} - {fileID: 1772489001} @@ -1763,6 +1775,12 @@ MonoBehaviour: 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 &536919392 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2712,6 +2730,12 @@ MonoBehaviour: 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 &886654115 MonoBehaviour: m_ObjectHideFlags: 0 @@ -4531,6 +4555,12 @@ MonoBehaviour: 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 &1485721906 MonoBehaviour: m_ObjectHideFlags: 0 @@ -5292,6 +5322,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 978a486d8ecf8437cbb87e8534908895, type: 3} m_Name: m_EditorClassIdentifier: + enableSmoothing: 1 + smoothingFactor: 0.0001 + positionThreshold: 0.0001 + rotationThreshold: 0.01 + scaleThreshold: 0.0001 + allowChangingFromOutside: 0 --- !u!114 &1979821164 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs index de8cc67fa..1b60274d5 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs @@ -1,11 +1,12 @@ -/* +/* * @author Valentin Simonov / http://va.lent.in/ */ using System; -using System.Collections.Generic; using TouchScript.Gestures; using TouchScript.Gestures.TransformGestures; +using TouchScript.Gestures.TransformGestures.Base; +using TouchScript.Utils.Attributes; using UnityEngine; namespace TouchScript.Behaviors @@ -17,10 +18,94 @@ namespace TouchScript.Behaviors [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Behaviors_Transformer.htm")] public class Transformer : MonoBehaviour { + + #region Consts + + private enum TransformerState + { + Idle, + Manual, + Automatic + } + + #endregion + + #region Public properties + + public bool EnableSmoothing + { + get { return enableSmoothing; } + set { enableSmoothing = value; } + } + + public float SmoothingFactor + { + get { return smoothingFactor * 10000f; } + set + { + smoothingFactor = Mathf.Clamp(value / 10000f, 0, 1); + } + } + + public float PositionThreshold + { + get { return Mathf.Sqrt(positionThreshold); } + set { positionThreshold = value * value; } + } + + public float RotationThreshold + { + get { return rotationThreshold; } + set { rotationThreshold = value; } + } + + public float ScaleThreshold + { + get { return Mathf.Sqrt(scaleThreshold); } + set { scaleThreshold = value * value; } + } + + public bool AllowChangingFromOutside + { + get { return allowChangingFromOutside; } + set { allowChangingFromOutside = value; } + } + + #endregion + #region Private variables + [SerializeField] + [ToggleLeft] + private bool enableSmoothing = false; + + [SerializeField] + private float smoothingFactor = 1f/10000f; + + [SerializeField] + private float positionThreshold = 0.0001f; + + [SerializeField] + private float rotationThreshold = 0.01f; + + [SerializeField] + private float scaleThreshold = 0.0001f; + + [SerializeField] + [ToggleLeft] + private bool allowChangingFromOutside = false; + + private TransformerState state; + + private TransformGestureBase gesture; private Transform cachedTransform; - private List gestures = new List(); + + private Vector3 targetPosition, targetScale; + private Quaternion targetRotation; + + // last* variables are needed to detect when Transform's properties were changed outside of this script + private Vector3 lastPosition, lastScale; + private Quaternion lastRotation; #endregion @@ -29,44 +114,183 @@ public class Transformer : MonoBehaviour private void Awake() { cachedTransform = transform; + stateIdle(); } private void OnEnable() { - var g = GetComponents(); - for (var i = 0; i < g.Length; i++) + gesture = GetComponent(); + gesture.StateChanged += stateChangedHandler; + + TouchManager.Instance.FrameFinished += frameFinishedHandler; + } + + private void OnDisable() + { + if (gesture != null) { - var transformGesture = g[i] as ITransformGesture; - if (transformGesture == null) continue; + gesture.StateChanged -= stateChangedHandler; + } + + if (TouchManager.Instance != null) + TouchManager.Instance.FrameFinished -= frameFinishedHandler; + } + + #endregion - gestures.Add(transformGesture); - transformGesture.Transformed += transformHandler; + #region States + + private void stateIdle() + { + var prevState = state; + setState(TransformerState.Idle); + + if (enableSmoothing && prevState == TransformerState.Automatic) + { + transform.position = lastPosition = targetPosition; + var newLocalScale = lastScale = targetScale; + // prevent recalculating colliders when no scale occurs + if (newLocalScale != transform.localScale) transform.localScale = newLocalScale; + transform.rotation = lastRotation = targetRotation; } } - private void OnDisable() + private void stateManual() + { + setState(TransformerState.Manual); + + targetPosition = lastPosition = cachedTransform.position; + targetRotation = lastRotation = cachedTransform.rotation; + targetScale = lastScale = cachedTransform.localScale; + } + + private void stateAutomatic() + { + setState(TransformerState.Automatic); + + if (!enableSmoothing) stateIdle(); + } + + private void setState(TransformerState newState) { - for (var i = 0; i < gestures.Count; i++) + state = newState; + } + + #endregion + + #region Private functions + + private void update() + { + if (state == TransformerState.Idle) return; + + if (!enableSmoothing) return; + + var fraction = 1 - Mathf.Pow(smoothingFactor, Time.deltaTime); + + var scale = transform.localScale; + if (allowChangingFromOutside) { - var transformGesture = gestures[i]; - transformGesture.Transformed -= transformHandler; + // 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; } - gestures.Clear(); + 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 (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; + + 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) + { + var dP = (targetPosition - lastPosition).sqrMagnitude; + var dS = (targetScale - lastScale).sqrMagnitude; + var dR = Quaternion.Angle(targetRotation, lastRotation); + if (dP < positionThreshold && dR < rotationThreshold && dS < scaleThreshold) stateIdle(); + } + } + + private void manualUpdate() + { + 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; + + gesture.OverrideTargetPosition(targetPosition); + + if (!enableSmoothing) applyValues(); + } + + private void applyValues() + { + cachedTransform.localScale = targetScale; + cachedTransform.rotation = targetRotation; + cachedTransform.position = targetPosition; } #endregion #region Event handlers - private void transformHandler(object sender, EventArgs e) + private void stateChangedHandler(object sender, GestureStateChangeEventArgs gestureStateChangeEventArgs) { - var gesture = sender as ITransformGesture; - var mask = gesture.TransformMask; + switch (gestureStateChangeEventArgs.State) + { + case Gesture.GestureState.Possible: + stateManual(); + break; + case Gesture.GestureState.Changed: + manualUpdate(); + break; + case Gesture.GestureState.Ended: + case Gesture.GestureState.Cancelled: + stateAutomatic(); + break; + case Gesture.GestureState.Failed: + if (gestureStateChangeEventArgs.PreviousState == Gesture.GestureState.Possible) + stateAutomatic(); + break; + } + } - if ((mask & TransformGesture.TransformType.Scaling) != 0) cachedTransform.localScale *= gesture.DeltaScale; - if ((mask & TransformGesture.TransformType.Rotation) != 0) - cachedTransform.rotation = Quaternion.AngleAxis(gesture.DeltaRotation, gesture.RotationAxis) * cachedTransform.rotation; - if ((mask & TransformGesture.TransformType.Translation) != 0) cachedTransform.position += gesture.DeltaPosition; + private void frameFinishedHandler(object sender, EventArgs eventArgs) + { + update(); } #endregion diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs index 3825fe297..7b80990aa 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs @@ -168,6 +168,9 @@ public Vector3 RotationAxis /// protected bool isTransforming = false; + protected bool targetPositionOverridden = false; + protected Vector3 targetPosition; + [SerializeField] protected TransformGesture.TransformType type = TransformGesture.TransformType.Translation | TransformGesture.TransformType.Scaling | TransformGesture.TransformType.Rotation; @@ -177,6 +180,16 @@ public Vector3 RotationAxis #endregion + #region Public methods + + public void OverrideTargetPosition(Vector3 position) + { + targetPositionOverridden = true; + targetPosition = position; + } + + #endregion + #region Unity methods #if TOUCHSCRIPT_DEBUG @@ -258,6 +271,9 @@ protected override void onBegan() protected override void onChanged() { base.onChanged(); + + targetPositionOverridden = false; + if (transformedInvoker != null) transformedInvoker.InvokeHandleExceptions(this, EventArgs.Empty); if (UseSendMessage && SendMessageTarget != null) SendMessageTarget.SendMessage(TRANSFORM_MESSAGE, this, SendMessageOptions.DontRequireReceiver); diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs index a76993061..3bda55cf2 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs @@ -194,10 +194,11 @@ protected override void pointersReleased(IList pointers) protected Vector3 projectScaledRotated(Vector2 point, float dR, float dS, ProjectionParams projectionParams) { - var delta = projectionParams.ProjectTo(point, transformPlane) - cachedTransform.position; + var center = targetPositionOverridden ? targetPosition : cachedTransform.position; + var delta = projectionParams.ProjectTo(point, transformPlane) - center; if (dR != 0) delta = Quaternion.AngleAxis(dR, RotationAxis) * delta; if (dS != 0) delta = delta * dS; - return cachedTransform.position + delta; + return center + delta; } /// From d205a439ee2acd6af277e085ed1201681500500d Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 1 Nov 2016 06:38:57 +0300 Subject: [PATCH 114/211] Some stuff left from moving Transform Gestures to the new namespace. --- .../Base/PinnedTransformGestureBaseEditor.cs | 65 ----------- .../PinnedTransformGestureBaseEditor.cs.meta | 12 --- .../Base/TransformGestureBaseEditor.cs | 72 ------------- .../Base/TransformGestureBaseEditor.cs.meta | 12 --- .../ClusteredPinnedTransformGesture.cs | 42 -------- .../ClusteredPinnedTransformGesture.cs.meta | 12 --- .../ClusteredScreenTransformGesture.cs | 102 ------------------ .../ClusteredScreenTransformGesture.cs.meta | 12 --- .../Clustered/ClusteredTransformGesture.cs | 102 ------------------ .../ClusteredTransformGesture.cs.meta | 12 --- 10 files changed, 443 deletions(-) delete mode 100644 Source/Assets/TouchScript/Editor/Gestures/Base/PinnedTransformGestureBaseEditor.cs delete mode 100644 Source/Assets/TouchScript/Editor/Gestures/Base/PinnedTransformGestureBaseEditor.cs.meta delete mode 100644 Source/Assets/TouchScript/Editor/Gestures/Base/TransformGestureBaseEditor.cs delete mode 100644 Source/Assets/TouchScript/Editor/Gestures/Base/TransformGestureBaseEditor.cs.meta delete mode 100644 Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredPinnedTransformGesture.cs delete mode 100644 Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredPinnedTransformGesture.cs.meta delete mode 100644 Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredScreenTransformGesture.cs delete mode 100644 Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredScreenTransformGesture.cs.meta delete mode 100644 Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredTransformGesture.cs delete mode 100644 Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredTransformGesture.cs.meta diff --git a/Source/Assets/TouchScript/Editor/Gestures/Base/PinnedTransformGestureBaseEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/Base/PinnedTransformGestureBaseEditor.cs deleted file mode 100644 index 805f52518..000000000 --- a/Source/Assets/TouchScript/Editor/Gestures/Base/PinnedTransformGestureBaseEditor.cs +++ /dev/null @@ -1,65 +0,0 @@ -/* - * @author Valentin Simonov / http://va.lent.in/ - */ - -using TouchScript.Gestures; -using UnityEditor; -using UnityEngine; - -namespace TouchScript.Editor.Gestures.Base -{ - internal class PinnedTransformGestureBaseEditor : GestureEditor - { - public static readonly GUIContent TYPE = new GUIContent("Transform Type", "Specifies what gestures should be detected: Rotation, Scaling."); - public static readonly GUIContent TYPE_ROTATION = new GUIContent(" Rotation", "Rotating with two or more fingers."); - public static readonly GUIContent TYPE_SCALING = new GUIContent(" Scaling", "Scaling with two or more fingers."); - public static readonly GUIContent SCREEN_TRANSFORM_THRESHOLD = new GUIContent("Movement Threshold (cm)", "Minimum distance in cm pointers must move for the gesture to begin."); - - protected SerializedProperty type; - protected SerializedProperty screenTransformThreshold; - - protected override void OnEnable() - { - base.OnEnable(); - - type = serializedObject.FindProperty("type"); - screenTransformThreshold = serializedObject.FindProperty("screenTransformThreshold"); - } - - public override void OnInspectorGUI() - { - serializedObject.UpdateIfDirtyOrScript(); - - var typeValue = type.intValue; - int newType = 0; - EditorGUILayout.LabelField(TYPE); - EditorGUI.indentLevel++; - EditorGUILayout.BeginHorizontal(); - if (EditorGUILayout.ToggleLeft(TYPE_ROTATION, - (typeValue & (int)TransformGesture.TransformType.Rotation) != 0, GUILayout.Width(80))) - newType |= (int)TransformGesture.TransformType.Rotation; - EditorGUI.indentLevel--; - if (EditorGUILayout.ToggleLeft(TYPE_SCALING, - (typeValue & (int)TransformGesture.TransformType.Scaling) != 0, GUILayout.Width(70))) - newType |= (int)TransformGesture.TransformType.Scaling; - type.intValue = newType; - EditorGUILayout.EndHorizontal(); - - doInspectorGUI(); - - serializedObject.ApplyModifiedProperties(); - base.OnInspectorGUI(); - } - - protected virtual void doInspectorGUI() { } - - protected override void drawAdvanced() - { - EditorGUIUtility.labelWidth = 160; - EditorGUILayout.PropertyField(screenTransformThreshold, SCREEN_TRANSFORM_THRESHOLD); - - base.drawAdvanced(); - } - - } -} diff --git a/Source/Assets/TouchScript/Editor/Gestures/Base/PinnedTransformGestureBaseEditor.cs.meta b/Source/Assets/TouchScript/Editor/Gestures/Base/PinnedTransformGestureBaseEditor.cs.meta deleted file mode 100644 index db386297d..000000000 --- a/Source/Assets/TouchScript/Editor/Gestures/Base/PinnedTransformGestureBaseEditor.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 9c7f8fc728f794dc691b2a87036a14fe -timeCreated: 1447582130 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Source/Assets/TouchScript/Editor/Gestures/Base/TransformGestureBaseEditor.cs b/Source/Assets/TouchScript/Editor/Gestures/Base/TransformGestureBaseEditor.cs deleted file mode 100644 index c0882805d..000000000 --- a/Source/Assets/TouchScript/Editor/Gestures/Base/TransformGestureBaseEditor.cs +++ /dev/null @@ -1,72 +0,0 @@ -/* - * @author Valentin Simonov / http://va.lent.in/ - */ - -using TouchScript.Gestures; -using UnityEditor; -using UnityEngine; - -namespace TouchScript.Editor.Gestures.Base -{ - internal class TransformGestureBaseEditor : GestureEditor - { - public static readonly GUIContent TYPE = new GUIContent("Transform Type", "Specifies what gestures should be detected: Translation, Rotation, Scaling."); - public static readonly GUIContent TYPE_TRANSLATION = new GUIContent(" Translation", "Dragging with one ore more fingers."); - public static readonly GUIContent TYPE_ROTATION = new GUIContent(" Rotation", "Rotating with two or more fingers."); - public static readonly GUIContent TYPE_SCALING = new GUIContent(" Scaling", "Scaling with two or more fingers."); - public static readonly GUIContent 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 SCREEN_TRANSFORM_THRESHOLD = new GUIContent("Movement Threshold (cm)", "Minimum distance in cm pointers must move for the gesture to begin."); - - protected SerializedProperty type; - protected SerializedProperty minScreenPointsDistance; - protected SerializedProperty screenTransformThreshold; - - protected override void OnEnable() - { - base.OnEnable(); - - type = serializedObject.FindProperty("type"); - minScreenPointsDistance = serializedObject.FindProperty("minScreenPointsDistance"); - screenTransformThreshold = serializedObject.FindProperty("screenTransformThreshold"); - } - - public override void OnInspectorGUI() - { - serializedObject.UpdateIfDirtyOrScript(); - - var typeValue = type.intValue; - int newType = 0; - EditorGUILayout.LabelField(TYPE); - EditorGUI.indentLevel++; - EditorGUILayout.BeginHorizontal(); - if (EditorGUILayout.ToggleLeft(TYPE_TRANSLATION, - (typeValue & (int)TransformGesture.TransformType.Translation) != 0, GUILayout.Width(100))) - newType |= (int)TransformGesture.TransformType.Translation; - EditorGUI.indentLevel--; - if (EditorGUILayout.ToggleLeft(TYPE_ROTATION, - (typeValue & (int)TransformGesture.TransformType.Rotation) != 0, GUILayout.Width(70))) - newType |= (int)TransformGesture.TransformType.Rotation; - if (EditorGUILayout.ToggleLeft(TYPE_SCALING, - (typeValue & (int)TransformGesture.TransformType.Scaling) != 0, GUILayout.Width(70))) - newType |= (int)TransformGesture.TransformType.Scaling; - type.intValue = newType; - EditorGUILayout.EndHorizontal(); - - doInspectorGUI(); - - serializedObject.ApplyModifiedProperties(); - base.OnInspectorGUI(); - } - - protected virtual void doInspectorGUI() {} - - protected override void drawAdvanced() - { - EditorGUIUtility.labelWidth = 160; - EditorGUILayout.PropertyField(minScreenPointsDistance, MIN_SCREEN_POINTS_DISTANCE); - EditorGUILayout.PropertyField(screenTransformThreshold, SCREEN_TRANSFORM_THRESHOLD); - - base.drawAdvanced(); - } - } -} diff --git a/Source/Assets/TouchScript/Editor/Gestures/Base/TransformGestureBaseEditor.cs.meta b/Source/Assets/TouchScript/Editor/Gestures/Base/TransformGestureBaseEditor.cs.meta deleted file mode 100644 index 1f7eaa1c6..000000000 --- a/Source/Assets/TouchScript/Editor/Gestures/Base/TransformGestureBaseEditor.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 0a7d71b067ae746e6b8c6f6adb9a455a -timeCreated: 1447582130 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredPinnedTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredPinnedTransformGesture.cs deleted file mode 100644 index 90e911204..000000000 --- a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredPinnedTransformGesture.cs +++ /dev/null @@ -1,42 +0,0 @@ -/* - * @author Valentin Simonov / http://va.lent.in/ - */ - -using System.Collections.Generic; -using TouchScript.Utils; -using TouchScript.Pointers; -using UnityEngine; - -namespace TouchScript.Gestures.Clustered -{ - /// - /// PinnedTransformGesture which works with centroid of all pointers instead of with just the first one. - /// 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")] - public class ClusteredPinnedTransformGesture : PinnedTransformGesture - { - #region Protected methods - - /// - protected override bool relevantPointers(IList pointers) - { - return true; - } - - /// - protected override Vector2 getPointScreenPosition() - { - return ClusterUtils.Get2DCenterPosition(activePointers); - } - - /// - protected override Vector2 getPointPreviousScreenPosition() - { - return ClusterUtils.GetPrevious2DCenterPosition(activePointers); - } - - #endregion - } -} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredPinnedTransformGesture.cs.meta b/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredPinnedTransformGesture.cs.meta deleted file mode 100644 index c89441338..000000000 --- a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredPinnedTransformGesture.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: a02b4354287c54e8b8a68cb3380b4266 -timeCreated: 1447582130 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredScreenTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredScreenTransformGesture.cs deleted file mode 100644 index c8b6682ae..000000000 --- a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredScreenTransformGesture.cs +++ /dev/null @@ -1,102 +0,0 @@ -/* - * @author Valentin Simonov / http://va.lent.in/ - */ - -using System.Collections.Generic; -using TouchScript.Utils; -using TouchScript.Pointers; -using UnityEngine; - -namespace TouchScript.Gestures.Clustered -{ - /// - /// ScreenTransformGesture which splits all pointers into 2 clusters and works with them. - /// 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")] - public class ClusteredScreenTransformGesture : ScreenTransformGesture - { - #region Private variables - - private Clusters.Clusters2D clusters = new Clusters.Clusters2D(); - - #endregion - - #region Gesture callbacks - - /// - protected override void pointersPressed(IList pointers) - { - clusters.AddPoints(pointers); - - base.pointersPressed(pointers); - } - - /// - protected override void pointersUpdated(IList pointers) - { - clusters.Invalidate(); - - base.pointersUpdated(pointers); - } - - /// - protected override void pointersReleased(IList pointers) - { - clusters.RemovePoints(pointers); - - base.pointersReleased(pointers); - } - - /// - protected override void reset() - { - base.reset(); - - clusters.RemoveAllPoints(); - } - - #endregion - - #region Protected methods - - /// - protected override int getNumPoints() - { - if (clusters.HasClusters) return 2; - if (NumPointers > 0) return 1; - return 0; - } - - /// - protected override bool relevantPointers1(IList pointers) - { - return true; - } - - /// - protected override bool relevantPointers2(IList pointers) - { - return true; - } - - /// - protected override Vector2 getPointScreenPosition(int index) - { - if (!clusters.HasClusters) return ClusterUtils.Get2DCenterPosition(activePointers); - - return clusters.GetCenterPosition(index); - } - - /// - protected override Vector2 getPointPreviousScreenPosition(int index) - { - if (!clusters.HasClusters) return ClusterUtils.GetPrevious2DCenterPosition(activePointers); - - return clusters.GetPreviousCenterPosition(index); - } - - #endregion - } -} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredScreenTransformGesture.cs.meta b/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredScreenTransformGesture.cs.meta deleted file mode 100644 index addbcced0..000000000 --- a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredScreenTransformGesture.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 35c2dca9c55c34126a66ce1252fbad55 -timeCreated: 1447582130 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredTransformGesture.cs deleted file mode 100644 index 4c45ec921..000000000 --- a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredTransformGesture.cs +++ /dev/null @@ -1,102 +0,0 @@ -/* - * @author Valentin Simonov / http://va.lent.in/ - */ - -using System.Collections.Generic; -using TouchScript.Utils; -using TouchScript.Pointers; -using UnityEngine; - -namespace TouchScript.Gestures.Clustered -{ - /// - /// TransformGesture which splits all pointers into 2 clusters and works with them. - /// 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")] - public class ClusteredTransformGesture : TransformGesture - { - #region Private variables - - private Clusters.Clusters2D clusters = new Clusters.Clusters2D(); - - #endregion - - #region Gesture callbacks - - /// - protected override void pointersPressed(IList pointers) - { - clusters.AddPoints(pointers); - - base.pointersPressed(pointers); - } - - /// - protected override void pointersUpdated(IList pointers) - { - clusters.Invalidate(); - - base.pointersUpdated(pointers); - } - - /// - protected override void pointersReleased(IList pointers) - { - clusters.RemovePoints(pointers); - - base.pointersReleased(pointers); - } - - /// - protected override void reset() - { - base.reset(); - - clusters.RemoveAllPoints(); - } - - #endregion - - #region Protected methods - - /// - protected override int getNumPoints() - { - if (clusters.HasClusters) return 2; - if (NumPointers > 0) return 1; - return 0; - } - - /// - protected override bool relevantPointers1(IList pointers) - { - return true; - } - - /// - protected override bool relevantPointers2(IList pointers) - { - return true; - } - - /// - protected override Vector2 getPointScreenPosition(int index) - { - if (!clusters.HasClusters) return ClusterUtils.Get2DCenterPosition(activePointers); - - return clusters.GetCenterPosition(index); - } - - /// - protected override Vector2 getPointPreviousScreenPosition(int index) - { - if (!clusters.HasClusters) return ClusterUtils.GetPrevious2DCenterPosition(activePointers); - - return clusters.GetPreviousCenterPosition(index); - } - - #endregion - } -} \ No newline at end of file diff --git a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredTransformGesture.cs.meta b/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredTransformGesture.cs.meta deleted file mode 100644 index 6e8f83d6b..000000000 --- a/Source/Assets/TouchScript/Scripts/Gestures/Clustered/ClusteredTransformGesture.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 72b38de9ff1ca4059868438f858d35a9 -timeCreated: 1447582130 -licenseType: Pro -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: From e2d89c641006437733efededcff8d86d6dcc9af2 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 1 Nov 2016 07:02:45 +0300 Subject: [PATCH 115/211] Added some docs, removed unused imports. --- .../Scripts/Behaviors/Transformer.cs | 36 +++++++++++++++++++ .../Base/TransformGestureBase.cs | 16 ++++++++- .../TouchScript/Scripts/ITouchManager.cs | 2 -- 3 files changed, 51 insertions(+), 3 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs index 1b60274d5..1ae193bfb 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs @@ -32,12 +32,24 @@ private enum TransformerState #region Public properties + /// + /// Gets or sets a value indicating whether Smoothing is enabled. Smoothing allows to reduce jagged movements but adds some visual lag. + /// + /// + /// true if Smoothing is enabled; otherwise, false. + /// public bool EnableSmoothing { get { return enableSmoothing; } set { enableSmoothing = value; } } + /// + /// Gets or sets the smoothing factor. + /// + /// + /// The smoothing factor. Indicates how much smoothing to apply. 0 - no smoothing, 10000 - maximum. + /// public float SmoothingFactor { get { return smoothingFactor * 10000f; } @@ -47,24 +59,48 @@ public float SmoothingFactor } } + /// + /// Gets or sets the position threshold. + /// + /// + /// Minimum distance between target position and smoothed position when to stop automatic movement. + /// public float PositionThreshold { get { return Mathf.Sqrt(positionThreshold); } set { positionThreshold = value * value; } } + /// + /// Gets or sets the rotation threshold. + /// + /// + /// Minimum angle between target rotation and smoothed rotation when to stop automatic movement. + /// public float RotationThreshold { get { return rotationThreshold; } set { rotationThreshold = value; } } + /// + /// Gets or sets the scale threshold. + /// + /// + /// Minimum difference between target scale and smoothed scale when to stop automatic movement. + /// public float ScaleThreshold { get { return Mathf.Sqrt(scaleThreshold); } set { scaleThreshold = value * value; } } + /// + /// Gets or sets a value indicating whether this transform can be changed from another script. + /// + /// + /// true if this transform can be changed from another script; otherwise, false. + /// public bool AllowChangingFromOutside { get { return allowChangingFromOutside; } diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs index 7b80990aa..133ca2996 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs @@ -9,7 +9,6 @@ using UnityEngine; #if TOUCHSCRIPT_DEBUG -using System.Collections; using TouchScript.Utils.DebugUtils; #endif @@ -18,6 +17,9 @@ namespace TouchScript.Gestures.TransformGestures.Base /// /// Abstract base class for Transform Gestures. /// + /// + /// Relationship with component requires that if current object position is not exactly the one acquired by transformation events from this gesture (i.e. when smoothing is applied current transform is lagging a bit behind target transform), the gesture has to know about this to calculate translation properly. This is where method comes into play. has to call it after every transform event. + /// public abstract class TransformGestureBase : Gesture, ITransformGesture { #region Constants @@ -168,7 +170,15 @@ public Vector3 RotationAxis /// protected bool isTransforming = false; + /// + /// Indicates if current position is being overridden for the next frame. . + /// protected bool targetPositionOverridden = false; + + + /// + /// Target overridden position. . + /// protected Vector3 targetPosition; [SerializeField] @@ -182,6 +192,10 @@ public Vector3 RotationAxis #region Public methods + /// + /// Overrides the target position used in calculations this frame. If used, has to be set after every transform event. . + /// + /// Target position. public void OverrideTargetPosition(Vector3 position) { targetPositionOverridden = true; diff --git a/Source/Assets/TouchScript/Scripts/ITouchManager.cs b/Source/Assets/TouchScript/Scripts/ITouchManager.cs index 81a409ff0..c7c8b567b 100644 --- a/Source/Assets/TouchScript/Scripts/ITouchManager.cs +++ b/Source/Assets/TouchScript/Scripts/ITouchManager.cs @@ -5,11 +5,9 @@ using System; using System.Collections.Generic; using TouchScript.Devices.Display; -using TouchScript.Hit; using TouchScript.InputSources; using TouchScript.Layers; using TouchScript.Pointers; -using UnityEngine; namespace TouchScript { From b4c45933f1ac3a86fa698275dc39550185019112 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 1 Nov 2016 14:39:18 +0300 Subject: [PATCH 116/211] Fixed Transformer not starting correctly if enabled on TransformGesture event. --- Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs index 1ae193bfb..4be1c47d5 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs @@ -281,6 +281,8 @@ private void update() private void manualUpdate() { + if (state != TransformerState.Manual) stateManual(); + var mask = gesture.TransformMask; if ((mask & TransformGesture.TransformType.Scaling) != 0) targetScale *= gesture.DeltaScale; if ((mask & TransformGesture.TransformType.Rotation) != 0) From 2e02d3b8d3c6f7fff8c47bd58d51fa55e09aa1cf Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 1 Nov 2016 15:45:46 +0300 Subject: [PATCH 117/211] Fixed an issue with TransformGesture not initializing layer projection params properly. --- .../TransformGestures/Base/TwoPointTransformGestureBase.cs | 2 +- .../Gestures/TransformGestures/PinnedTransformGesture.cs | 1 - .../Scripts/Gestures/TransformGestures/TransformGesture.cs | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TwoPointTransformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TwoPointTransformGestureBase.cs index bcfc90e81..02f95f4c1 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TwoPointTransformGestureBase.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TwoPointTransformGestureBase.cs @@ -129,7 +129,7 @@ protected override void pointersPressed(IList pointers) if (!(pointersNumState == PointersNumState.PassedMaxThreshold || pointersNumState == PointersNumState.PassedMinMaxThreshold)) drawDebugDelayed(getNumPoints()); - } + } #endif /// diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs index f4e53f891..e726d8149 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs @@ -116,7 +116,6 @@ protected override void pointersPressed(IList pointers) { base.pointersPressed(pointers); - if (State != GestureState.Idle) return; if (NumPointers == pointers.Count) { projectionLayer = activePointers[0].GetPressData().Layer; diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs index 3bda55cf2..e8f62b833 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs @@ -168,7 +168,6 @@ protected override void pointersPressed(IList pointers) { base.pointersPressed(pointers); - if (State != GestureState.Idle) return; if (NumPointers == pointers.Count) { projectionLayer = activePointers[0].GetPressData().Layer; From 49bf3dd12dc879f1932ccd5e436c6d9033f7d09f Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 1 Nov 2016 16:22:45 +0300 Subject: [PATCH 118/211] Esc exits from examples. --- Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs b/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs index 9919fd8b8..9ee4920a2 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs +++ b/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs @@ -72,6 +72,11 @@ private void Start() } } + private void Update() + { + if (Input.GetKeyDown(KeyCode.Escape)) Application.Quit(); + } + private void OnLevelWasLoaded(int num) { StartCoroutine(resetUILayer()); From 78cec73bebc44fd0d6d7ed6c2eacfd9cf66a03b1 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 1 Nov 2016 17:12:53 +0300 Subject: [PATCH 119/211] Fixed Transformer not resetting when disabled. --- .../TouchScript/Scripts/Behaviors/Transformer.cs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs index 4be1c47d5..b1c07b9c2 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs @@ -150,26 +150,24 @@ public bool AllowChangingFromOutside private void Awake() { cachedTransform = transform; - stateIdle(); } private void OnEnable() { gesture = GetComponent(); gesture.StateChanged += stateChangedHandler; - TouchManager.Instance.FrameFinished += frameFinishedHandler; + + stateIdle(); } private void OnDisable() { - if (gesture != null) - { - gesture.StateChanged -= stateChangedHandler; - } - + if (gesture != null) gesture.StateChanged -= stateChangedHandler; if (TouchManager.Instance != null) TouchManager.Instance.FrameFinished -= frameFinishedHandler; + + stateIdle(); } #endregion From 43c248e032a9b00da98e90656f18a5d0f7ce9f7f Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Tue, 1 Nov 2016 18:17:21 +0300 Subject: [PATCH 120/211] Now if a new StandardInput is created, the old one is destroyed. Don't want multiple touch inputs to be initialized. --- .../InputSources/InputHandlers/WindowsPointerHandlers.cs | 1 - .../Assets/TouchScript/Scripts/InputSources/StandardInput.cs | 5 +++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs index c5c1f1570..663f0eb6c 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs @@ -370,7 +370,6 @@ protected PenPointer internalReturnPenPointer(PenPointer pointer) protected void init(TOUCH_API api) { - Debug.Log("Init! " + api); Init(api, nativePointerDownDelegate, nativePointerUpdateDelegate, nativePointerUpDelegate, nativePointerCancelDelegate); } diff --git a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs index 03c8db931..a63a95946 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs @@ -151,6 +151,8 @@ public bool EmulateSecondMousePointer #region Private variables + private static StandardInput instance; + [SerializeField] private Windows8APIType windows8API = Windows8APIType.Windows8; @@ -224,6 +226,9 @@ public override bool CancelPointer(Pointer pointer, bool shouldReturn) /// protected override void OnEnable() { + if (instance != null) Destroy(instance); + instance = this; + base.OnEnable(); Input.simulateMouseWithTouches = false; From 4093869ac009d39b8e1a9c6931014923d0b36991 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Wed, 2 Nov 2016 21:13:39 +0300 Subject: [PATCH 121/211] Fixed windows input not initializing if Unity window is on background when the game starts. --- External/WindowsTouch/WindowsTouch.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/External/WindowsTouch/WindowsTouch.cpp b/External/WindowsTouch/WindowsTouch.cpp index 0f554061b..a3914e8c2 100644 --- a/External/WindowsTouch/WindowsTouch.cpp +++ b/External/WindowsTouch/WindowsTouch.cpp @@ -16,7 +16,7 @@ extern "C" _pointerCancelledFunc = cancelled; _api = api; - _currentWindow = GetActiveWindow(); + _currentWindow = FindWindowA("UnityWndClass", NULL); if (api == WIN8) { _oldWindowProc = SetWindowLongPtr(_currentWindow, GWLP_WNDPROC, (LONG_PTR)wndProc8); From 3625f7a4f789805da4041ab548bf69966bb493fb Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Wed, 2 Nov 2016 21:19:30 +0300 Subject: [PATCH 122/211] Removed GraphicRaycasters from example text, rearranged a few prefabs. --- .../TouchScript/Examples/Camera/Camera.unity | 4 ++ .../Examples/Multiuser/Multiuser.unity | 12 ++++++ .../TouchScript/Examples/Portal/Portal.unity | 41 +++++++++++-------- .../TouchScript/Examples/Taps/Taps.unity | 17 -------- 4 files changed, 40 insertions(+), 34 deletions(-) diff --git a/Source/Assets/TouchScript/Examples/Camera/Camera.unity b/Source/Assets/TouchScript/Examples/Camera/Camera.unity index eb7817c35..aa5a1ebbd 100644 --- a/Source/Assets/TouchScript/Examples/Camera/Camera.unity +++ b/Source/Assets/TouchScript/Examples/Camera/Camera.unity @@ -496,6 +496,10 @@ Prefab: propertyPath: m_Enabled value: 1 objectReference: {fileID: 0} + - target: {fileID: 100002, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} m_RemovedComponents: [] m_ParentPrefab: {fileID: 100100000, guid: 1c4dd8a13f501b04f84fe824120f70bb, type: 2} m_IsPrefabParent: 0 diff --git a/Source/Assets/TouchScript/Examples/Multiuser/Multiuser.unity b/Source/Assets/TouchScript/Examples/Multiuser/Multiuser.unity index 861367bcb..be61f342d 100644 --- a/Source/Assets/TouchScript/Examples/Multiuser/Multiuser.unity +++ b/Source/Assets/TouchScript/Examples/Multiuser/Multiuser.unity @@ -1377,6 +1377,12 @@ MonoBehaviour: 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 &723351976 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3620,6 +3626,12 @@ MonoBehaviour: 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 &2041906759 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/Source/Assets/TouchScript/Examples/Portal/Portal.unity b/Source/Assets/TouchScript/Examples/Portal/Portal.unity index 7ad39d616..e2096f8ba 100644 --- a/Source/Assets/TouchScript/Examples/Portal/Portal.unity +++ b/Source/Assets/TouchScript/Examples/Portal/Portal.unity @@ -357,6 +357,12 @@ MonoBehaviour: 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 @@ -535,7 +541,6 @@ GameObject: - 224: {fileID: 740851132} - 223: {fileID: 740851135} - 114: {fileID: 740851134} - - 114: {fileID: 740851133} m_Layer: 5 m_Name: Canvas m_TagString: Untagged @@ -563,22 +568,6 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0, y: 0} ---- !u!114 &740851133 -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: 1301386320, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 --- !u!114 &740851134 MonoBehaviour: m_ObjectHideFlags: 0 @@ -790,6 +779,12 @@ MonoBehaviour: 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 &851559566 MonoBehaviour: m_ObjectHideFlags: 0 @@ -997,6 +992,12 @@ MonoBehaviour: 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 &893756812 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1322,6 +1323,12 @@ MonoBehaviour: 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 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/Source/Assets/TouchScript/Examples/Taps/Taps.unity b/Source/Assets/TouchScript/Examples/Taps/Taps.unity index ff12183aa..9e8ec5d49 100644 --- a/Source/Assets/TouchScript/Examples/Taps/Taps.unity +++ b/Source/Assets/TouchScript/Examples/Taps/Taps.unity @@ -605,7 +605,6 @@ GameObject: - 224: {fileID: 740851132} - 223: {fileID: 740851135} - 114: {fileID: 740851134} - - 114: {fileID: 740851133} m_Layer: 5 m_Name: Canvas m_TagString: Untagged @@ -633,22 +632,6 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0, y: 0} ---- !u!114 &740851133 -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: 1301386320, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 --- !u!114 &740851134 MonoBehaviour: m_ObjectHideFlags: 0 From 9d83418bd2ad6a96d37a036e4ed8df8adf52c26b Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Thu, 3 Nov 2016 04:44:24 +0300 Subject: [PATCH 123/211] Examples scene asks to add all examples to Build Settings. Examples list closes when an example is chosen. --- .../ProjectSettings/GraphicsSettings.asset | 7 +- .../ProjectSettings/ProjectSettings.asset | 72 +++++--------- AssetStore/ProjectSettings/ProjectVersion.txt | 2 +- .../Examples/Camera/Camera.unity.meta | 2 +- .../Examples/Checkers/Checkers.unity.meta | 2 +- .../TouchScript/Examples/Examples.unity | 99 +++++++++++++++++++ .../TouchScript/Examples/Examples.unity.meta | 2 +- .../Examples/Photos/Photos.unity.meta | 2 +- .../TouchScript/Examples/Taps/Taps.unity.meta | 2 +- .../Examples/_misc/Scripts/Runner.cs | 26 ++++- .../ProjectSettings/EditorBuildSettings.asset | 12 +-- Source/ProjectSettings/GraphicsSettings.asset | 7 +- Source/ProjectSettings/QualitySettings.asset | 20 ++-- 13 files changed, 179 insertions(+), 76 deletions(-) diff --git a/AssetStore/ProjectSettings/GraphicsSettings.asset b/AssetStore/ProjectSettings/GraphicsSettings.asset index 151b43f77..5a96ca8a8 100644 --- a/AssetStore/ProjectSettings/GraphicsSettings.asset +++ b/AssetStore/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/AssetStore/ProjectSettings/ProjectSettings.asset b/AssetStore/ProjectSettings/ProjectSettings.asset index f14d972e5..415b20e55 100644 --- a/AssetStore/ProjectSettings/ProjectSettings.asset +++ b/AssetStore/ProjectSettings/ProjectSettings.asset @@ -3,11 +3,10 @@ --- !u!129 &1 PlayerSettings: m_ObjectHideFlags: 0 - serializedVersion: 7 + serializedVersion: 8 AndroidProfiler: 0 defaultScreenOrientation: 0 targetDevice: 2 - targetResolution: 0 useOnDemandResources: 0 accelerometerFrequency: 60 companyName: Valentin Simonov @@ -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: 22 + tvOSSdkVersion: 0 + tvOSTargetOSVersion: 900 uIPrerenderedIcon: 0 uIRequiresPersistentWiFi: 0 + uIRequiresFullScreen: 1 uIStatusBarHidden: 1 uIExitOnSuspend: 0 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,14 +343,11 @@ PlayerSettings: psp2UseLibLocation: 0 psp2InfoBarOnStartup: 0 psp2InfoBarColor: 0 + psp2UseDebugIl2cppLibs: 0 psmSplashimage: {fileID: 0} spritePackerPolicy: scriptingDefineSymbols: {} metroPackageName: _Packages - metroPackageLogo: - metroPackageLogo140: - metroPackageLogo180: - metroPackageLogo240: metroPackageVersion: metroCertificatePath: metroCertificatePassword: @@ -335,44 +355,7 @@ PlayerSettings: metroCertificateIssuer: metroCertificateNotAfter: 0000000000000000 metroApplicationDescription: _Packages - 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: 1 @@ -480,7 +463,6 @@ PlayerSettings: WebGL::emscriptenArgs: WebGL::template: APPLICATION:Default additionalIl2CppArgs::additionalIl2CppArgs: - firstStreamedSceneWithResources: 0 cloudProjectId: projectName: organizationId: diff --git a/AssetStore/ProjectSettings/ProjectVersion.txt b/AssetStore/ProjectSettings/ProjectVersion.txt index b11ab9b5b..d4ad3ce51 100644 --- a/AssetStore/ProjectSettings/ProjectVersion.txt +++ b/AssetStore/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 5.2.2f1 +m_EditorVersion: 5.3.6f1 m_StandardAssetsVersion: 0 diff --git a/Source/Assets/TouchScript/Examples/Camera/Camera.unity.meta b/Source/Assets/TouchScript/Examples/Camera/Camera.unity.meta index 4f208254b..b080cc30d 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: + userData: "2" diff --git a/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity.meta b/Source/Assets/TouchScript/Examples/Checkers/Checkers.unity.meta index 99adb06c4..35dcd603c 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: + userData: "4" diff --git a/Source/Assets/TouchScript/Examples/Examples.unity b/Source/Assets/TouchScript/Examples/Examples.unity index 9b15c83bb..f6e0f851d 100644 --- a/Source/Assets/TouchScript/Examples/Examples.unity +++ b/Source/Assets/TouchScript/Examples/Examples.unity @@ -639,6 +639,17 @@ MonoBehaviour: m_StringArgument: Camera 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 &201561629 @@ -1076,6 +1087,17 @@ MonoBehaviour: m_StringArgument: Taps 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 &341179475 @@ -1286,6 +1308,17 @@ MonoBehaviour: m_StringArgument: Checkers 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 &363049657 @@ -1481,6 +1514,17 @@ MonoBehaviour: m_StringArgument: Colors 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 &406504773 @@ -2832,6 +2876,17 @@ MonoBehaviour: m_StringArgument: Cube 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 &842217639 @@ -3201,6 +3256,17 @@ MonoBehaviour: m_StringArgument: Multiuser 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 &962873579 @@ -4096,6 +4162,17 @@ MonoBehaviour: m_StringArgument: Photos 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 &1361172029 @@ -5075,6 +5152,17 @@ MonoBehaviour: m_StringArgument: Portal 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 &1894139122 @@ -5353,6 +5441,17 @@ MonoBehaviour: m_StringArgument: RawInput 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 &2001542686 diff --git a/Source/Assets/TouchScript/Examples/Examples.unity.meta b/Source/Assets/TouchScript/Examples/Examples.unity.meta index 130d3c1ca..806ba1109 100644 --- a/Source/Assets/TouchScript/Examples/Examples.unity.meta +++ b/Source/Assets/TouchScript/Examples/Examples.unity.meta @@ -1,4 +1,4 @@ fileFormatVersion: 2 guid: 7cba6bf72365a4167930fec2f6f39b74 DefaultImporter: - userData: + userData: "0" diff --git a/Source/Assets/TouchScript/Examples/Photos/Photos.unity.meta b/Source/Assets/TouchScript/Examples/Photos/Photos.unity.meta index 0f6f22bfa..161e2ebac 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: + userData: "3" diff --git a/Source/Assets/TouchScript/Examples/Taps/Taps.unity.meta b/Source/Assets/TouchScript/Examples/Taps/Taps.unity.meta index 5df313c60..435cfb1ed 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: + userData: "1" diff --git a/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs b/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs index 9ee4920a2..f4bc81d04 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs +++ b/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs @@ -6,6 +6,10 @@ using TouchScript.Layers; using System.Collections; +#if UNITY_EDITOR +using UnityEditor; +using System; +#endif #if UNITY_5_3_OR_NEWER using UnityEngine.SceneManagement; @@ -52,7 +56,7 @@ public void LoadPreviousLevel() #endif } - private void Start() + private void Start() { if (instance == null) { @@ -62,6 +66,26 @@ private void Start() 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"); + } + } +#endif + #if UNITY_5_3_OR_NEWER if (SceneManager.GetActiveScene().name == "Examples" && SceneManager.sceneCountInBuildSettings > 1) #else diff --git a/Source/ProjectSettings/EditorBuildSettings.asset b/Source/ProjectSettings/EditorBuildSettings.asset index 008f9cfe3..bad151e91 100644 --- a/Source/ProjectSettings/EditorBuildSettings.asset +++ b/Source/ProjectSettings/EditorBuildSettings.asset @@ -11,17 +11,17 @@ EditorBuildSettings: path: Assets/TouchScript/Examples/Taps/Taps.unity - enabled: 1 path: Assets/TouchScript/Examples/Camera/Camera.unity - - enabled: 1 - path: Assets/TouchScript/Examples/Checkers/Checkers.unity - enabled: 1 path: Assets/TouchScript/Examples/Photos/Photos.unity - enabled: 1 - path: Assets/TouchScript/Examples/Multiuser/Multiuser.unity - - enabled: 1 - path: Assets/TouchScript/Examples/Cube/Cube.unity + path: Assets/TouchScript/Examples/Checkers/Checkers.unity - enabled: 1 path: Assets/TouchScript/Examples/Portal/Portal.unity + - enabled: 1 + path: Assets/TouchScript/Examples/RawInput/RawInput.unity - enabled: 1 path: Assets/TouchScript/Examples/Colors/Colors.unity - enabled: 1 - path: Assets/TouchScript/Examples/RawInput/RawInput.unity + path: Assets/TouchScript/Examples/Cube/Cube.unity + - enabled: 1 + path: Assets/TouchScript/Examples/Multiuser/Multiuser.unity 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/QualitySettings.asset b/Source/ProjectSettings/QualitySettings.asset index 189338d6c..683fb13ed 100644 --- a/Source/ProjectSettings/QualitySettings.asset +++ b/Source/ProjectSettings/QualitySettings.asset @@ -15,8 +15,8 @@ QualitySettings: shadowCascades: 1 shadowDistance: 50 shadowNearPlaneOffset: 2 - shadowCascade2Split: .333333343 - shadowCascade4Split: {x: .0666666701, y: .200000003, z: .466666669} + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} blendWeights: 1 textureQuality: 0 anisotropicTextures: 1 @@ -26,18 +26,10 @@ QualitySettings: realtimeReflectionProbes: 0 billboardsFaceCameraPosition: 0 vSyncCount: 0 - lodBias: .300000012 + lodBias: 0.3 maximumLODLevel: 0 particleRaycastBudget: 4 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 4 excludedTargetPlatforms: [] - m_PerPlatformDefaultQuality: - Android: 0 - BlackBerry: 0 - Samsung TV: 0 - Standalone: 0 - Tizen: 0 - WP8: 0 - Web: 0 - WebGL: 0 - Windows Store Apps: 0 - iPhone: 0 + m_PerPlatformDefaultQuality: {} From 24094d372fb5363656ad384c368b620512121076 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Thu, 3 Nov 2016 04:49:36 +0300 Subject: [PATCH 124/211] Stuff. --- .../ProjectSettings/ClusterInputManager.asset | 6 ++++++ .../ProjectSettings/UnityAnalyticsManager.asset | 10 ---------- .../ProjectSettings/UnityConnectSettings.asset | 14 ++++++++++++++ 3 files changed, 20 insertions(+), 10 deletions(-) create mode 100644 AssetStore/ProjectSettings/ClusterInputManager.asset delete mode 100644 AssetStore/ProjectSettings/UnityAnalyticsManager.asset create mode 100644 AssetStore/ProjectSettings/UnityConnectSettings.asset diff --git a/AssetStore/ProjectSettings/ClusterInputManager.asset b/AssetStore/ProjectSettings/ClusterInputManager.asset new file mode 100644 index 000000000..e7886b266 --- /dev/null +++ b/AssetStore/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/AssetStore/ProjectSettings/UnityAnalyticsManager.asset b/AssetStore/ProjectSettings/UnityAnalyticsManager.asset deleted file mode 100644 index 4a7b66883..000000000 --- a/AssetStore/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/AssetStore/ProjectSettings/UnityConnectSettings.asset b/AssetStore/ProjectSettings/UnityConnectSettings.asset new file mode 100644 index 000000000..9b7a57834 --- /dev/null +++ b/AssetStore/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 7997d46f4718a5545244070f406147f2a3c64192 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Thu, 3 Nov 2016 04:54:19 +0300 Subject: [PATCH 125/211] 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 daee88353..21c389082 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManager.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManager.cs @@ -142,7 +142,7 @@ public enum MessageName /// /// TouchScript version. /// - public static readonly Version VERSION = new Version(8, 1); + public static readonly Version VERSION = new Version(9, 0); #endregion From 8b8c7b489669bc68dc664d7e37ea6db3f91cbde3 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Thu, 3 Nov 2016 05:57:17 +0300 Subject: [PATCH 126/211] Added TOUCHSCRIPT_TUIO define which enables TUIO support. --- .../Modules/TUIO/Editor/InputSources/TuioInputEditor.cs | 7 ++++++- .../Modules/TUIO/Scripts/InputSources/TuioInput.cs | 4 +++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Source/Assets/TouchScript/Modules/TUIO/Editor/InputSources/TuioInputEditor.cs b/Source/Assets/TouchScript/Modules/TUIO/Editor/InputSources/TuioInputEditor.cs index 107a117ee..e2fcc9e46 100644 --- a/Source/Assets/TouchScript/Modules/TUIO/Editor/InputSources/TuioInputEditor.cs +++ b/Source/Assets/TouchScript/Modules/TUIO/Editor/InputSources/TuioInputEditor.cs @@ -1,6 +1,10 @@ +/* + * @author Valentin Simonov / http://va.lent.in/ + */ + +#if TOUCHSCRIPT_TUIO using TouchScript.InputSources; using UnityEditor; -using UnityEditorInternal; using UnityEngine; namespace TouchScript.Editor.InputSources @@ -46,3 +50,4 @@ public override void OnInspectorGUI() } } } +#endif \ No newline at end of file diff --git a/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs b/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs index 3b4df7074..780f02620 100644 --- a/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs +++ b/Source/Assets/TouchScript/Modules/TUIO/Scripts/InputSources/TuioInput.cs @@ -2,6 +2,7 @@ * @author Valentin Simonov / http://va.lent.in/ */ +#if TOUCHSCRIPT_TUIO #if UNITY_EDITOR || UNITY_STANDALONE || UNITY_IOS || UNITY_ANDROID using System; using System.Collections.Generic; @@ -495,4 +496,5 @@ private void OnObjectRemoved(object sender, TuioObjectEventArgs e) } -#endif \ No newline at end of file +#endif + #endif \ No newline at end of file From bf651e3c289d39a00a484f08c21878f910c882ea Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Thu, 3 Nov 2016 07:18:24 +0300 Subject: [PATCH 127/211] Added some docs. --- Source/Assets/TouchScript/Scripts/GestureManager.cs | 6 ++++++ .../Assets/TouchScript/Scripts/Gestures/PressGesture.cs | 9 +++++++-- .../TouchScript/Scripts/Gestures/ReleaseGesture.cs | 4 ++-- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/GestureManager.cs b/Source/Assets/TouchScript/Scripts/GestureManager.cs index e1654ef65..eb0b62747 100644 --- a/Source/Assets/TouchScript/Scripts/GestureManager.cs +++ b/Source/Assets/TouchScript/Scripts/GestureManager.cs @@ -9,6 +9,12 @@ namespace TouchScript /// /// Facade for current instance of . /// + /// + /// 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 + /// + /// public sealed class GestureManager : MonoBehaviour { #region Public properties diff --git a/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs index 7ec5d1288..d6f853ff7 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs @@ -12,9 +12,14 @@ namespace TouchScript.Gestures { /// - /// Recognizes when an object is touched. - /// Works with any gesture unless a Delegate is set. + /// Recognizes when an object is touched. Works with any gesture unless a Delegate is set. /// + /// + /// PressGesture fires immediately and would ultimately kill every other non-friendly gesture. So one would have to manually make it friendly with everything in a general use-case. That's why it's made friendly with everyone by default. + /// But there are cases when one would like to determine if parent container was pressed or its child. In current implementation both PressGestures will fire. + /// One approach would be to somehow make parent's PressGesture not friendly with child's one. But looking at how gesture recognition works we can see that this won't work. Since we would like child's gesture to fail parent's gesture. When child's PressGesture is recognized the system asks it if it can prevent parent's gesture, and it obviously can't because it's friendly with everything. And it doesn't matter that parent's gesture can be prevented by child's one... because child's one can't prevent parent's gesture and this is asked first. + /// This is basically what is for. It makes parent's PressGesture only listen for TouchPoints which lend directly on it. + /// [AddComponentMenu("TouchScript/Gestures/Press Gesture")] [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Gestures_PressGesture.htm")] public class PressGesture : Gesture diff --git a/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs index ddd37682d..b363a7c13 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs @@ -12,9 +12,9 @@ namespace TouchScript.Gestures { /// - /// Recognizes when last pointer is released from target. - /// Works with any gesture unless a Delegate is set. + /// Recognizes when last pointer is released from target. Works with any gesture unless a Delegate is set. /// + /// [AddComponentMenu("TouchScript/Gestures/Release Gesture")] [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Gestures_ReleaseGesture.htm")] public class ReleaseGesture : Gesture From 27b37dcaaeed7566d614fe52509e422e728f8964 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Thu, 3 Nov 2016 07:36:59 +0300 Subject: [PATCH 128/211] Fixed scene loading handlers and Web Player mentions for 5.4. --- .../Examples/_misc/Scripts/Runner.cs | 14 ++++++++++++-- .../Devices/Display/GenericDisplayDevice.cs | 4 +++- .../Scripts/TouchManagerInstance.cs | 19 ++++++++++++++++++- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs b/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs index f4bc81d04..78bec68aa 100644 --- a/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs +++ b/Source/Assets/TouchScript/Examples/_misc/Scripts/Runner.cs @@ -86,6 +86,10 @@ private void Start() } #endif +#if UNITY_5_4_OR_NEWER + SceneManager.sceneLoaded += sceneLoadedHandler; +#endif + #if UNITY_5_3_OR_NEWER if (SceneManager.GetActiveScene().name == "Examples" && SceneManager.sceneCountInBuildSettings > 1) #else @@ -100,13 +104,19 @@ private void Update() { if (Input.GetKeyDown(KeyCode.Escape)) Application.Quit(); } - +#if UNITY_5_4_OR_NEWER + private void sceneLoadedHandler(Scene scene, LoadSceneMode mode) + { + StartCoroutine(resetUILayer()); + } +#else private void OnLevelWasLoaded(int num) { StartCoroutine(resetUILayer()); } +#endif - private IEnumerator resetUILayer() + private IEnumerator resetUILayer() { yield return new WaitForEndOfFrame(); TouchManager.Instance.AddLayer(layer, 0); diff --git a/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs b/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs index 733f28f7e..a0d1e9c46 100644 --- a/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs +++ b/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs @@ -46,10 +46,12 @@ protected override void OnEnable() case RuntimePlatform.OSXEditor: case RuntimePlatform.OSXDashboardPlayer: case RuntimePlatform.OSXPlayer: +#if !UNITY_5_4_OR_NEWER + case RuntimePlatform.WindowsWebPlayer: case RuntimePlatform.OSXWebPlayer: +#endif case RuntimePlatform.WindowsEditor: case RuntimePlatform.WindowsPlayer: - case RuntimePlatform.WindowsWebPlayer: case RuntimePlatform.LinuxPlayer: { var width = Mathf.Max(Screen.currentResolution.width, Screen.currentResolution.height); diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs index 61660dad4..e2a483aa9 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs @@ -11,10 +11,15 @@ using TouchScript.Layers; using TouchScript.Utils; using TouchScript.Pointers; +using UnityEngine; + #if TOUCHSCRIPT_DEBUG using TouchScript.Utils.DebugUtils; #endif -using UnityEngine; + +#if UNITY_5_4_OR_NEWER +using UnityEngine.SceneManagement; +#endif namespace TouchScript { @@ -551,6 +556,10 @@ private void Awake() return; } +#if UNITY_5_4_OR_NEWER + SceneManager.sceneLoaded += sceneLoadedHandler; +#endif + gameObject.hideFlags = HideFlags.HideInHierarchy; DontDestroyOnLoad(gameObject); @@ -563,11 +572,19 @@ private void Awake() intListPool.WarmUp(3); } +#if UNITY_5_4_OR_NEWER + private void sceneLoadedHandler(Scene scene, LoadSceneMode mode) + { + StopAllCoroutines(); + StartCoroutine(lateAwake()); + } +#else private void OnLevelWasLoaded(int value) { StopAllCoroutines(); StartCoroutine(lateAwake()); } +#endif private IEnumerator lateAwake() { From 90c04eeaebc068ee5b9344afa97aa1d86f4d5d79 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sat, 5 Nov 2016 04:48:45 +0300 Subject: [PATCH 129/211] Moved Pointer Hit.prefab to a subfolder. --- .../TouchScript/Prefabs/Pointer Visualizer.meta | 9 +++++++++ .../{ => Pointer Visualizer}/Pointer Hit.prefab | 15 +++++++++------ .../Pointer Hit.prefab.meta | 0 3 files changed, 18 insertions(+), 6 deletions(-) create mode 100644 Source/Assets/TouchScript/Prefabs/Pointer Visualizer.meta rename Source/Assets/TouchScript/Prefabs/{ => Pointer Visualizer}/Pointer Hit.prefab (93%) rename Source/Assets/TouchScript/Prefabs/{ => Pointer Visualizer}/Pointer Hit.prefab.meta (100%) diff --git a/Source/Assets/TouchScript/Prefabs/Pointer Visualizer.meta b/Source/Assets/TouchScript/Prefabs/Pointer Visualizer.meta new file mode 100644 index 000000000..fbd865c7c --- /dev/null +++ b/Source/Assets/TouchScript/Prefabs/Pointer Visualizer.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: af9d07bfec60f4f0a9e09613cb47f394 +folderAsset: yes +timeCreated: 1478310493 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Prefabs/Pointer Hit.prefab b/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pointer Hit.prefab similarity index 93% rename from Source/Assets/TouchScript/Prefabs/Pointer Hit.prefab rename to Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pointer Hit.prefab index 4522d7116..5b8bb08ae 100644 --- a/Source/Assets/TouchScript/Prefabs/Pointer Hit.prefab +++ b/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pointer Hit.prefab @@ -48,7 +48,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: .00392156886, g: .996078491, b: .996078491, a: 1} + m_Color: {r: 0.003921569, g: 0.9960785, b: 0.9960785, a: 1} m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: @@ -63,6 +63,7 @@ MonoBehaviour: m_MinSize: 10 m_MaxSize: 40 m_Alignment: 3 + m_AlignByGeometry: 0 m_RichText: 0 m_HorizontalOverflow: 1 m_VerticalOverflow: 0 @@ -81,7 +82,7 @@ MonoBehaviour: m_Script: {fileID: -900027084, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} m_Name: m_EditorClassIdentifier: - m_EffectColor: {r: 0, g: 0, b: 0, a: .541000009} + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.541} m_EffectDistance: {x: 1, y: -1} m_UseGraphicAlpha: 1 --- !u!114 &11454912 @@ -144,6 +145,7 @@ 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: 22498922} m_Father: {fileID: 0} @@ -152,7 +154,7 @@ RectTransform: m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 472, y: 378} m_SizeDelta: {x: 64, y: 64} - m_Pivot: {x: .5, y: .5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!224 &22498922 RectTransform: m_ObjectHideFlags: 1 @@ -162,14 +164,15 @@ 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_AnchorMin: {x: 1, y: .5} - m_AnchorMax: {x: 1, y: .5} + 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: .5} + m_Pivot: {x: 0, y: 0.5} --- !u!1001 &100100000 Prefab: m_ObjectHideFlags: 1 diff --git a/Source/Assets/TouchScript/Prefabs/Pointer Hit.prefab.meta b/Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pointer Hit.prefab.meta similarity index 100% rename from Source/Assets/TouchScript/Prefabs/Pointer Hit.prefab.meta rename to Source/Assets/TouchScript/Prefabs/Pointer Visualizer/Pointer Hit.prefab.meta From d63447f1a534ead0c51424022de64e42e9189c75 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sat, 5 Nov 2016 08:43:59 +0300 Subject: [PATCH 130/211] Settings Window. --- .../Assets/TouchScript/Editor/Resources.meta | 9 + .../Editor/Resources/SettingsWindow.meta | 9 + .../Resources/SettingsWindow/Header.png | Bin 0 -> 142294 bytes .../Resources/SettingsWindow/Header.png.meta | 58 ++++++ .../Editor/TouchScriptSettingsWindow.cs | 190 ++++++++++++++++++ .../Editor/TouchScriptSettingsWindow.cs.meta | 12 ++ .../TouchScript/Scripts/TouchManager.cs | 1 + 7 files changed, 279 insertions(+) create mode 100644 Source/Assets/TouchScript/Editor/Resources.meta create mode 100644 Source/Assets/TouchScript/Editor/Resources/SettingsWindow.meta create mode 100644 Source/Assets/TouchScript/Editor/Resources/SettingsWindow/Header.png create mode 100644 Source/Assets/TouchScript/Editor/Resources/SettingsWindow/Header.png.meta create mode 100644 Source/Assets/TouchScript/Editor/TouchScriptSettingsWindow.cs create mode 100644 Source/Assets/TouchScript/Editor/TouchScriptSettingsWindow.cs.meta diff --git a/Source/Assets/TouchScript/Editor/Resources.meta b/Source/Assets/TouchScript/Editor/Resources.meta new file mode 100644 index 000000000..290e2b4a0 --- /dev/null +++ b/Source/Assets/TouchScript/Editor/Resources.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: d6a9095b435fc49be88fbe81cebedfa0 +folderAsset: yes +timeCreated: 1478315757 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Editor/Resources/SettingsWindow.meta b/Source/Assets/TouchScript/Editor/Resources/SettingsWindow.meta new file mode 100644 index 000000000..e69e637c0 --- /dev/null +++ b/Source/Assets/TouchScript/Editor/Resources/SettingsWindow.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 7a59b8419df174664a1744ef6715d004 +folderAsset: yes +timeCreated: 1478315757 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Editor/Resources/SettingsWindow/Header.png b/Source/Assets/TouchScript/Editor/Resources/SettingsWindow/Header.png new file mode 100644 index 0000000000000000000000000000000000000000..6deee147070cd82c74b698ce157fbb50d813bb42 GIT binary patch literal 142294 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
    4j0;} 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

    +Z%1_n56*rZ|(T{KkP_n>rpn+gAhcU%D<2teq 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 fXBa{P enabledDefines = new Dictionary() + { + { DEFINE_DEBUG, false }, + { DEFINE_TUIO, false }, + }; + + [MenuItem("Window/TouchScript/Settings", false, 0)] + static void createWindow() + { + EditorWindow window = GetWindow(true, "TouchScript Settings", true); + window.maxSize = new Vector2(width, height); + window.minSize = new Vector2(width, height); + + window.Show(); + } + + static TouchScriptSettingsWindow() + { + showAtStartup = EditorPrefs.GetBool(SHOW_AT_STARTUP, true); + EditorApplication.update += doShow; + } + + private static void doShow() + { + EditorApplication.update -= doShow; + + 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(); + } + + 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 TUIOInput for working with TUIO protocol.", EditorStyles.miniLabel); + + EditorGUILayout.EndVertical(); + GUILayout.Space(10); + EditorGUILayout.EndHorizontal(); + + drawShowAtStartup(); + } + + private void init() + { + header = new GUIStyle(); + header.normal.background = (Texture2D)Resources.Load("SettingsWindow/Header"); + 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, 100, 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; + } + } +} diff --git a/Source/Assets/TouchScript/Editor/TouchScriptSettingsWindow.cs.meta b/Source/Assets/TouchScript/Editor/TouchScriptSettingsWindow.cs.meta new file mode 100644 index 000000000..aaad65d1c --- /dev/null +++ b/Source/Assets/TouchScript/Editor/TouchScriptSettingsWindow.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 7aae6ded351f04cd38bfb5b64a426541 +timeCreated: 1478312527 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Source/Assets/TouchScript/Scripts/TouchManager.cs b/Source/Assets/TouchScript/Scripts/TouchManager.cs index 21c389082..9ddeb9802 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManager.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManager.cs @@ -143,6 +143,7 @@ public enum MessageName /// TouchScript version. ///

public static readonly Version VERSION = new Version(9, 0); + public static readonly string VERSION_SUFFIX = "alpha"; #endregion From 845b3e91abf5fba70ba4f61d08ad9dff9615805c Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 6 Nov 2016 02:23:21 +0300 Subject: [PATCH 131/211] Fixed an issue with multi-finger gestures failing. --- .../Gestures/TransformGestures/Base/TransformGestureBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs index 133ca2996..ab8dd4970 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs @@ -264,7 +264,7 @@ protected override void pointersReleased(IList pointers) setState(GestureState.Ended); break; case GestureState.Possible: - setState(GestureState.Failed); + setState(GestureState.Idle); break; } } From 64a34b592e240f9bebe2a26e2c5628eb162a1d80 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 6 Nov 2016 05:07:58 +0300 Subject: [PATCH 132/211] Need more sleep. --- .../Scripts/Behaviors/Visualizer/PointerVisualizer.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs index b1cc12fc2..7297df0d3 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs @@ -194,7 +194,7 @@ private void PointersUpdatedHandler(object sender, PointerEventArgs e) { var pointer = e.Pointers[i]; PointerProxyBase proxy; - if (!proxies.TryGetValue(pointer.Id, out proxy)) return; + if (!proxies.TryGetValue(pointer.Id, out proxy)) continue; proxy.UpdatePointer(pointer); } } @@ -206,7 +206,7 @@ private void pointersReleasedHandler(object sender, PointerEventArgs e) { var pointer = e.Pointers[i]; PointerProxyBase proxy; - if (!proxies.TryGetValue(pointer.Id, out proxy)) return; + if (!proxies.TryGetValue(pointer.Id, out proxy)) continue; proxies.Remove(pointer.Id); pool.Release(proxy); } From 12f00a43dc6616e93eb83d7307598ae2d95e9dd2 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 6 Nov 2016 05:42:53 +0300 Subject: [PATCH 133/211] Mouse fake pointer now is created right when ALT+PRESS happens and not the next frame after ALT+RELEASE. The former method was triggering unnecessary taps and was interfering with other gestures. Now when ALT+PRESS happens, mouse pointer and fake pointer are moving together until ALT+RELEASE, after which fake pointer remains stationary. --- .../InputHandlers/MouseHandler.cs | 284 ++++++++++++------ 1 file changed, 189 insertions(+), 95 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs index 36ee39d06..730d40d46 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/MouseHandler.cs @@ -14,6 +14,33 @@ namespace TouchScript.InputSources.InputHandlers ///
public class MouseHandler : IInputSource, IDisposable { + #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 + } + + #endregion + #region Public properties /// @@ -48,10 +75,10 @@ public bool EmulateSecondMousePointer private PointerDelegate removePointer; private PointerDelegate cancelPointer; + private State state; private ObjectPool mousePool; private MousePointer mousePointer, fakeMousePointer; private Vector3 mousePointPos = Vector3.zero; - private DelayedFakePointer addFakePointer; #endregion @@ -75,9 +102,10 @@ public MouseHandler(PointerDelegate addPointer, PointerDelegate updatePointer, P mousePool = new ObjectPool(4, () => new MousePointer(this), null, (t) => t.INTERNAL_Reset()); - addFakePointer.ShouldAdd = false; mousePointPos = Input.mousePosition; - mousePointer = internalAddPointer(mousePointPos); + mousePointer = internalAddPointer(remapCoordinates(mousePointPos)); + + stateMouse(); } #region Public methods @@ -85,75 +113,86 @@ public MouseHandler(PointerDelegate addPointer, PointerDelegate updatePointer, P /// public void UpdateInput() { - if (addFakePointer.ShouldAdd) - { - addFakePointer.ShouldAdd = false; - fakeMousePointer = internalAddPointer(addFakePointer.Position, addFakePointer.Buttons, addFakePointer.Flags); - pressPointer(fakeMousePointer); - } - - if (fakeMousePointer != null - && !(Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt))) - { - releasePointer(fakeMousePointer); - removePointer(fakeMousePointer); - fakeMousePointer = null; - } - - var pos = Input.mousePosition; - if (mousePointPos != pos) - { - mousePointPos = pos; - mousePointer.Position = remapCoordinates(new Vector2(pos.x, pos.y)); - updatePointer(mousePointer); - } - - var scroll = Input.mouseScrollDelta; - mousePointer.ScrollDelta = scroll; - if (!Mathf.Approximately(scroll.sqrMagnitude, 0.0f)) - { - updatePointer(mousePointer); - } - - var buttons = mousePointer.Buttons; - var newButtons = getMouseButtons(); - - if (buttons == newButtons) return; // nothing new happened - - // pressed something - if (buttons == 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); - pressPointer(mousePointer); - internalReleaseMousePointer(newButtons); - } - // pressed this frame - else - { - mousePointer.Buttons = newButtons; - pressPointer(mousePointer); - } - } - // released or button state changed - else + 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); + } + + if (emulateSecondMousePointer) { - // released this frame - if ((newButtons & Pointer.PointerButtonState.AnyButtonPressed) == 0) - { - mousePointer.Buttons = newButtons; - internalReleaseMousePointer(newButtons); - } - // button state changed this frame - else - { - mousePointer.Buttons = newButtons; - updatePointer(mousePointer); - } - } + 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; } /// @@ -163,7 +202,7 @@ public bool CancelPointer(Pointer pointer, bool shouldReturn) { cancelPointer(mousePointer); if (shouldReturn) mousePointer = internalReturnPointer(mousePointer); - else mousePointer = internalAddPointer(mousePointPos); // can't totally cancell mouse pointer + else mousePointer = internalAddPointer(mousePointer.Position); // can't totally cancel mouse pointer return true; } if (pointer.Equals(fakeMousePointer)) @@ -227,27 +266,62 @@ private Pointer.PointerButtonState getMouseButtons() return buttons; } - private void tryAddFakePointer(Pointer.PointerButtonState newButtons) - { - if (emulateSecondMousePointer - && (Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt)) - && fakeMousePointer == null) + private void updateButtons(Pointer.PointerButtonState oldButtons, Pointer.PointerButtonState newButtons) + { + // pressed something + if (oldButtons == Pointer.PointerButtonState.Nothing) { - var up = (uint)(newButtons & Pointer.PointerButtonState.AnyButtonUp); - addFakePointer.ShouldAdd = true; - addFakePointer.Flags = mousePointer.Flags | Pointer.FLAG_ARTIFICIAL; - addFakePointer.Buttons = newButtons - & ~Pointer.PointerButtonState.AnyButtonUp // remove up state from fake pointer - | (Pointer.PointerButtonState)(up >> 1) // Add down state from pressed buttons - | (Pointer.PointerButtonState)(up >> 2); // Add pressed state from pressed buttons - addFakePointer.Position = mousePointPos; + // 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); + pressPointer(mousePointer); + internalReleaseMousePointer(newButtons); + } + // pressed this frame + else + { + mousePointer.Buttons = newButtons; + pressPointer(mousePointer); + } } - } + // released or button state changed + else + { + // released this frame + if ((newButtons & Pointer.PointerButtonState.AnyButtonPressed) == 0) + { + mousePointer.Buttons = newButtons; + internalReleaseMousePointer(newButtons); + } + // button state changed this frame + else + { + mousePointer.Buttons = newButtons; + 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 MousePointer internalAddPointer(Vector2 position, Pointer.PointerButtonState buttons = Pointer.PointerButtonState.Nothing, uint flags = 0) { var pointer = mousePool.Get(); - pointer.Position = remapCoordinates(position); + pointer.Position = position; pointer.Buttons |= buttons; pointer.Flags |= flags; addPointer(pointer); @@ -258,7 +332,6 @@ private void internalReleaseMousePointer(Pointer.PointerButtonState buttons) { mousePointer.Flags &= ~Pointer.FLAG_RETURNED; releasePointer(mousePointer); - tryAddFakePointer(buttons); } private MousePointer internalReturnPointer(MousePointer pointer) @@ -284,13 +357,34 @@ private Vector2 remapCoordinates(Vector2 position) #endregion - private struct DelayedFakePointer - { - public bool ShouldAdd; - public uint Flags; - public Pointer.PointerButtonState Buttons; - public Vector2 Position; - } + #region State logic + + private void stateMouse() + { + setState(State.Mouse); + } + + private void stateWaitingForFake() + { + setState(State.WaitingForFake); + } + + private void stateMouseAndFake() + { + setState(State.MouseAndFake); + } + + private void stateStationaryFake() + { + setState(State.StationaryFake); + } + + private void setState(State newState) + { + state = newState; + } + + #endregion } } \ No newline at end of file From 87459e5e007660e66995febf6dbfb737f77afa68 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 6 Nov 2016 05:50:56 +0300 Subject: [PATCH 134/211] Fixed TapGesture erroneously triggering because of a redispatched touch from 2+ point gestures. --- .../TouchScript/Scripts/Gestures/TapGesture.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs index 4dc374081..088744ac7 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs @@ -112,6 +112,19 @@ public float DistanceLimit #endregion + #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; + } + + #endregion + #region Unity methods /// From 9032e372a3f91e2aa79b9dcf2fedcbfab4d56bd5 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 6 Nov 2016 06:13:17 +0300 Subject: [PATCH 135/211] Fixed layer initialization order. Giving one more frame before we create a StandardLayer if no layers present. --- Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs index e2a483aa9..bf6969af7 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManagerInstance.cs @@ -588,7 +588,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 yield return null; + yield return null; updateLayers(); createCameraLayer(); From aad43ba7b03faabe311495f58e5197669217aeb3 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 6 Nov 2016 07:09:32 +0300 Subject: [PATCH 136/211] Returned Touch Manager to TouchScript menu. --- 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 9ddeb9802..85d7f5fa3 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManager.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManager.cs @@ -20,7 +20,7 @@ namespace TouchScript /// An instance of may be added to a Unity scene to hold (i.e. serialize them to the scene) parameters needed to configure an instance of used in application. Which can be accessed via static property. /// Though it's not required it is a convenient way to configure TouchScript for your scene. You can use different configuration options for different scenes. /// - [AddComponentMenu("TouchScript/Pointer Manager")] + [AddComponentMenu("TouchScript/Touch Manager")] [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_TouchManager.htm")] public sealed class TouchManager : DebuggableMonoBehaviour { From cf5d65799ffcea1834455c4751cf13ef9bb9793a Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sun, 6 Nov 2016 07:25:21 +0300 Subject: [PATCH 137/211] Moved editor textures out of Resources folders. --- .../Editor/{Resources.meta => Textures.meta} | 0 .../SettingsWindow/TouchScript_SW_Header.png | Bin 0 -> 142294 bytes .../TouchScript_SW_Header.png.meta | 58 ++++++++++++++++++ .../Editor/TouchScriptSettingsWindow.cs | 6 +- 4 files changed, 63 insertions(+), 1 deletion(-) rename Source/Assets/TouchScript/Editor/{Resources.meta => Textures.meta} (100%) create mode 100644 Source/Assets/TouchScript/Editor/Textures/SettingsWindow/TouchScript_SW_Header.png create mode 100644 Source/Assets/TouchScript/Editor/Textures/SettingsWindow/TouchScript_SW_Header.png.meta diff --git a/Source/Assets/TouchScript/Editor/Resources.meta b/Source/Assets/TouchScript/Editor/Textures.meta similarity index 100% rename from Source/Assets/TouchScript/Editor/Resources.meta rename to Source/Assets/TouchScript/Editor/Textures.meta diff --git a/Source/Assets/TouchScript/Editor/Textures/SettingsWindow/TouchScript_SW_Header.png b/Source/Assets/TouchScript/Editor/Textures/SettingsWindow/TouchScript_SW_Header.png new file mode 100644 index 0000000000000000000000000000000000000000..6deee147070cd82c74b698ce157fbb50d813bb42 GIT binary patch literal 142294 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
protected Transform cachedTransform; - [SerializeField] - private bool advancedProps; // is used to save if advanced properties are opened or closed + [SerializeField] + private bool generalProps; // Used in the custom inspector + + [SerializeField] + private bool limitsProps; // Used in the custom inspector + + [SerializeField] + private bool advancedProps; // Used in the custom inspector [SerializeField] private int minPointers = 0; @@ -454,8 +492,15 @@ protected IGestureManager gestureManager [SerializeField] private GameObject sendMessageTarget; + [SerializeField] + private bool useUnityEvents = false; + + [SerializeField] + [ToggleLeft] + private bool sendStateChangeEvents = false; + [SerializeField] - [NullToggle] + [NullToggle] private Gesture requireGestureToFail; [SerializeField] diff --git a/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs index 2c5ead716..ef9e6fced 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/LongPressGesture.cs @@ -42,6 +42,8 @@ public event EventHandler LongPressed // Needed to overcome iOS AOT limitations private EventHandler longPressedInvoker; + public GestureEvent OnLongPress = new GestureEvent(); + #endregion #region Public properties @@ -147,6 +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); } /// diff --git a/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs index d6f853ff7..0cd866a1d 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/PressGesture.cs @@ -47,6 +47,8 @@ public event EventHandler Pressed // Needed to overcome iOS AOT limitations private EventHandler pressedInvoker; + public GestureEvent OnPress = new GestureEvent(); + #endregion #region Public properties @@ -121,6 +123,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); } #endregion diff --git a/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs index b363a7c13..6271252d7 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/ReleaseGesture.cs @@ -42,6 +42,8 @@ public event EventHandler Released // Needed to overcome iOS AOT limitations private EventHandler releasedInvoker; + public GestureEvent OnRelease = new GestureEvent(); + #endregion #region Public properties @@ -123,6 +125,7 @@ protected override void onRecognized() base.onRecognized(); if (releasedInvoker != null) releasedInvoker.InvokeHandleExceptions(this, EventArgs.Empty); if (UseSendMessage && SendMessageTarget != null) SendMessageTarget.SendMessage(RELEASE_MESSAGE, this, SendMessageOptions.DontRequireReceiver); + if (UseUnityEvents) OnRelease.Invoke(this); } #endregion diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs index 088744ac7..e1709c166 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TapGesture.cs @@ -42,6 +42,8 @@ public event EventHandler Tapped // Needed to overcome iOS AOT limitations private EventHandler tappedInvoker; + public GestureEvent OnTap = new GestureEvent(); + #endregion #region Public properties @@ -237,6 +239,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); } /// diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs index ab8dd4970..5538a5513 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/Base/TransformGestureBase.cs @@ -67,6 +67,10 @@ public event EventHandler TransformCompleted // Needed to overcome iOS AOT limitations private EventHandler transformStartedInvoker, transformedInvoker, transformCompletedInvoker; + public GestureEvent OnTransformStart = new GestureEvent(); + public GestureEvent OnTransform = new GestureEvent(); + public GestureEvent OnTransformComplete = new GestureEvent(); + #endregion #region Public properties @@ -276,9 +280,8 @@ protected override void onBegan() base.onBegan(); if (transformStartedInvoker != null) transformStartedInvoker.InvokeHandleExceptions(this, EventArgs.Empty); if (UseSendMessage && SendMessageTarget != null) - { SendMessageTarget.SendMessage(TRANSFORM_START_MESSAGE, this, SendMessageOptions.DontRequireReceiver); - } + if (UseUnityEvents) OnTransformStart.Invoke(this); } /// @@ -291,6 +294,7 @@ protected override void onChanged() if (transformedInvoker != null) transformedInvoker.InvokeHandleExceptions(this, EventArgs.Empty); if (UseSendMessage && SendMessageTarget != null) SendMessageTarget.SendMessage(TRANSFORM_MESSAGE, this, SendMessageOptions.DontRequireReceiver); + if (UseUnityEvents) OnTransform.Invoke(this); } /// @@ -302,6 +306,7 @@ protected override void onRecognized() transformCompletedInvoker.InvokeHandleExceptions(this, EventArgs.Empty); if (UseSendMessage && SendMessageTarget != null) SendMessageTarget.SendMessage(TRANSFORM_COMPLETE_MESSAGE, this, SendMessageOptions.DontRequireReceiver); + if (UseUnityEvents) OnTransformComplete.Invoke(this); } /// diff --git a/Source/Assets/TouchScript/Scripts/TouchManager.cs b/Source/Assets/TouchScript/Scripts/TouchManager.cs index 1bc7556e0..b762726d6 100644 --- a/Source/Assets/TouchScript/Scripts/TouchManager.cs +++ b/Source/Assets/TouchScript/Scripts/TouchManager.cs @@ -34,10 +34,10 @@ public sealed class TouchManager : DebuggableMonoBehaviour #endif [Serializable] - public class PointerEvent : UnityEvent> { } + public class PointerEvent : UnityEvent> {} [Serializable] - public class FrameEvent : UnityEvent { } + public class FrameEvent : UnityEvent {} /// /// Values of a bit-mask representing which Unity messages an instance of will dispatch. @@ -94,42 +94,42 @@ public enum MessageName /// /// Pointer frame started. /// - OnPointerFrameStarted = MessageType.FrameStarted, + OnFrameStart = MessageType.FrameStarted, /// /// Pointer frame finished. /// - OnPointerFrameFinished = MessageType.FrameFinished, + OnFrameFinish = MessageType.FrameFinished, /// /// Some pointers were added during the frame. /// - OnPointersAdded = MessageType.PointersAdded, + OnPointersAdd = MessageType.PointersAdded, /// /// Some pointers have updated during the frame. /// - OnPointersUpdated = MessageType.PointersUpdated, + OnPointersUpdate = MessageType.PointersUpdated, /// /// Some pointers have touched the surface during the frame. /// - OnPointersPressed = MessageType.PointersPressed, + OnPointersPress = MessageType.PointersPressed, /// /// Some pointers were released during the frame. /// - OnPointersReleased = MessageType.PointersReleased, + OnPointersRelease = MessageType.PointersReleased, /// /// Some pointers were removed during the frame. /// - OnPointersRemoved = MessageType.PointersRemoved, + OnPointersRemove = MessageType.PointersRemoved, /// /// Some pointers were cancelled during the frame. /// - OnPointersCancelled = MessageType.PointersCancelled + OnPointersCancel = MessageType.PointersCancelled } /// @@ -155,6 +155,57 @@ public enum MessageName #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 /// @@ -273,53 +324,6 @@ public bool UseUnityEvents } } - /// - /// Occurs when a new frame is started before all other events. - /// - public FrameEvent FrameStarted = new FrameEvent(); - - /// - /// Occurs when a frame is finished. After all other events. - /// - [SerializeField] - public FrameEvent FrameFinished = new FrameEvent(); - - /// - /// Occurs when new hovering pointers are added. - /// - [SerializeField] - public PointerEvent PointersAdded = new PointerEvent(); - - /// - /// Occurs when pointers are updated. - /// - [SerializeField] - public PointerEvent PointersUpdated = new PointerEvent(); - - /// - /// Occurs when pointers touch the surface. - /// - [SerializeField] - public PointerEvent PointersPressed = new PointerEvent(); - - /// - /// Occurs when pointers are released. - /// - [SerializeField] - public PointerEvent PointersReleased = new PointerEvent(); - - /// - /// Occurs when pointers are removed from the system. - /// - [SerializeField] - public PointerEvent PointersRemoved = new PointerEvent(); - - /// - /// Occurs when pointers are cancelled. - /// - [SerializeField] - public PointerEvent PointersCancelled = new PointerEvent(); - #if TOUCHSCRIPT_DEBUG public override bool DebugMode @@ -458,49 +462,49 @@ private void removeSendMessageSubscriptions() private void pointersAddedSendMessageHandler(object sender, PointerEventArgs e) { - sendMessageTarget.SendMessage(MessageName.OnPointersAdded.ToString(), e.Pointers, + sendMessageTarget.SendMessage(MessageName.OnPointersAdd.ToString(), e.Pointers, SendMessageOptions.DontRequireReceiver); } private void pointersUpdatedSendMessageHandler(object sender, PointerEventArgs e) { - sendMessageTarget.SendMessage(MessageName.OnPointersUpdated.ToString(), e.Pointers, + sendMessageTarget.SendMessage(MessageName.OnPointersUpdate.ToString(), e.Pointers, SendMessageOptions.DontRequireReceiver); } private void pointersPressedSendMessageHandler(object sender, PointerEventArgs e) { - sendMessageTarget.SendMessage(MessageName.OnPointersPressed.ToString(), e.Pointers, + sendMessageTarget.SendMessage(MessageName.OnPointersPress.ToString(), e.Pointers, SendMessageOptions.DontRequireReceiver); } private void pointersReleasedSendMessageHandler(object sender, PointerEventArgs e) { - sendMessageTarget.SendMessage(MessageName.OnPointersReleased.ToString(), e.Pointers, + sendMessageTarget.SendMessage(MessageName.OnPointersRelease.ToString(), e.Pointers, SendMessageOptions.DontRequireReceiver); } private void pointersRemovedSendMessageHandler(object sender, PointerEventArgs e) { - sendMessageTarget.SendMessage(MessageName.OnPointersRemoved.ToString(), e.Pointers, + sendMessageTarget.SendMessage(MessageName.OnPointersRemove.ToString(), e.Pointers, SendMessageOptions.DontRequireReceiver); } private void pointersCancelledSendMessageHandler(object sender, PointerEventArgs e) { - sendMessageTarget.SendMessage(MessageName.OnPointersCancelled.ToString(), e.Pointers, + sendMessageTarget.SendMessage(MessageName.OnPointersCancel.ToString(), e.Pointers, SendMessageOptions.DontRequireReceiver); } private void frameStartedSendMessageHandler(object sender, EventArgs e) { - sendMessageTarget.SendMessage(MessageName.OnPointerFrameStarted.ToString(), + sendMessageTarget.SendMessage(MessageName.OnFrameStart.ToString(), SendMessageOptions.DontRequireReceiver); } private void frameFinishedSendMessageHandler(object sender, EventArgs e) { - sendMessageTarget.SendMessage(MessageName.OnPointerFrameFinished.ToString(), + sendMessageTarget.SendMessage(MessageName.OnFrameFinish.ToString(), SendMessageOptions.DontRequireReceiver); } @@ -540,42 +544,42 @@ private void removeUnityEventsSubscriptions() private void pointersAddedUnityEventsHandler(object sender, PointerEventArgs e) { - PointersAdded.Invoke(e.Pointers); + OnPointersAdd.Invoke(e.Pointers); } private void pointersUpdatedUnityEventsHandler(object sender, PointerEventArgs e) { - PointersUpdated.Invoke(e.Pointers); + OnPointersUpdate.Invoke(e.Pointers); } private void pointersPressedUnityEventsHandler(object sender, PointerEventArgs e) { - PointersPressed.Invoke(e.Pointers); + OnPointersPress.Invoke(e.Pointers); } private void pointersReleasedUnityEventsHandler(object sender, PointerEventArgs e) { - PointersReleased.Invoke(e.Pointers); + OnPointersRelease.Invoke(e.Pointers); } private void pointersRemovedUnityEventsHandler(object sender, PointerEventArgs e) { - PointersRemoved.Invoke(e.Pointers); + OnPointersRemove.Invoke(e.Pointers); } private void pointersCancelledUnityEventsHandler(object sender, PointerEventArgs e) { - PointersCancelled.Invoke(e.Pointers); + OnPointersCancel.Invoke(e.Pointers); } private void frameStartedUnityEventsHandler(object sender, EventArgs e) { - FrameStarted.Invoke(); + OnFrameStart.Invoke(); } private void frameFinishedUnityEventsHandler(object sender, EventArgs e) { - FrameFinished.Invoke(); + OnFrameFinish.Invoke(); } #endregion From bba4f34def81a3a6ea2dab1df9a78cf2232e08ed Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Thu, 8 Dec 2016 13:14:28 -0800 Subject: [PATCH 145/211] Refactored editor interface. --- .../Editor/Behaviors/TransformerEditor.cs | 58 +++++++++------- .../Visualizer/TouchVisualizerEditor.cs | 49 ++++++++++--- .../InputSources/StandardInputEditor.cs | 69 +++++++++++++------ .../Editor/Layers/StandardLayerEditor.cs | 62 +++++++++-------- .../Editor/TouchScriptSettingsWindow.cs | 4 +- .../TouchScript/Editor/Utils/GUIElements.cs | 31 ++------- .../Utils/PropertyDrawers/NullToggleDrawer.cs | 5 +- .../Behaviors/Visualizer/PointerVisualizer.cs | 6 ++ .../PinnedTransformGesture.cs | 3 + .../TransformGestures/TransformGesture.cs | 3 + .../Scripts/InputSources/StandardInput.cs | 6 ++ 11 files changed, 189 insertions(+), 107 deletions(-) diff --git a/Source/Assets/TouchScript/Editor/Behaviors/TransformerEditor.cs b/Source/Assets/TouchScript/Editor/Behaviors/TransformerEditor.cs index 2884ed6eb..a3df54b65 100644 --- a/Source/Assets/TouchScript/Editor/Behaviors/TransformerEditor.cs +++ b/Source/Assets/TouchScript/Editor/Behaviors/TransformerEditor.cs @@ -5,26 +5,27 @@ using TouchScript.Behaviors; using UnityEditor; using UnityEngine; +using System.Reflection; +using TouchScript.Editor.Utils; namespace TouchScript.Editor.Behaviors { [CustomEditor(typeof(Transformer), true)] internal class TransformerEditor : UnityEditor.Editor { - private static readonly GUIContent TEXT_ENABLE_SMOOTHING = new GUIContent("Smoothing", "Applies smoothing to transform actions. This allows to reduce jagged movements but adds some visual lag."); - private static readonly GUIContent TEXT_SMOOTHING_FACTOR = new GUIContent("Factor", "Indicates how much smoothing to apply. 0 - no smoothing, 10000 - maximum."); - private static readonly GUIContent TEXT_POSITION_THRESHOLD = new GUIContent("Position Threshold", "Minimum distance between target position and smoothed position when to stop automatic movement."); - private static readonly GUIContent TEXT_ROTATION_THRESHOLD = new GUIContent("Rotation Threshold", "Minimum angle between target rotation and smoothed rotation when to stop automatic movement."); - private static readonly GUIContent TEXT_SCALE_THRESHOLD = new GUIContent("Scale Threshold", "Minimum difference between target scale and smoothed scale when to stop automatic movement."); - private static readonly GUIContent TEXT_ALLOW_CHANGING = new GUIContent("Allow Changing From Outside", "Indicates if this transform can be changed from another script."); - - private SerializedProperty enableSmoothing; - private SerializedProperty smoothingFactor; - private SerializedProperty positionThreshold; - private SerializedProperty rotationThreshold; - private SerializedProperty scaleThreshold; - private SerializedProperty allowChangingFromOutside; - private Transformer instance; + 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."); + + private Transformer instance; + + private SerializedProperty enableSmoothing, allowChangingFromOutside; +// private SerializedProperty smoothingFactor, positionThreshold, rotationThreshold, scaleThreshold; + private PropertyInfo enableSmoothing_prop; protected virtual void OnEnable() { @@ -36,21 +37,32 @@ protected virtual void OnEnable() allowChangingFromOutside = serializedObject.FindProperty("allowChangingFromOutside"); instance = target as Transformer; + + var type = instance.GetType(); + enableSmoothing_prop = type.GetProperty("EnableSmoothing", BindingFlags.Instance | BindingFlags.Public); } public override void OnInspectorGUI() { serializedObject.UpdateIfDirtyOrScript(); - EditorGUILayout.PropertyField(enableSmoothing, TEXT_ENABLE_SMOOTHING); - if (enableSmoothing.boolValue) - { - instance.SmoothingFactor = EditorGUILayout.FloatField(TEXT_SMOOTHING_FACTOR, instance.SmoothingFactor); - 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); - } + 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--; + } serializedObject.ApplyModifiedProperties(); } diff --git a/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs b/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs index a341ad656..b57c59e1a 100644 --- a/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs +++ b/Source/Assets/TouchScript/Editor/Behaviors/Visualizer/TouchVisualizerEditor.cs @@ -5,6 +5,7 @@ using TouchScript.Behaviors.Visualizer; using UnityEditor; using UnityEngine; +using TouchScript.Editor.Utils; namespace TouchScript.Editor.Behaviors.Visualizer { @@ -13,7 +14,16 @@ 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 void OnEnable() { @@ -22,21 +32,44 @@ private void OnEnable() touchProxy = serializedObject.FindProperty("pointerProxy"); useDPI = serializedObject.FindProperty("useDPI"); touchSize = serializedObject.FindProperty("pointerSize"); + + generalProps = serializedObject.FindProperty("generalProps"); + advancedProps = serializedObject.FindProperty("advancedProps"); } public override void OnInspectorGUI() { serializedObject.Update(); - EditorGUILayout.PropertyField(touchProxy, new GUIContent("Pointer Proxy")); - EditorGUILayout.PropertyField(showTouchId, new GUIContent("Show Pointer Id")); - EditorGUILayout.PropertyField(showFlags, new GUIContent("Show Flags")); + 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); + if (display) + { + EditorGUI.indentLevel++; + using (new EditorGUI.DisabledGroupScope(!useDPI.boolValue)) + { + EditorGUILayout.PropertyField(touchSize, TEXT_POINTER_SIZE); + } + EditorGUI.indentLevel--; + } - EditorGUILayout.PropertyField(useDPI, new GUIContent("Use DPI")); - if (useDPI.boolValue) - { - EditorGUILayout.PropertyField(touchSize, new GUIContent("Pointer Size (cm)")); - } + display = GUIElements.Header(TEXT_ADVANCED_HEADER, advancedProps); + if (display) + { + EditorGUI.indentLevel++; + EditorGUILayout.PropertyField(touchProxy, new GUIContent("Pointer Proxy")); + EditorGUI.indentLevel--; + } serializedObject.ApplyModifiedProperties(); } diff --git a/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs b/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs index debcd85c8..c1c72b345 100644 --- a/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs +++ b/Source/Assets/TouchScript/Editor/InputSources/StandardInputEditor.cs @@ -4,19 +4,29 @@ using TouchScript.InputSources; using UnityEditor; +using UnityEngine; +using TouchScript.Editor.Utils; +using System.Reflection; namespace TouchScript.Editor.InputSources { [CustomEditor(typeof (StandardInput), true)] internal sealed class StandardInputEditor : InputSourceEditor { - private SerializedProperty windows8Touch, - windows7Touch, - webGLTouch, - windows8Mouse, - windows7Mouse, - universalWindowsMouse, - emulateSecondMousePointer; + 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_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_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"); + + private SerializedProperty windows8Touch, windows7Touch, webGLTouch, windows8Mouse, + windows7Mouse, universalWindowsMouse, emulateSecondMousePointer; + private SerializedProperty generalProps, windowsProps; private StandardInput instance; @@ -32,25 +42,44 @@ protected override void OnEnable() windows7Mouse = serializedObject.FindProperty("windows7Mouse"); universalWindowsMouse = serializedObject.FindProperty("universalWindowsMouse"); emulateSecondMousePointer = serializedObject.FindProperty("emulateSecondMousePointer"); + + generalProps = serializedObject.FindProperty("generalProps"); + windowsProps = serializedObject.FindProperty("windowsProps"); } public override void OnInspectorGUI() { serializedObject.UpdateIfDirtyOrScript(); - EditorGUILayout.PropertyField(windows8Touch); - EditorGUILayout.PropertyField(windows7Touch); - EditorGUILayout.PropertyField(webGLTouch); - EditorGUILayout.PropertyField(windows8Mouse); - EditorGUILayout.PropertyField(windows7Mouse); - EditorGUILayout.PropertyField(universalWindowsMouse); - - EditorGUI.BeginChangeCheck(); - EditorGUILayout.PropertyField(emulateSecondMousePointer); - if (EditorGUI.EndChangeCheck()) - { - instance.EmulateSecondMousePointer = emulateSecondMousePointer.boolValue; - } + GUILayout.Space(5); + + var display = GUIElements.Header(TEXT_GENERAL_HEADER, generalProps); + if (display) + { + EditorGUI.indentLevel++; + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(emulateSecondMousePointer); + if (EditorGUI.EndChangeCheck()) + { + instance.EmulateSecondMousePointer = emulateSecondMousePointer.boolValue; + } + EditorGUILayout.PropertyField(webGLTouch); + EditorGUI.indentLevel--; + } + + 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--; + } + serializedObject.ApplyModifiedProperties(); base.OnInspectorGUI(); } diff --git a/Source/Assets/TouchScript/Editor/Layers/StandardLayerEditor.cs b/Source/Assets/TouchScript/Editor/Layers/StandardLayerEditor.cs index 766e95e35..4f4c6ddc9 100644 --- a/Source/Assets/TouchScript/Editor/Layers/StandardLayerEditor.cs +++ b/Source/Assets/TouchScript/Editor/Layers/StandardLayerEditor.cs @@ -12,17 +12,17 @@ namespace TouchScript.Editor.Layers [CustomEditor(typeof(StandardLayer), true)] internal class StandardLayerEditor : UnityEditor.Editor { - private static readonly GUIContent TEXT_ADVANCED_HEADER = new GUIContent("Advanced", "Advanced properties."); - private static readonly GUIContent TEXT_TOP = new GUIContent("Objects to look for:"); + 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."); - private static readonly GUIContent TEXT_3D_OBJECTS = new GUIContent("Hit 3D Objects", "Layer should raycast 3D objects."); - private static readonly GUIContent TEXT_2D_OBJECTS = new GUIContent("Hit 2D Objects", "Layer should raycast 2D objects."); - private static readonly GUIContent TEXT_WORLD_UI = new GUIContent("Hit World UI", "Layer should raycast World Space UI."); - private static readonly GUIContent TEXT_SS_UI = new GUIContent("Hit Screen UI", "Layer should raycast Screen Space UI."); - private static readonly GUIContent TEXT_LAYER_MASK = new GUIContent("Layer Mask", "Layer mask."); - private 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."); - private SerializedProperty advanced; + private SerializedProperty advanced, hit; private SerializedProperty hit3DObjects; private SerializedProperty hit2DObjects; private SerializedProperty hitWorldSpaceUI; @@ -35,6 +35,7 @@ protected virtual void OnEnable() hideFlags = HideFlags.HideAndDontSave; advanced = serializedObject.FindProperty("advancedProps"); + hit = serializedObject.FindProperty("hitProps"); hit3DObjects = serializedObject.FindProperty("hit3DObjects"); hit2DObjects = serializedObject.FindProperty("hit2DObjects"); hitWorldSpaceUI = serializedObject.FindProperty("hitWorldSpaceUI"); @@ -47,30 +48,35 @@ public override void OnInspectorGUI() { serializedObject.UpdateIfDirtyOrScript(); - EditorGUILayout.LabelField(TEXT_TOP, EditorStyles.boldLabel); - 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); + GUILayout.Space(5); + var display = GUIElements.Header(TEXT_HIT_HEADER, hit); + if (display) + { + EditorGUI.indentLevel++; + drawHit(); + EditorGUI.indentLevel--; + } - EditorGUI.BeginChangeCheck(); - var expanded = GUIElements.BeginFoldout(advanced.isExpanded, TEXT_ADVANCED_HEADER); - if (EditorGUI.EndChangeCheck()) - { - advanced.isExpanded = expanded; - } - if (expanded) - { - GUILayout.BeginVertical(GUIElements.FoldoutStyle); - drawAdvanced(); - GUILayout.EndVertical(); - } - GUIElements.EndFoldout(); + display = GUIElements.Header(TEXT_ADVANCED_HEADER, advanced); + if (display) + { + EditorGUI.indentLevel++; + drawAdvanced(); + EditorGUI.indentLevel--; + } serializedObject.ApplyModifiedProperties(); } + protected virtual void drawHit() + { + 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); + } + protected virtual void drawAdvanced() { EditorGUILayout.PropertyField(useHitFilters, TEXT_HIT_FILTERS); diff --git a/Source/Assets/TouchScript/Editor/TouchScriptSettingsWindow.cs b/Source/Assets/TouchScript/Editor/TouchScriptSettingsWindow.cs index fe9bcdc02..3a198569b 100644 --- a/Source/Assets/TouchScript/Editor/TouchScriptSettingsWindow.cs +++ b/Source/Assets/TouchScript/Editor/TouchScriptSettingsWindow.cs @@ -106,7 +106,7 @@ private void OnGUI() 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 TUIOInput for working with TUIO protocol.", EditorStyles.miniLabel); + EditorGUILayout.LabelField("Enables " + DEFINE_TUIO + " define, this adds TUIO protocol support.", EditorStyles.miniLabel); EditorGUILayout.EndVertical(); GUILayout.Space(10); @@ -150,7 +150,7 @@ private void drawListElement(string header, string content, string url) private void drawShowAtStartup() { - bool show = GUI.Toggle(new Rect(10, height - 24, 100, 30), showAtStartup, "Show at startup"); + bool show = GUI.Toggle(new Rect(10, height - 24, 120, 30), showAtStartup, "Show at startup"); if (show != showAtStartup) { showAtStartup = show; diff --git a/Source/Assets/TouchScript/Editor/Utils/GUIElements.cs b/Source/Assets/TouchScript/Editor/Utils/GUIElements.cs index 58f6e698c..26550800a 100644 --- a/Source/Assets/TouchScript/Editor/Utils/GUIElements.cs +++ b/Source/Assets/TouchScript/Editor/Utils/GUIElements.cs @@ -12,9 +12,9 @@ internal static class GUIElements { public static GUIStyle BoxStyle; public static GUIStyle BoxLabelStyle; - public static GUIStyle FoldoutStyle; + + public static GUIStyle HelpBox; public static GUIStyle HeaderStyle; - public static GUIStyle Header2Style; public static GUIStyle HeaderCheckbox; public static GUIStyle HeaderFoldout; @@ -37,17 +37,12 @@ static GUIElements() padding = new RectOffset(0, 0, 5, 0), }; - FoldoutStyle = new GUIStyle(GUI.skin.FindStyle("ShurikenModuleBg")) - { - padding = new RectOffset(10, 10, 10, 10), - }; - - HeaderStyle = new GUIStyle(GUI.skin.FindStyle("ShurikenModuleTitle")) + HelpBox = new GUIStyle("HelpBox") { - contentOffset = new Vector2(3, -2), + wordWrap = true, }; - Header2Style = new GUIStyle("ShurikenModuleTitle") + HeaderStyle = new GUIStyle("ShurikenModuleTitle") { font = (new GUIStyle("Label")).font, border = new RectOffset(15, 7, 4, 4), @@ -64,22 +59,10 @@ static GUIElements() PaneOptionsIcon = (Texture2D)EditorGUIUtility.LoadRequired("Builtin Skins/LightSkin/Images/pane options.png"); } - public static bool BeginFoldout(bool open, GUIContent header) - { - GUILayout.BeginVertical("ShurikenEffectBg", GUILayout.MinHeight(16f)); - - return GUI.Toggle(GUILayoutUtility.GetRect(0, 16), open, header, HeaderStyle); - } - - public static void EndFoldout() - { - GUILayout.EndVertical(); - } - public static bool Header(GUIContent title, SerializedProperty expanded, SerializedProperty enabled = null, PropertyInfo enabledProp = null) { - var rect = GUILayoutUtility.GetRect(16f, 22f, Header2Style); - GUI.Box(rect, title, Header2Style); + var rect = GUILayoutUtility.GetRect(16f, 22f, HeaderStyle); + GUI.Box(rect, title, HeaderStyle); var display = expanded == null || expanded.isExpanded; diff --git a/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/NullToggleDrawer.cs b/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/NullToggleDrawer.cs index 5d908bfe8..a4ea70aab 100644 --- a/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/NullToggleDrawer.cs +++ b/Source/Assets/TouchScript/Editor/Utils/PropertyDrawers/NullToggleDrawer.cs @@ -45,8 +45,8 @@ public override void OnGUI(Rect position, SerializedProperty property, GUIConten else { EditorGUI.BeginChangeCheck(); - EditorGUI.LabelField(new Rect(position.x + 14, position.y + 18, 40, 16), new GUIContent("Value", label.tooltip)); - position = new Rect(position.x + 54, position.y + 18, position.width - 54, 16); + 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); switch (property.propertyType) { case SerializedPropertyType.ObjectReference: @@ -139,6 +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; expanded = EditorGUI.ToggleLeft(position, label, expanded == true); } diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs index 7297df0d3..6e64a6f31 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Visualizer/PointerVisualizer.cs @@ -76,6 +76,12 @@ public float PointerSize #region Private variables + [SerializeField] + private bool generalProps; // Used in the custom inspector + + [SerializeField] + private bool advancedProps; // Used in the custom inspector + [SerializeField] private PointerProxyBase pointerProxy; diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs index e726d8149..28d44e217 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/PinnedTransformGesture.cs @@ -75,6 +75,9 @@ public Plane TransformPlane #region Private variables + [SerializeField] + private bool projectionProps; // Used in the custom inspector + [SerializeField] private TransformGesture.ProjectionType projection = TransformGesture.ProjectionType.Layer; diff --git a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs index e8f62b833..95929d26a 100644 --- a/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs +++ b/Source/Assets/TouchScript/Scripts/Gestures/TransformGestures/TransformGesture.cs @@ -128,6 +128,9 @@ public Vector3 LocalDeltaPosition #region Private variables + [SerializeField] + private bool projectionProps; // Used in the custom inspector + [SerializeField] private ProjectionType projection = ProjectionType.Layer; diff --git a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs index 1ea533163..ec266a6c5 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/StandardInput.cs @@ -145,6 +145,12 @@ public bool EmulateSecondMousePointer private static StandardInput instance; + [SerializeField] + private bool generalProps; // Used in the custom inspector + + [SerializeField] + private bool windowsProps; // Used in the custom inspector + [SerializeField] private Windows8APIType windows8API = Windows8APIType.Windows8; From 151abe67a788836a16aa61df84d09171a8307c9a Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Thu, 8 Dec 2016 13:15:57 -0800 Subject: [PATCH 146/211] Upped Transformer.smoothingFactor max to 100000. --- .../Assets/TouchScript/Scripts/Behaviors/Transformer.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs b/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs index b1c07b9c2..a3da933bc 100644 --- a/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs +++ b/Source/Assets/TouchScript/Scripts/Behaviors/Transformer.cs @@ -48,14 +48,14 @@ public bool EnableSmoothing /// Gets or sets the smoothing factor. /// /// - /// The smoothing factor. Indicates how much smoothing to apply. 0 - no smoothing, 10000 - maximum. + /// The smoothing factor. Indicates how much smoothing to apply. 0 - no smoothing, 100000 - maximum. /// public float SmoothingFactor { - get { return smoothingFactor * 10000f; } + get { return smoothingFactor * 100000f; } set { - smoothingFactor = Mathf.Clamp(value / 10000f, 0, 1); + smoothingFactor = Mathf.Clamp(value / 100000f, 0, 1); } } @@ -116,7 +116,7 @@ public bool AllowChangingFromOutside private bool enableSmoothing = false; [SerializeField] - private float smoothingFactor = 1f/10000f; + private float smoothingFactor = 1f/100000f; [SerializeField] private float positionThreshold = 0.0001f; From 58741b8b522910c1bb0ffbb12b7d363bc1f73117 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Thu, 8 Dec 2016 13:17:10 -0800 Subject: [PATCH 147/211] Fixed the dependency on VC++ redistributable. --- External/WindowsTouch/WindowsTouch.vcxproj | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/External/WindowsTouch/WindowsTouch.vcxproj b/External/WindowsTouch/WindowsTouch.vcxproj index 520c05657..50247a536 100644 --- a/External/WindowsTouch/WindowsTouch.vcxproj +++ b/External/WindowsTouch/WindowsTouch.vcxproj @@ -99,6 +99,7 @@ Disabled _DEBUG;_WINDOWS;_USRDLL;WINDOWSTOUCH_EXPORTS;%(PreprocessorDefinitions) true + MultiThreadedDebug Windows @@ -113,6 +114,7 @@ Disabled _DEBUG;_WINDOWS;_USRDLL;WINDOWSTOUCH_EXPORTS;%(PreprocessorDefinitions) true + MultiThreadedDebug Windows @@ -130,6 +132,7 @@ NDEBUG;_WINDOWS;_USRDLL;WINDOWSTOUCH_EXPORTS;%(PreprocessorDefinitions) true None + MultiThreaded Windows @@ -156,6 +159,7 @@ true NDEBUG;_WINDOWS;_USRDLL;WINDOWSTOUCH_EXPORTS;%(PreprocessorDefinitions) true + MultiThreaded Windows From 975166dc8ff08eea35abb433d2dba6d01eb2f1fd Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Thu, 8 Dec 2016 13:18:05 -0800 Subject: [PATCH 148/211] Settings window header. --- Resources/SettingsWindow/Header.psd | Bin 558940 -> 558898 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Resources/SettingsWindow/Header.psd b/Resources/SettingsWindow/Header.psd index 255ab515725cb495b1d5b278a49bf995e4f18270..46d94178e223c80a3f9049668fe97749d444840b 100644 GIT binary patch delta 298 zcmcc9r?jb0X+zAk&9T!i88jOlZ#Ov3xZU75(-E)jcYN4oS+@TQV7HOp9$?7q&Aok& z4f7_!?f!nuXIZz)hA>ZN-o7!M*^FuX`6=v9a?7GpY!EM45&HGNqsyTDG^Y;gRo zZF{mCD-g47Pj+LkU?bZhXE?Xt-^c!hV>-||I@>=SXMZF(9q1;F?Z0obzciQ*bePR{ NMQ)B6M7YkA5dhk}ak~Hj delta 387 zcmdngr*x-JX+z93M&9kc*I6zZ0O@!R*0;9p(yWX?%(PvamH9dkQ1ployDSTkei*=R zBMqcwbJ)GPfpkVW`zApkE!D|>mK8`p?_;0L45X_jv70dg=?zoZo#YsKmn&2-gSZM+ z%%6mSv`{beL?AtV!%cRL?WgB6^BDm-2e~+Gwu@e3UJWwfz*S};kdEa793t94dbc&l zB2FM3>&n4o3Z&z!IJ!U%c-hL~$+$h%kHw%9$b)*K9q0)lW&?VLJ=Fy$PCe(J;oQD& dANvyyprMP7v-5#G1N4NTA&>^T{|d=Y2LP|6aNYm_ From 47e21aa7d7b9f6de002470e75537181d1821f211 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Mon, 23 Jan 2017 01:42:40 +0300 Subject: [PATCH 149/211] Updated corrupted header.psd --- Resources/SettingsWindow/Header.psd | Bin 558898 -> 558943 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Resources/SettingsWindow/Header.psd b/Resources/SettingsWindow/Header.psd index 46d94178e223c80a3f9049668fe97749d444840b..3c6f8dc1cc7535ee4b095b71d07efe5258ec21ca 100644 GIT binary patch delta 14689 zcmb_@c~~3wxh?}p!ZthF*f)dreczA-ViRDqc)_s&+re2dHo`VIF=t zOloI0&Pf|%d(vY&X#-hK4hcy+X&Tb?v@}iAG$d`>W{gJn{gL~}JKEkY>?n z=Ka0j`@P@y8;OhKWxp9OJ5jpkHfMEXOL9d*!l`$+i(jnzQDUY;XEf=|mQ6;J+iG-M zou@=e*8jHCW4xI1RwyquDOu zAz@cEAz|HDGk<7)T`>Be!`sF`{nZ1TbBI6Fsl&jO7=+apU$E;|YzzpMT7D zeq{R1_Q%&fT<}KXZ{NHA*MXJozRzQG>>oEbY5s9!{Fd$J{$0@z%;&EB`^UffJM){b zr(d`I>&GuY^WnaS7C-$9Q~7$r7kj?)NMCyHrg*~U8~vk;J)hn^Ir^t~!lN;5)@$RN zM(vYZzE%6DcbJd6x{ggB-F2{LG4G9+exl!baQN=89{Ni>;aKp^tNy>d^!51j?o&uh$FsN5A{wy>I+YN;Q71z z0|EcDgyJXlzxq0!@W_on`S(6=+;Zdl!{ayW4<-z?94y@O^O0Zed5pR7=~q7YKkgn& z`%&jtdGd9?*=+ybj?^_DF$2$be}3yLqaVZ*m=51d=Dtro7l!gKe6_7;L%je#)``_KS;RWHl-M*$@ zesp;B)epaZ<(+tf>+hKd4Cns2_z&l2BftFZq2h+Wa{fmjxVL^eP?Uc35ufM~d&v2Sw;j~}iB!9y5L+TgU{yi@B2WHK?$?K@#B6XR1lbWY~ zf=_)&y^7EM9?;$gtatJJJs|!LmtCg*g6Eg3&(E>`YwBa_=Xm~!`USK3y=12l!~8#@ z^K`vHr{7EWFl$-`$EYl?b>r?`{7$YX-kq{@*Up}f$!FRGj&hxTm~PSOw0eV{*QIN) z)M>ODtxjj#78&7b;ZTqLbi1H5*=*^*i>YWAc&N3>dW+3?_;b3Xd$O-XP&S&QG1xsG zZ&uZ)h@bR&CE%q_bM3Q8)FCwXbNBaT%?e*CyzA ztr}|@4W8tIKb_ua9vLxPZ7!eF>~LDlCbPwCwphtZ%$QW=GZW0Q39>Lm+qbX=N3VrQm^fxhk;T@7{UYR&|-7% zUX5BAQwvnsZi@1g+qVi#X+pC>uQ!@Zypf7JnMbw?N+`r*i0+PXvU;WmLY$zU8~IXIlzR^6AHV#C%?W);7-;XHViY4?ScwwG{vAd8xanTnpc)8EHrIZ zsVWs35;Bd!V%64!!xq3mR5U83Qq60EYOPw2w+&i64O*+m<8nHj?X4ROS}pc#G5QfY z1SWhX2$xT%S}1LE{Ll^REBn!;AS$zU)V z5nsE*Yq2_P<_#O_j7Hup)9c7PH{HTWx&)QfC4E=qA@youT7&-@#;K{ zcFeqrXEmm3l_nh40JT=@?bFaBLnC8-7L8t`RO|IaAysvR9vbS_=#4vf0W@IWvB4hN zN8dF(GSGSR3F(X>);;LRnwX!@?(cJ)T-u@I!ER)y&y>o7gi(-WcT5j954 zYu0KbogkBFS+k;!Yed*kt2@U!oq1M}V(A?*YshfMG+W2Eny~`(!y9>Xw#955bM20H z`>ZBo)krTg%FG*7`r&5g^_>D2HM$+=Q7QZAE|pTH)EabZjdCwN)?q|eYdUGV!vH;L zNJt2;NO+wNNupG%6zV>Dtl6MdX|!0eAw`s1>Bz`P6H!fQjNS?kp#0>fv5-phwVJ{p zRB?5(YU_wujg(NwRjJ((5>JI?Wa|+Vkz=XeXo!Mvi^&um**9P^+U+)r$sTQjdqF0q zF=l$VppY7E(VHz8A=rS>ltc7ZFr+mYG-};0daTxNG8;5XRW}_)OrXTh zopdkcplZiqP&3A=iqO3=b#6C!wt`P6q?aBb0w$;K9_zLOs3x6IwE9$sqh_T`l|>Rz zsa8fkDz&n4Xvn01#2mPQBMO)%qiN$^u3H3U)Tm13AvuK);W~!B^j@t7r39yh>(hO}tWXcp zoqA$gg*xpB-DIrqI!KT1*xIqF)ddBqpmm5hN_WQ8ac!~&kjHp+0ihYpYC0qISYL;h zFpu0+clJSGs<<{zMAN-irO+yG@6%RR!W4M5RJ(Jh!AQ)ve>;$)6Ea$nrDMEaXf)_| z?$k4?+XQNAG!Aer^oXjmq7u~V?KJJz5q;wVT5U5JQ!0s@aSal}zUG$DX zO;NeqWq3nF1+S{RW0?I=d079&&$vNRg(@1_ToiuDyL zjX~c|j{qZ%)F?r8Gd%`aYT$y|8w@-OWgR_+$k<4Th#o3o@2G_U8m32hbqXYfQFqf3 z*eeMj2^@~VIl9M&tQuY=w2WcXu2dzcR+M?f&Xo!T42pu$YW1e!7QNn6qc_npeU1S- zv73z6ZzIuQYC|>5FZT+3)TmK2KzAuXx5{8tchh^IX_P!%M5hkZQJhQ-7eOjux87jd zP7i5x@RcDABn17akU~Y^51)*XAty)ufs&q4Dfj6001r+zdUYc`6w{!f55u{E-e5BCq`P%Syh8Y^RgrijOkbhwrMn2b zyfRIV{A`0u5O8WO2OCLKnWI|~-0p4!Pp#rrg(d`(s8H1yA(dJU1J@Z`BWC2eLAR+t zrk5JcM##oh7d2Y!R&!v4d1gRhr$*~-27?9WqCq!+S{Fn%s|{!khUsQvOlnk05Ymk- zg&g*v6EWzlkeXgMOm7SB=ozH@>%A@;Qaq-kG%({rU?p~dU}@E3bT!ghK`gGK5|v)9 zj%iZ0-F-ma+eT_Ubb0rrPZjn*R4kO!fv|0v$E5{On^iEa;0 zq9it|sxZ>DkF;h{^xLG+lLm^W$$LBLoqDs)iJ}ZQHmej$IH{Ug86iAO9|6-U#RzdF zaH=4~fh3wD*bxbXbCp9Gf;KQ{lvsu0h)1cwQI$wc-QEr~ZzyadRcOvge+Dr zMyb_Q63W#cc(zi4bO1IY6)mw8q6qbnm)9ggbIKLMb8k1VO6uOKLY~HLinz+HQT0}X zaT+57cKEUZZ5H?j`Z07BB&49%&>30nFbpHL%+|w#8b}3#-KjO1R4N@h_z*p2HyUv~ z$`I;dm`8m`j?x>=MqcLv-FYSge4LbWE+Nw$;_ zF6m2B%~2$ys;v)#R;qGW)7Cwv1K-s{O4J<^5~LNa)$@jAeJz;bb?9Qqlq%YcYr&am zruI%j6*VfhkxV0gpw&YRW}DV%gcs|4Be=4`MEXGM2>K8dQw{WfiyjVy61c#Qz%IFBYxu{4If>8a+(9Au_Af>Cj7HDqsa<(uklBrK7#wd!jVm3mYIKB+f|p z@9Y^IqqmV6jl~yg*>Vtv?dc(1_g2sZbCsL` zJSx~ojpkrL^kIVrT`M?6-mBE1$O@e{&`9bsX|uFi`yR|_2J7JOuyoQ5Y8np2=<=~X zOtjzx)$|y~OIjQVIYKksvdH8a|9E3^58gggQy7 z2sR{yc_md@5vz28c4)SOP`Q3R#EZ}<$M8}qF*Js&S4%y_Lkf^e6%Kot*gb*|sO0q( z^@o^W+$;DEmAbCHtbBcW`R3i_<(15<-x2(QN-i(ov4feuU+^)tCSI0usD3@(XC9>m zf1#4f%g31S9us^{3Hb6f-6(VSIQ9x-<@pu*DrWG6;Mo;{*ZTxJ!4w`Bj#247?MEJ3 zd5}BBKPWtPa&+>C<3ekFs>kc`dM~j9Za3C=H|24!xG1-acP2I5JAI93lV-;2?J>s< zdxDL(Q#R|0Ey2#)lB^bsmA7X)Jzn3F*MmVuGazGt#-T9?WwwUJy=~+-__;|)dl@kIIG83<@LC| z7>Il878gc9Ih>5(0bvd$ZLZtPAC3>F4IO%ny?*G>K|Jm_+&-y0DRfkN-M#D_0Jz<} zE6w9_J6$gFS3fsa=6?Mr|aA~&LOZnY_@%KlbaqCdXqiwxkl!}2Zj0gbm%hs zz~rTegg%AGJ;6>87zBFUwHBXtIvo3F><%aINV5|n9QNruC*`Mw#x;o^0+({nGi|4Z zE=o{cH_slJoR}2)%H8e@>=E#}I*yn#?ua`RUFVM6a8Py!Z(HZE9Uq_kd{XF6cDn~= z7~R7{JtYqWT3EKl=c@|VRM&(8!G@b!t8YJasD1L_Bf`>sZLK3mhJ80Y=|Fdl-Howr z85qFnW6qd^nycei&uov|QW2_s$4Q*52wZ}d?~hw}YusK`<-oicbL0Mf^)9#9=ko{r z!J4{VZJz3oe{gUQ?@4z15I5c>7<-tZ9tAO@YijE@glj^fnwlW*&l+Usd{tHc>Y%^6 zu|C|||MYx}r7j;_@#h7we~umWd22UrXxXq~Bg=OCdQVSIo_^{lD=hWI)|fl)61rK| z>AH6=#;!Zp08U*FyWKGl+$;8&Ey>>BZ{w{=7Hh}3Jof6$)%mj_n@w-Gxf~aJOg-n> znVE5y$2)N%=Fbk+FyHcRe~P_!>Dv4Rgy8eIzh=`Pb~>3i9}{A39PpoDFL~Tmd?2$r zyrrq}A(nmZv6GKoXW9D#F~74a;Ah!@&)2ZA6<7yZw#FN5+PLvF%f52%;i)-xz86t- zxdzyoh8gzS`1l2uz2?L{EeG#RpFRp5*pV5lSzuqWC0i}`%-@qAGFz>o$*VOsyVa(( z&zrHY#%gy0@ufi@UnL9HyxsNi-2LqVpSSbcBOaH_hudV%nf)>5sVQM88mv%wLv66S zIuHm3{Qf7|6F#rcA8Ojr6b?Pj&fguXtqIlK&$8d*{pD4D{{eQc${T0~{^kw$vRC|G zobU;Dem@v>d9V_WA%yJowQKu%XQpHKJbSMbR1+D`@3Mhz_(#mPVokc|YRGECy(vt6 zEyt&=7L&R5>OEI$%ogN36fy^iRQdcnu0Q>6VNXr4%I9gEi@2T0ZKrFVIsAPg?xUyx z67mQHtNcKIiT#eZ3RB;P+UmLo+4=s?Mj#LPA7Eeed#iZA@ILlZmA9saZ;fwAI?Yb` zc$e@9JAbps;)+tI-Q+dKVk|7$*&ee%q1=7r}7 zw;8Q%4YlC2zP_#|@I182R~7kd8>&yTk3plvNC>^eEKrw;cL$MqY3&`G#@Wjr58>bE z<$ZB)5-C$Fu1vs1){#nYL+%~7qti%m@YYqgh+Eg#Iqta@!pd)a(=fOl(wWsr%+l#M!P|G&$XmqfCA9!}K3_UH>;GRj_hPv9i#&CTI zK75_Mi&T|RxTg9td$I=A1%(Naf&5aeN&_$V)wi{_w{P0Ab&@?%Qy)CRKH>4XoN#`m zGcjg6;EqEd4&J`TW}RX0fPoQ(e8YO&o?;En9Yr=CKSq?yTg-rO$}&U9edlpY43V(H z@EWi2=)9yOPq={_$i2S$ZTntxxZrzRt}(YhFZ58O{y3Yu2imA^tPKP&vxkB!{*|h< z6YP^-e7W@~dm^x*V-w#|+TO;n-??k*p&zi%^zYhOU*&cYsH>G@hCM>8IA%|=&9l2m zs#$qkBKkPqnqXV83y+^gYjyfCZ=#H*m^p588F4Szc-$t!=NdgWCqa^>6H@$IhNTH%vSN(L&SYoM$)NiB&)qbu3HZ+IEJp0NiWO#E?gg7BSaKrJ@}{`Xm|{AA7pp1Hc@-o4p+H1wu7Jl$%TJ2|vs^5UVnKkaV2{^K0y(){c($wsr^td5F`DvnT6Y zI(yntlfJ1Mj?F9!xG{7>iTl{AE4DRPSM3c@VGC(!f2NUv=YiK^GR93YqmU46yxJOD zZ-|?6Y#8kmBj6M@^;#zy0VKzYOFY-<_SSTCJ$INXxhS+zqsrF0T6izYaxe(*4FqaK zf$CtOiuf@0k=*n79$+tdNrthhcWfr0VR3h$Xz*Uq5i}^of_YcEa|=5UMZnb@glXQM zM0_J=TW6oyM83SR+2Lcnd9BHO`Z%c@_Yi*d38obzb-J53rm?FxpN#kwi`zZZd&5o5 z!-ZfI4(GkoF5aE(sk(j}lXOYwCj6q!4K{@Nnrt}sE$nZEYy%$L!+Tsv-haK5z3i_7UEjha7#LJ=fkwB+>dkmYqJl=cd-0=h< zaZ1DRS>Of1(6*)HnggmzyptVRai)>rjiWum+3k*N%!dr&x1$+~sD^`~kz?7m#=5%t zRUZzZ$vgqnaN#-jNz9Raevg-C-#*yh(b3jD$Oo_&0XJf{=agD)v_B>!J49C6~(3qE({U_ zCd4*x*?n$>P5;5IUY1=|t*feb{|hlTef}Jgg53^Hpx1H6>`AtL?92^JI@az(2Qf2q zk-d7X1_i=Iszb8j*!afVe8JY;m$Vm#x}uNk67(y&743>H zuFo*d6PFG2^>vf9f_hQn1kiYYe+RSo72(TNvPOIRMMn1%A?|Ug)uRtFDYL@gl2w{! z{xT>0h)PQ(cd2ln=fzubH--7>>%w=bwIXsm9(OY5dFH~K!rxKJxaT~}oOnz4A(dRI z^lW4H%?r0i@q3d0f4}FMU&Flovgi*f_yNxoZ-`zINTdum#oY3yXo8ZMD-Jw9H5EG} zeC*5_{7vzX3#UdW*S;k(SH#5G(giLe5lg=L6N{x-S&=1KCuSFUE@ffLDwR(5z9lM4 zE+~9yk)hubdGQk!dBytNh0nRfGn4QBr^wh76URA`6`#z>kxDsnf;1*en_8Zo=#j}J zkt@riVhJxxmdbK-<#Bmjwni?K$z{3uh52$$R+gKWS5UaPSh`;2-P@~CRF)MN6%^zb zmXwti7Zerb=jFGwFuUhPQc7Hyy<>on2nHkj&vT0_``1Q>4_PPaw?!tEL@E|b#NFJI zL?)5Rq*93_CmSP*Nd?x~*(Rx!m!(Uj(w^nW7Y;C`?}&7iAg}lWcYd;C zL8R~(U}|74l`HT?uu@T8R-6Yeaxf&ZR2=0Nc!^ks^O6fmr82n`{4z4E@-l%`CY22? zO)?82r!ZC|%U^Ob|5y+eQi6ig1@6qG{5?@sd0d=)hC3q>$0P}O^0K&8Ac-u9WwIO6 z6uC?;pN+~U?|e_>Nh&B@W|;RxdPd)gUgX(WNVoy z&|s{fI3|rxB~3Q}Oyo%}C^)#leD7zXe5#@>t4Lp-ot2fDnUj|{D}K#VR8BKyu9Mdvcj*qtP4!#2O=4M5Rp@) zmS+HWPF7}C#u@INw2YkGf)bUpPN#l?~>-TKQaUe$ldgVtK-bp&+#u4&>z*msM)N7`XDsQ~u)Oq791|TByC;C@;xljh`H;g$!);>;W|!!4V$v$C_tx!J|Vfmlvj_cAwubdkx#;=$z}$Vi$A zw8UOWf=Zh(6Ka_ zD=#W9EkcUCzbL{_e=;-Q;g07>^NP!g^NW;EaLc{EQa($NnRNz8SF%*&+&eir#ooGx z`cU08_rqeTR30S+i*rdD&2rN@Ibz8fFl^<;!klc$G&c*T6Y!KxEfeR1nE)yLimXPK z0M15oP9l{oHOu81*@1-x>_h&-#T-j{`T0e~C5M);ZW?K;RICTZCzw2WE=YGTG3S3N zT2GC3=Bi4?85!wm>FHUS85}oQR8%0(OwBIZvdj$>)fA;>re|hD+vCXFEDYmJrc7O3 zi%DweE$#{Bw%ZSV$sOO++Tg3qm#_MrSSDHEmXVuMUXmn^a0@HoSuT-9mzJmDzN=vI z3WQ4$EF4KB0=(2TeFBL(#kG)e$@B7Z^9C1S!-Yjf-~Xu6xc$yneD_jZ=vpeslVeZ^ z7MSR-3Hq#@W{xW@kfg6m%g$f_5_csdD@_b(5W=ryL)}@3M|Pp3HpDk5>VC}~D*w*K z54cZee)xkIp4wZSE6G7d0>BbC0Trwob%a}vNzw=?pq!ZHmYFClF)kNOFfyrFW|Wg5 z$YfJfau}|PDO?SOJU2IQ>hb(Sg7~GA6_vWpM>gv#%FBzF^Yiog-1y@uOv`WK?xXUu zL)>C!8pzI+mHIfYfzJvd|B$1wmv`Wdt2QDj57gB*G&Y1e&M8xQe$74FbMxMzJ2&M+ zrc+a}JuAmy6`3ay6N*t;Rv?m?G}{KmOB2usKuTvLKrH5DYnz(kf(wHM`IRymFD-{O zE}Y0O(I|@x7j~7DDRdi#cR3Y`@^_003nBIC38wVFh?q;(PjRoVTbGueA*-nPHn*5T zau1%8nUT4lTPCPY9G97E!41OthWb0WW$4h%aeOwo6lY1LIoVLNIA?%c1Y{%`FG)PZ z&GM43SFx_OPAxB3iQie5c_{@ihforL&jR$ER9>jem*WV*>mcY1k7kcD!X8HFb+=ggWm1bw=NTKcmX~wJEW9w2gGNejH-Wl#Zl%0{5 z2He?MaB(cjBB$8jP*>j=ZhoA57dZtUp}gE&^dBfYDd1ELv^gk_>##n}O%YDXAl4Dg zgkM?H;zCR+jLwn`iG9^ZAY!CvZu6p4np+4}kel&~vY#Vtd< zjLXxc)};xU+|(2h%j~HBtDeG3*T`}QXOR^71@c&KsbdkIEtlkdn;~scNjbiO^WAda zC+5n^^`)(g%;k>>^CG*dtg<9uk`YUbbIu)U>(XH=vg~)b{a~Ho&cFi+N#uQ=J5y5C z*s`IeIo$X&?$mc*dg*;`;nDAn+*Vz(LTU*f3*0DN@SB8O=6c9ljED#C!kp!)xl@cR zS2i8Ru~JD~61PA-c)v#`M{-~^atH_hF^k&2nwPmKp#?=nrIqFC6Ymaeb!p0n=9p8T zi0Y})^tA1$eVG|~rNy#Uz-j5J={GV>(9ap7^mn)keQi^7Q*%pW-N)RZ@238jx&Ju# zZ>$7bZDCPKS^4u1*6bYU2|an18U0j*DPG~G^`MiOM{4Tb zP(r4xxL7XBNq>iX4Bnl#l9`-=rmB(86vD3$1{xaqaAtEu4abSaSvgbO_Z4P;y@QlD zULq1pnn*K(RbIL_f(%91CV^;q8868eV^APBLWZsAQw8ywBvcifIxjZK$9ZE>c&O%2; z+yuP|pQXt}3o_E!+(f8uxEr++7KR>IE|z3TbI~O=amx@gQWRi#X!yjGrzQx`k{dE=8g*Wv;v|R!#+Fe~l)umeC8Itr!&{J@e12)ciMis^ zvXTnJuZEeP&qX1W6=?TNsnt}TCq;j{gZtc&g+>YS%A0)qIq+!AX+{GkG$UrL(|6s^IY3{16G%aJH z=w84fxp`QX5;v&vtIPAV(=*ax zAJ9W~26SRrg!g4vCrDN#sk2iui8#tANfPAd^710sUQs@=>?k)V z!!EQMx$>!5r~=+m^bzC#n+U)5if3h|bDZC(C@soCNI%j{%P{}3Vw==KLDM1w z+d$~25C^P?izUn~N!O_i_R83GMwoL#iZP^RVU&;vRM#iZS1j9-a1pruPi zvD1}F3Uf%0ggB!~?Vx0ArRWtfZAriZII{m(0ZCvx!X-aa^p9E;3NGL@Svc zKouoUBbURiWpcC`@`b?@aBsLvGoZ`me6A=jKX>T_qxh!?KRA+T3bIMb$jV5c;NB~f zh_eaq3_d+EW5=s2T-vMqq3X=+?3`j}QxCJkrT<4S;K}n*vZeX!Z+|_;B`z~fP$)XO zWgsQWT+O~1L5&G{1YHKdum;ls%(3wnQS;RD;zIHQw=f{KkXnQJ8HUY^1(>c%X9xM* z^!%a%^r#UWvaqx?C5P{jNp~)0!HWw^jQnd+kfI7EZ{kGxqv=`v{sdIIgbY3_SuC|| z=-@Y&(citl&Q#`8s@4}5L1v^Z*&>l1G67!oVE|i^BmxaD6_FhTDKDYK-FyU94ciDg zNi^*18Ayo`3E?p4J3;y{2_=>B@=R&oazQ@a4*w+54f(_2VJ;A~Og=c+%!qD?UZs*j z!~*m7iU>Dd#5ohw%!|ATH&MhnXU<$6Px(0|;&aj#aB`+UG39sE+I6U8;%u>aSkC;a0R`~UnuPyY+b C#RK#J delta 14538 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 From ebf8bdfb8a3e0f4fe5df25eb6b0d9dbc4be5f546 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Fri, 27 Jan 2017 05:11:54 +0300 Subject: [PATCH 150/211] Got rid of a few warnings in 5.5. --- .../TouchScript/Editor/TouchScriptSettingsWindow.cs | 2 +- .../TouchScript/Examples/Cube/Scripts/LayerDelegate.cs | 5 +++-- .../TouchScript/Examples/Cube/Scripts/RedirectInput.cs | 8 ++++---- .../Scripts/Devices/Display/GenericDisplayDevice.cs | 7 +------ 4 files changed, 9 insertions(+), 13 deletions(-) diff --git a/Source/Assets/TouchScript/Editor/TouchScriptSettingsWindow.cs b/Source/Assets/TouchScript/Editor/TouchScriptSettingsWindow.cs index 3a198569b..e61eae7ec 100644 --- a/Source/Assets/TouchScript/Editor/TouchScriptSettingsWindow.cs +++ b/Source/Assets/TouchScript/Editor/TouchScriptSettingsWindow.cs @@ -45,13 +45,13 @@ static void createWindow() static TouchScriptSettingsWindow() { - showAtStartup = EditorPrefs.GetBool(SHOW_AT_STARTUP, true); EditorApplication.update += doShow; } private static void doShow() { EditorApplication.update -= doShow; + showAtStartup = EditorPrefs.GetBool(SHOW_AT_STARTUP, true); if (so == null) { diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/LayerDelegate.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/LayerDelegate.cs index 19838878e..d11bc2887 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/LayerDelegate.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/LayerDelegate.cs @@ -5,6 +5,7 @@ using UnityEngine; using TouchScript.Layers; using TouchScript.Pointers; +using TouchScript.InputSources; namespace TouchScript.Examples.Cube { @@ -17,8 +18,8 @@ public class LayerDelegate : MonoBehaviour, ILayerDelegate public bool ShouldReceivePointer(TouchLayer layer, IPointer pointer) { if (layer == RenderTextureLayer) - return pointer.InputSource == Source; - return pointer.InputSource != Source; + return pointer.InputSource == (IInputSource)Source; + return pointer.InputSource != (IInputSource)Source; } } } diff --git a/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs b/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs index d6beaff94..35628311b 100644 --- a/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs +++ b/Source/Assets/TouchScript/Examples/Cube/Scripts/RedirectInput.cs @@ -76,7 +76,7 @@ private Vector2 processCoords(Vector2 value) private void pointerPressedHandler(object sender, MetaGestureEventArgs metaGestureEventArgs) { var pointer = metaGestureEventArgs.Pointer; - if (pointer.InputSource == this) return; + if (pointer.InputSource == (IInputSource)this) return; var newPointer = PointerFactory.Create(pointer.Type, this); newPointer.CopyFrom(pointer); @@ -91,7 +91,7 @@ private void pointerUpdatedHandler(object sender, MetaGestureEventArgs metaGestu { var pointer = metaGestureEventArgs.Pointer; - if (pointer.InputSource == this) return; + if (pointer.InputSource == (IInputSource)this) return; Pointer newPointer; if (!map.TryGetValue(pointer.Id, out newPointer)) return; @@ -105,7 +105,7 @@ private void pointerUpdatedHandler(object sender, MetaGestureEventArgs metaGestu private void pointerReleasedHandler(object sender, MetaGestureEventArgs metaGestureEventArgs) { var pointer = metaGestureEventArgs.Pointer; - if (pointer.InputSource == this) return; + if (pointer.InputSource == (IInputSource)this) return; Pointer newPointer; if (!map.TryGetValue(pointer.Id, out newPointer)) return; @@ -117,7 +117,7 @@ private void pointerReleasedHandler(object sender, MetaGestureEventArgs metaGest private void pointerCancelledhandler(object sender, MetaGestureEventArgs metaGestureEventArgs) { var pointer = metaGestureEventArgs.Pointer; - if (pointer.InputSource == this) return; + if (pointer.InputSource == (IInputSource)this) return; Pointer newPointer; if (!map.TryGetValue(pointer.Id, out newPointer)) return; diff --git a/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs b/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs index e95965370..091138dd1 100644 --- a/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs +++ b/Source/Assets/TouchScript/Scripts/Devices/Display/GenericDisplayDevice.cs @@ -121,12 +121,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; } From cd98e8bed2eeb3d9839d0f2918d9ed70b10a4183 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Fri, 27 Jan 2017 05:37:59 +0300 Subject: [PATCH 151/211] Implemented IsPointerOverGameObject. --- .../Layers/UI/TouchScriptInputModule.cs | 40 ++++++++++++++----- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs index 63834c81d..22c0ec776 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs @@ -133,7 +133,8 @@ public override void Process() public override bool IsPointerOverGameObject(int pointerId) { - return base.IsPointerOverGameObject(pointerId); + if (ui != null) return ui.IsPointerOverGameObject(pointerId); + return false; } public override bool ShouldActivateModule() @@ -214,7 +215,7 @@ public UIStandardInputModule(TouchScriptInputModule input) this.input = input; } - #region Unchanged + #region Unchanged from PointerInputModule private int m_ConsecutiveMoveCount = 0; private Vector2 m_LastMoveVector; @@ -222,8 +223,17 @@ 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; + } + protected bool GetPointerData(int id, out PointerEventData data, bool create) { + Debug.Log(id); if (!m_PointerData.TryGetValue(id, out data) && create) { data = new PointerEventData(input.eventSystem) @@ -246,6 +256,13 @@ 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; + } + private static bool ShouldStartDrag(Vector2 pressPos, Vector2 currentPos, float threshold, bool useDragThreshold) { if (!useDragThreshold) @@ -375,19 +392,20 @@ protected void RemovePointerData(int id) m_PointerData.Remove(id); } + private void convertRaycast(RaycastHitUI old, ref RaycastResult current) + { + current.module = old.Raycaster; + current.gameObject = old.GameObject; + current.depth = old.Depth; + current.index = old.GraphicIndex; + current.sortingLayer = old.SortingLayer; + current.sortingOrder = old.SortingOrder; + } + #endregion #region Event processors - private void convertRaycast(RaycastHitUI old, ref RaycastResult current) - { - current.module = old.Raycaster; - current.gameObject = old.GameObject; - current.depth = old.Depth; - current.index = old.GraphicIndex; - current.sortingLayer = old.SortingLayer; - current.sortingOrder = old.SortingOrder; - } public virtual void ProcessUpdated(object sender, PointerEventArgs pointerEventArgs) { var pointers = pointerEventArgs.Pointers; From 316069141554ed778d9ea2f1ed80dd07801496d1 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Fri, 27 Jan 2017 06:31:59 +0300 Subject: [PATCH 152/211] Removed a Debug.Log. --- .../TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs index 22c0ec776..742d5c148 100644 --- a/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs +++ b/Source/Assets/TouchScript/Scripts/Layers/UI/TouchScriptInputModule.cs @@ -233,7 +233,6 @@ public bool IsPointerOverGameObject(int pointerId) protected bool GetPointerData(int id, out PointerEventData data, bool create) { - Debug.Log(id); if (!m_PointerData.TryGetValue(id, out data) && create) { data = new PointerEventData(input.eventSystem) From 0504006300e0255df747d85197abcc0c696f4f14 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Sat, 25 Mar 2017 20:30:53 +0300 Subject: [PATCH 153/211] Implemented Orientation and Pressure for touch WM_POINTER Windows 8 input. --- External/WindowsTouch/WindowsTouch.cpp | 55 +++++-- External/WindowsTouch/WindowsTouch.h | 21 ++- .../InputHandlers/WindowsPointerHandlers.cs | 143 +++++++++--------- .../Scripts/Pointers/TouchPointer.cs | 10 +- 4 files changed, 141 insertions(+), 88 deletions(-) diff --git a/External/WindowsTouch/WindowsTouch.cpp b/External/WindowsTouch/WindowsTouch.cpp index a3914e8c2..f7dadfb79 100644 --- a/External/WindowsTouch/WindowsTouch.cpp +++ b/External/WindowsTouch/WindowsTouch.cpp @@ -7,11 +7,18 @@ extern "C" { - void __stdcall Init(TOUCH_API api, PointerBeganFuncPtr began, PointerMovedFuncPtr moved, + void __stdcall Init(TOUCH_API api, + MousePointerBeganFuncPtr mouseBegan, MousePointerMovedFuncPtr mouseMoved, + TouchPointerBeganFuncPtr touchBegan, TouchPointerMovedFuncPtr touchMoved, + PenPointerBeganFuncPtr penBegan, PenPointerMovedFuncPtr penMoved, PointerEndedFuncPtr ended, PointerCancelledFuncPtr cancelled) { - _pointerBeganFunc = began; - _pointerMovedFunc = moved; + _mousePointerBeganFunc = mouseBegan; + _mousePointerMovedFunc = mouseMoved; + _touchPointerBeganFunc = touchBegan; + _touchPointerMovedFunc = touchMoved; + _penPointerBeganFunc = penBegan; + _penPointerMovedFunc = penMoved; _pointerEndedFunc = ended; _pointerCancelledFunc = cancelled; _api = api; @@ -102,21 +109,29 @@ void decodeWin8Touches(UINT msg, WPARAM wParam, LPARAM lParam) { if ((pointerInfo.pointerFlags & POINTER_FLAG_CANCELED) != 0) return; + 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: - case PT_PEN: 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; } - - _pointerBeganFunc(pointerId, pointerInfo.pointerType, buttons, Vector2(((float)p.x - _offsetX) * _scaleX, _screenHeight - ((float)p.y - _offsetY) * _scaleY)); break; } case WM_POINTERUP: @@ -125,7 +140,8 @@ void decodeWin8Touches(UINT msg, WPARAM wParam, LPARAM lParam) { _pointerCancelledFunc(pointerId, pointerInfo.pointerType); } - else { + else + { unsigned int buttons = 0, b; switch (pointerInfo.pointerType) { @@ -148,7 +164,9 @@ void decodeWin8Touches(UINT msg, WPARAM wParam, LPARAM lParam) { _pointerCancelledFunc(pointerId, pointerInfo.pointerType); } - else { + 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) { @@ -166,7 +184,20 @@ void decodeWin8Touches(UINT msg, WPARAM wParam, LPARAM lParam) buttonsSet |= 1 << b; // add pressed } } - _pointerMovedFunc(pointerId, pointerInfo.pointerType, buttonsSet, buttonsClear, Vector2(((float)p.x - _offsetX) * _scaleX, _screenHeight - ((float)p.y - _offsetY) * _scaleY)); + 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; + } } break; } @@ -192,7 +223,8 @@ void decodeWin7Touches(UINT msg, WPARAM wParam, LPARAM lParam) if ((touch.dwFlags & TOUCHEVENTF_DOWN) != 0) { - _pointerBeganFunc(touch.dwID, PT_TOUCH, 3, Vector2(((float)p.x - _offsetX) * _scaleX, _screenHeight - ((float)p.y - _offsetY) * _scaleY)); + Vector2 position = Vector2(((float)p.x - _offsetX) * _scaleX, _screenHeight - ((float)p.y - _offsetY) * _scaleY); + _touchPointerBeganFunc(touch.dwID, 3, 0, 0, position); } else if ((touch.dwFlags & TOUCHEVENTF_UP) != 0) { @@ -200,7 +232,8 @@ void decodeWin7Touches(UINT msg, WPARAM wParam, LPARAM lParam) } else if ((touch.dwFlags & TOUCHEVENTF_MOVE) != 0) { - _pointerMovedFunc(touch.dwID, PT_TOUCH, 0, 0, Vector2(((float)p.x - _offsetX) * _scaleX, _screenHeight - ((float)p.y - _offsetY) * _scaleY)); + Vector2 position = Vector2(((float)p.x - _offsetX) * _scaleX, _screenHeight - ((float)p.y - _offsetY) * _scaleY); + _touchPointerMovedFunc(touch.dwID, 0, 0, 0, 0, position); } } diff --git a/External/WindowsTouch/WindowsTouch.h b/External/WindowsTouch/WindowsTouch.h index 46f83aa18..ea06d9575 100644 --- a/External/WindowsTouch/WindowsTouch.h +++ b/External/WindowsTouch/WindowsTouch.h @@ -23,13 +23,21 @@ typedef enum WIN8 } TOUCH_API; -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 * 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); -PointerBeganFuncPtr _pointerBeganFunc; -PointerMovedFuncPtr _pointerMovedFunc; +MousePointerBeganFuncPtr _mousePointerBeganFunc; +MousePointerMovedFuncPtr _mousePointerMovedFunc; +TouchPointerBeganFuncPtr _touchPointerBeganFunc; +TouchPointerMovedFuncPtr _touchPointerMovedFunc; +PenPointerBeganFuncPtr _penPointerBeganFunc; +PenPointerMovedFuncPtr _penPointerMovedFunc; PointerEndedFuncPtr _pointerEndedFunc; PointerCancelledFuncPtr _pointerCancelledFunc; HWND _currentWindow; @@ -44,7 +52,10 @@ LONG_PTR _oldWindowProc; extern "C" { - EXPORT_API void __stdcall Init(TOUCH_API api, PointerBeganFuncPtr began, PointerMovedFuncPtr moved, + 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 SetScreenParams(int width, int height, float offsetX, float offsetY, float scaleX, float scaleY); EXPORT_API void __stdcall Dispose(); diff --git a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs index 663f0eb6c..5975bfc93 100644 --- a/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs +++ b/Source/Assets/TouchScript/Scripts/InputSources/InputHandlers/WindowsPointerHandlers.cs @@ -160,8 +160,12 @@ public enum PointerSource /// public const string PRESS_AND_HOLD_ATOM = "MicrosoftTabletPenServiceProperty"; - protected delegate void NativePointerDown(int id, POINTER_INPUT_TYPE type, Pointer.PointerButtonState buttons, Vector2 position); - protected delegate void NativePointerUpdate(int id, POINTER_INPUT_TYPE type, Pointer.PointerButtonState buttonsSet, Pointer.PointerButtonState buttonsClear, Vector2 position); + 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); @@ -176,8 +180,12 @@ public enum PointerSource #region Protected variables - private NativePointerDown nativePointerDownDelegate; - private NativePointerUpdate nativePointerUpdateDelegate; + private NativeMousePointerDown nativeMousePointerDownDelegate; + private NativeMousePointerUpdate nativeMousePointerUpdateDelegate; + private NativeTouchPointerDown nativeTouchPointerDownDelegate; + private NativeTouchPointerUpdate nativeTouchPointerUpdateDelegate; + private NativePenPointerDown nativePenPointerDownDelegate; + private NativePenPointerUpdate nativePenPointerUpdateDelegate; private NativePointerUp nativePointerUpDelegate; private NativePointerCancel nativePointerCancelDelegate; @@ -220,8 +228,12 @@ public WindowsPointerHandler(PointerDelegate addPointer, PointerDelegate updateP this.removePointer = removePointer; this.cancelPointer = cancelPointer; - nativePointerDownDelegate = nativePointerDown; - nativePointerUpdateDelegate = nativePointerUpdate; + nativeMousePointerDownDelegate = nativeMousePointerDown; + nativeMousePointerUpdateDelegate = nativeMousePointerUpdate; + nativeTouchPointerDownDelegate = nativeTouchPointerDown; + nativeTouchPointerUpdateDelegate = nativeTouchPointerUpdate; + nativePenPointerDownDelegate = nativePenPointerDown; + nativePenPointerUpdateDelegate = nativePenPointerUpdate; nativePointerUpDelegate = nativePointerUp; nativePointerCancelDelegate = nativePointerCancel; @@ -293,10 +305,12 @@ public virtual void INTERNAL_DiscardPointer(Pointer pointer) #region Protected methods - protected TouchPointer internalAddTouchPointer(Vector2 position) + protected TouchPointer internalAddTouchPointer(Vector2 position, uint orientation = 0, float pressure = 0) { 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); @@ -370,7 +384,11 @@ protected PenPointer internalReturnPenPointer(PenPointer pointer) protected void init(TOUCH_API api) { - Init(api, nativePointerDownDelegate, nativePointerUpdateDelegate, nativePointerUpDelegate, nativePointerCancelDelegate); + Init(api, + nativeMousePointerDownDelegate, nativeMousePointerUpdateDelegate, + nativeTouchPointerDownDelegate, nativeTouchPointerUpdateDelegate, + nativePenPointerDownDelegate, nativePenPointerUpdateDelegate, + nativePointerUpDelegate, nativePointerCancelDelegate); } protected Vector2 remapCoordinates(Vector2 position) @@ -439,69 +457,55 @@ private void getNativeMonitorResolution(out int width, out int height) #region Pointer callbacks - private void nativePointerDown(int id, POINTER_INPUT_TYPE type, Pointer.PointerButtonState buttons, Vector2 position) + private void nativeMousePointerDown(int id, Pointer.PointerButtonState buttons, Vector2 position) { - switch (type) - { - case POINTER_INPUT_TYPE.PT_MOUSE: - { - mousePointer.Buttons = buttons; - pressPointer(mousePointer); - } - break; - case POINTER_INPUT_TYPE.PT_TOUCH: - { - winTouchToInternalId.Add(id, internalAddTouchPointer(position)); - } - break; - case POINTER_INPUT_TYPE.PT_PEN: - { - penPointer.Buttons = buttons; - pressPointer(penPointer); - } - break; - } + mousePointer.Buttons = buttons; + pressPointer(mousePointer); } - private void nativePointerUpdate(int id, POINTER_INPUT_TYPE type, Pointer.PointerButtonState buttonsSet, Pointer.PointerButtonState buttonsClear, Vector2 position) + private void nativeTouchPointerDown(int id, Pointer.PointerButtonState buttons, uint orientation, uint pressure, Vector2 position) { - // int existingId; - // if (winTouchToInternalId.TryGetValue(id, out existingId)) - // { - // moveTouch(existingId, position); - // } - Pointer pointer = null; - switch (type) - { - case POINTER_INPUT_TYPE.PT_MOUSE: - pointer = mousePointer; - break; - case POINTER_INPUT_TYPE.PT_TOUCH: - TouchPointer touchPointer; - if (winTouchToInternalId.TryGetValue(id, out touchPointer)) pointer = touchPointer; - break; - case POINTER_INPUT_TYPE.PT_PEN: - if (penPointer == null) internalAddPenPointer(position); - pointer = penPointer; - break; - } - if (pointer != null) - { - pointer.Position = position; - pointer.Buttons &= ~buttonsClear; - pointer.Buttons |= buttonsSet; - updatePointer(pointer); - } + winTouchToInternalId.Add(id, internalAddTouchPointer(position, orientation, pressure / 1024f)); + } + + private void nativePenPointerDown(int id, Pointer.PointerButtonState buttons, Vector2 position) + { + penPointer.Buttons = buttons; + pressPointer(penPointer); + } + + private void nativeMousePointerUpdate(int id, Pointer.PointerButtonState buttonsSet, Pointer.PointerButtonState buttonsClear, Vector2 position) + { + if (mousePointer == null) return; + mousePointer.Position = position; + mousePointer.Buttons &= ~buttonsClear; + mousePointer.Buttons |= buttonsSet; + updatePointer(mousePointer); + } + + private void nativeTouchPointerUpdate(int id, Pointer.PointerButtonState buttonsSet, Pointer.PointerButtonState buttonsClear, uint orientation, uint pressure, Vector2 position) + { + 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); + } + + private void nativePenPointerUpdate(int id, Pointer.PointerButtonState buttonsSet, Pointer.PointerButtonState buttonsClear, Vector2 position) + { + if (penPointer == null) return; + penPointer.Position = position; + penPointer.Buttons &= ~buttonsClear; + penPointer.Buttons |= buttonsSet; + updatePointer(penPointer); } private void nativePointerUp(int id, POINTER_INPUT_TYPE type, Pointer.PointerButtonState buttons) { - // int existingId; - // if (winTouchToInternalId.TryGetValue(id, out existingId)) - // { - // winToInternalId.Remove(id); - // endTouch(existingId); - // } switch (type) { case POINTER_INPUT_TYPE.PT_MOUSE: @@ -525,13 +529,6 @@ private void nativePointerUp(int id, POINTER_INPUT_TYPE type, Pointer.PointerBut private void nativePointerCancel(int id, POINTER_INPUT_TYPE type) { - // int existingId; - // if (winTouchToInternalId.TryGetValue(id, out existingId)) - // { - // winToInternalId.Remove(id); - // cancelTouch(existingId); - // } - switch (type) { case POINTER_INPUT_TYPE.PT_MOUSE: @@ -614,7 +611,11 @@ protected enum POINTER_INPUT_TYPE } [DllImport("WindowsTouch", CallingConvention = CallingConvention.StdCall)] - private static extern void Init(TOUCH_API api, NativePointerDown nativePointerDown, NativePointerUpdate nativePointerUpdate, NativePointerUp nativePointerUp, NativePointerCancel nativePointerCancel); + private static extern void Init(TOUCH_API api, + NativeMousePointerDown nativeMousePointerDown, NativeMousePointerUpdate nativeMousePointerUpdate, + NativeTouchPointerDown nativeTouchPointerDown, NativeTouchPointerUpdate nativeTouchPointerUpdate, + NativePenPointerDown nativePenPointerDown, NativePenPointerUpdate nativePenPointerUpdate, + NativePointerUp nativePointerUp, NativePointerCancel nativePointerCancel); [DllImport("WindowsTouch", EntryPoint = "Dispose", CallingConvention = CallingConvention.StdCall)] private static extern void DisposePlugin(); diff --git a/Source/Assets/TouchScript/Scripts/Pointers/TouchPointer.cs b/Source/Assets/TouchScript/Scripts/Pointers/TouchPointer.cs index b5e4be8c6..a231f057c 100644 --- a/Source/Assets/TouchScript/Scripts/Pointers/TouchPointer.cs +++ b/Source/Assets/TouchScript/Scripts/Pointers/TouchPointer.cs @@ -1,4 +1,4 @@ -/* +/* * @author Valentin Simonov / http://va.lent.in/ */ @@ -12,6 +12,14 @@ namespace TouchScript.Pointers public class TouchPointer : Pointer { + #region Public properties + + public uint Orientation { get; set; } + + public float Pressure { get; set; } + + #endregion + #region Constructor /// From b8df6c3cd375970477a73d6d45f22c0d8cf46924 Mon Sep 17 00:00:00 2001 From: Valentin Simonov Date: Wed, 26 Apr 2017 06:00:25 +0700 Subject: [PATCH 154/211] 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 155/211] 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 156/211] - 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 157/211] 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 158/211] 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 159/211] 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 160/211] 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 161/211] - 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 162/211] 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 163/211] 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 164/211] 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 165/211] 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 166/211] 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 167/211] 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 168/211] 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 169/211] 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 170/211] 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 171/211] 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 172/211] 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 173/211] 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 174/211] 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 175/211] 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 176/211] 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 177/211] 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 178/211] 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 179/211] 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 180/211] 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 181/211] 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 182/211] 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 183/211] 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 184/211] 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 185/211] 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 186/211] 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 187/211] 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 188/211] - 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 189/211] 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 190/211] 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 191/211] 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 192/211] 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 193/211] 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 194/211] 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 195/211] 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 196/211] 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 197/211] 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 198/211] 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 199/211] 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 200/211] 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 201/211] 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 202/211] 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 203/211] 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 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 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 204/211] 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 205/211] 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 206/211] 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 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 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( zH08rKKNKf?%#5|()d}}YRZkoZG0~hz(4MXa%~IC3t6bt5j4qR!v!NTPY4{VK*5B<7 z4Fa;Ny|R?$-k|9o%*oURzcg(a5|A6M%Y)T)I4!_o%UT1XY@*LA*zfnEYv86Tw6rWJ zvBJL9d(oRS1UImwY9zu`CH+rMgcrLW$1mcn=Ze?2=M@GGAXaFsCzG! z_e}nWGEca`lI$_(OSyvVY!~EXbC@2k-KXjgC^y+Cg_fUi0Ci(~c0~9c65k$`P(u2I zoakagZ(xMAM%NWm;YagfajJpJXry*I)pQv0eek^46&dF8bH75ab?u7wcwEB`rDPi{ z#n?|xb(ka>J#s%X`q&Aqc_;0qUw)qy8k*Q6OpZtYok`h$0N?+h`08ac_PD#XdU>W8 zCe2qi?R&-=lB6RSDnXQj3;cxzN50gWy;cA{1#vETsua zyH~V?+-OZoltqIqQTM-Y7wScZ!1Bfg#_XXFH*e=PZQH!ueO4vTXuA>McNOwdbc1p` zL7V44SAnDjH`1Ix^tMKh%{9o=a-)snO;#%O1@|YhxzCn{IvvfpI2PH>R@2}&skMd7 zjwqR)&gJQHqM%KmE|RDvezUSsJNNxUW&aC~S7)sI;gP;OcUEUUOHLjWW%JDVQTn0l zSvuLa_gC)$g^J>9PQ|^KW!dLqp`k^V&N9MrzNVOH7-(X|YR^_kzEasCuQW)4a=z76sH(65O zJ2vtY$6qNKaCwjdGjW}PU|sA%HisA9kJyW8N6s#RR86EEIpKh!sr-OKp40~>P0ky_ zCpe+|H(SXXv@rbr5CRx%c@Bwn6oPl$KA=#CPwO2}qdgRVDd#I@Q>h|-UN?8i;I{RvNccUP=@1oxBcEbSm9$FIer9nm)T}q zPg82zpuXRGl|ebq7>q1Fae0%L?^Ygq$kma2Q4_TSVw8z=z7%Qd_?8~nh(>2L^H$`|W?KCVYK zee2gN%OhJzmozZ8*u3n~iFn2_To=tAatu|u$iIpu4YLIX4!sk@1 z5N-04RPQFUzG^t$Y?9x@t}_J2c9}wM!{_G#MbaY5GSs|rmGnuGcnw0V5GMvga8G~; z2(9~)wZM279$%s^G%5t=g&tYo_yosJps~F0Ztz&TYJP#|vk311-}fT2qZN;|U2)!1 zfZ|`-;x9ty@*y~ZOK^-N44VyaF2a_OZO8Xn$n+s(y?FBd5PTjLv9kq&SBoL$LN=|4 z`SAE1atrdi-~mOa1H28ak0@9LAsn~|lRx(W;&;d#30Z>v#eG15DM!wNTZk)$ch$WB zcQFd@03W%Cz!(wH6+2Qy4hZpU#qV!IhmWa+V&etyPoUGoc<>qVRZ$DPe!PO9l*Ga>0q|CTYgy+i`$kIHanKu)%&~9`{S`V3_qm7fl~LTe!ry<<920V0 znNh^%ej5F3k<}y)pyP(^MC>c+ z|EXv7cxX24n&G=l`6yK1n!0D;3a9JbiVW|Z^#)yWsO&eA#){K3lNC>qbn6YzrguA3 zAIx;OI;Y84=(g{2R{`T*3v`*T?o$_diZec4l` zeOl^`Yrj@l$2)T|Gd9XFVSlXI-43i2@PS6PPSoBnQuDawr310wWOTFo6@n4m6`*&{ ztiJ^13aN4ltP|a6#k%ar_|^1lP(#9hzh6oEmX{)4tG_EYflTqk3X(n*#qG5gJ7%uCfJj1*%j zYGa@>Nd^Bk;`r~>r958ltiG@wTV4RY+h2L6PC-MRGjvn?h>9@7N^(N;(9*B;M&44) z*)`9k6=_mcQFBWFuz%=}y0^*3O1l&)t2R{FQu!ZSBfQXiutB6d31vM1vyDNynG`$9Fl|FUBmP zAlIN*rFKkL7U{SXoR|uXloH**-aJmh{c>%SLZZ* zgm5ronC%A3u6P&pDo_hWF$9<869lu}jGy39L3)DHMXMaBiS)R*ZQLQW+y~R6wZJ48 zflk;?_aJbOqKoLCa9j6_d6) zJy4P9qDL00Sh~E6CZ2-Nu);P*NxiN%@Lj|)P)XVN?H8DGb@ zy5A#z1k`6`gjdY|hVXVM5rFOhegZByB<9OAlS7+HCa}IM+GAhBIDhjU@v z6nb+kg5-*vT{bJSwjp;w5k$Ejv;U=`)N&&j0Q`Djh!eov!Jz;wnpElt zBYXh!)PT`$IRRU~NBZFc+2a6@h+pIIz-!s89o2mp8CL}SiD8Gh4;PlW1MhiqK(Ty} zYzZINhqwEcu7vDC;4QQf1VlPgd!HT%V72WMIUK((#gz+#?1mjs`a znCsg%l%!v_dmZR(GccR#^Vtyr3Iwb_X5HssnDZA3h)*o3;}}7RK)T zPC=A_%b+7-bOn|*$g$nKKRmEkyw;Duwmu(kc*&8|yQ)F8GNM}+w$T%dK@0IEMy)4F zkDiaqiZLCyrcx=5Oi9mVa?dVEKhBEX?u}(>pidT|LY9Ab@$_G*eWq|5rI!H9h8=^O zspB@`(zr#SFS?L%8PgEXEKWMJeKGxWm)iXYj3-`ix(3a1c`+eL3=C?*@k4c#4TR`Y7jXdRb03Cs&)#Wn7^&30+UmsGTa6?DzJ%m{1;Vne+9 z@{TjsnC(aaySh+l7rUx2qrY==F&2B*Qr4#=-O|vmynm$(ehcr09TMo`lT!Pn2O8jB z@%~)kn9UcRN1bzftMGys!_LmQWYS=3=1xV){Me-uKg(jc3tPuM5TS&rW{Jk($w@b1)~EoCUitgVaa#3{$}>e}H~=laI< zvix6VMO{;{FOgrvK4_3jO@04#i_#%!c%+w$wlR4hfr9N_H}R42YM_?(#o*u_bX{9lODW}x$pKciZ=bNQ}$+e(W$(GBx;j)v2WS@C?3>( z6PFL3QK)OCdsi}&w*tX8z)0prAlexh);^%fRz!&bq|-`#ZbB}DPEx%C2QcDGED{#*1t@x z%lqoFfkeCtcq-hH4Pm+_vB>vZYxZ-Hd{M96j)@X~Yp{n4&0P{&jJ zm>{8P>%pi{N0X}_ZJD%6Qtv4_hWVdNquW@GeQp~zcCl*qZ<#mK5o9wk{h|fivFKkf zx{WC-dEL#5;SD@gn!ZY7m)<7bFru&bV7J|<__>ZZ*56p^c7C-ln3u4zY-gDf|AC$% zf_bOJXz;tDx*uJBNM4$o;5u8dh{y;Rvffp{l)NVEhm(=^jo*1AC7t+YX2zJj#<};A z^k_VWe?36#`wO~gsIX(zInl56eFe2q8LeZ>+5?5D)y8rL-37I>d63a;l-7>$-1eLeA3nOPwW%0+Z z)pyTtY(6kJbteR#^#TVML;h?WP17lA5Tv|egt|<(@b0sna^csYHRq#?A6&h=>GH{X zu8i{41L4!logh`r^7XS{&bF0OYO!F&d2OnJFm{fhr=eEy`lEYW8~##Fov(f^f`)$v zRHi}VmX;0*#}wHGBltbEs5o%Y@6=AS$F;g0PAw$9wV<0-)E0WPw;t7mwnR<%h!oBWW>|$bDzDwU z@}%mMg#~dJR6#s}|7*_z|EFhp;{H$1f|FwWr)M!<_%A#Q`ybC@@=wpQP4%xl%kezz zhNi+o`SwR75HD4B-y^@6J)rPQm?7225Xb9MKusDRKEcSQLRyjeH4}@k-(LIAIkNw5 z_Ogx*8)(}F;{`6)0y*0ho4ynBmv>PB-i3>ZxdL5QIrJ`Xt+BdZ^W}%YB*wl$^+N=U zz*B@`0QtKbXD28%88QoA*TV*Gjp|YyD67_H_Pjsp(qgM+HwU)$x-GT_D@#gxMLdslgmkh#>hlg{kycfT zGkkOoH=zcbQazxcU${}{8e&N*L0Gj&dfd8H_Jiq7NuSK)!wQB7MBh$3r8!y-WPrkVTwTjG-gtiP{pp4`uo^z>e?!$nhVc4*W}~ zt7J1hvc40C)d-*a`n@tm0&E9%TR&P%W!0b7bSLmGlvmFQ#M9DK$N+gXwSgwp85LW~7ZK#sReq!LDK*&BQuo{9C z3B7@#XUN6-Bb{Mxh409l;zSeM0pWGT9#DrCdE~Dz`>9yM0mZuPsX4cZ4?q_A4D>G+ z=un-ju43S@tYT#^*FT}WG)o;NFsQNr=@5o%02r<~J__%yD>|S^@j$Mf3Ckew$Zl+| z5NF-y|7H{(f>)}To3udG1~i%fPmJY^$rxBKmjF9s=-d z91X#zO{}VZrjPv`xgl05CX&R_fj&oUIeNK84=F1Rj06h^atv+plA|l05hPUSnitj1 zKG9o?340c#5WvcW{Q z2R==g5fmzqLvWnDgncsLLjLmX1AlpTM0&kfPxDgDzxV7500SFPlBVImG4K>X>g>>E z`2z~DmfoFK2Nbn?T#l%R)2|ctnUyRnZ$}NbZQca7szB$uaSZr(_%cc(QT zhQEY)@@tQNvOPm*D|yfjNs?1a0!;RCjlG6;k_)_=4lKbj#9nhd$s8Pv8+zfflhE70 z_0w7Ud>LAJCWuc8Q7=-q<^|kt6@uBqqR^!eEU!qM)#0CsK&2A0f!2K_0;KvCJkK?f8_-)-M1e|rI~AJ8c-AX^0lAJ2KfAs88iLHDfd zfBvPVlMelr37mOv+xZI>{dEf|IUMadl?UxPl^pG*l?Pv6zNy_7%W)(Z-U<-sUmj_; zt_F&;T?V_G{sMA9S+Tstb+^{PSy}z@8d~^|nCjCAT?6F&huDlAU*bK1O3zXSFeGBicgZvU<2A}kH%bI z!ah56ZlX+9COj^&%^lf?pbjXk9lf9ybCi)B+{AR-RU?T6?4dKR{|Xk2?GTE*!)}5G zGlm7Ap32?~@Inn5e#aHZ!suc3Yz3=7TsBQD_=I=m`*L-cW921B zHdrhk1irOYlDj$o2zHGZ{wWTRe!%}B4wFC}yvb!KGLt~1bW6=X>b-;hRu31=;2{t> zlm=Q3$Jcg10ya6op9*x?e(QWTjTTv=;(+20s=u)c^zNxB`j3|P!w;35)62Ea=9O0j}1n^c%6XGg@oE8 zBe&s8rC?r*z|eZ1ZV0hr0!YCyxpMCkAe&_6;QxCsM~T9h`v2>b|1Z5v(&vZI0!yp! zK@EneT}5`pA-64n#fn*$3;(M!Quo(6r7wRdkL?)ZFNrLm%Q2{b!3H?;X&?m=gpEVI z%Sb+n-VB2NW=;AWP@gUEQ}Ksh1phPRP_S-H0k^TPbp<#R00&T4)T9O)!GOJ%Xv7Bu zE>Z!B3x&ifl833tYKn+w`^N!)q6=H{3MYxK=n#!8kU0dE2H`@tk8LhrN>=1L-{4P3 zhlMT3;m^~*Sdu(d5JCT=?ZLi}CtxLy`ujV{`_0;`tkDS%L=Jciu|XOe3YlWyR;btJiD?k%UWh?NDO1p*|pe2T%y; z54bhFgCDk)0TynHZw!eIiXh#vCHqiff#2ds#6TBC1p(DeDghb8DtKQcJmnQ|1(DW> zMHTqgEl4;V|E9JI5W6`c1iIA_{QXXHWD()wDh#jCPL8bkH|MzpPbLF29I2071W@B2 z=K-Zl_m1F!gNV`SL~O-<2AuQ%$+xNez9{@3&jJ3U!V;v9#Wc1uivD_7UcVn!D~W2S zm6(b-pitH#f2`3VYkq-e@WFq4^8(>LrVl$$;>?6DK)*sUi~@v5$OXM}IEIOf@QCOP z%(2f<8A8y@(d(s^+r_jK1?iT$DbbCO%I(;NxzfGEZ!Pf%FG7t(s@~LvWHm=~3V-7E zE;)e`N0TD@XZv@aP`kb~;%@PiZo$k*^w*s!dE$v7Dfh5QE800S3sFJOl+%c%pbFqW z;w{h`hU8Q-LwnkD9gk`n!R$L0dAx#pGo^*jd*-UQ6IsKSkVXo!!3Awp|bzxsoEj#RWWQ@kw`l;8aStUIzRc$&<_4k4CFNe;|swr761>E9eU cJGClv>b5AzZ)C2cOMye(I&%oQx&Hr606DVMwEzGB 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 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

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 207/211] 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 208/211] 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 209/211] 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 210/211] 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 211/211] 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 z`Fb>Q!~cQ_5kxYN!9$=G%HfX<*!9WB*5#I2fu`G}UPnTbdWS$>Uq{fR`4nddp=&B^ z7P_bhVS>bKqOC8>oTQAR6$SJxPBNadIQPQF`ubV^jr-!|f|p$nhOC>JU)}1gyu;IN zgW#?QjYp@Ic|qgRRn?GnSE8GgaJ-+H?mQqU-ddc8f4gaZmc9v@^`*mnfRe0FF`*gF zf(CfjJ`hU67+_REG%*DaLx6%y0GU`p&EjQ{16TdoT8M5cy&>~20d`SocTrn zk(%sLjcS|hIDMnpD-GKt2^E~_?vluXuNgAR%hUsd9##Uqjp?y6PjBV9MijD+MGGN& zlHU5eXW6I!od&k)j`I(Q9qpi~9nSqr3g-AnxL}rv)&AV<&PK1^xm*}aW z8f~OGV`a+y@M^wvE8fTNQrD2REqQ6LC0ToKIx|;ZbcFcD5b5b5C6_Af#xl z_86`g9`jzF_B`dCBzt8F+;(UfNlM(Y9+keXvRWuKp3y4mnt_PE(DtIEx9d1k>>&** zYC7ran@;EwvaaxaS?g^3F8RfK=Ga@^ht2_^l321zzP(982)b6M$oyCk$3c(34mnoe z=g28KWa53{-ACX3FOokp(e|YeVn}5KP|iL-fung7#pv~$7@CYZ60`||kMxFEt;FMH zX|fa?Eztr#GL0CKpr3*dzwcH%dy3vO`fL~wQyPCf#rW%2?hY3^V_sP=Nv6Z^|7K{U zd3)m==i=zL9)TJ3Do;2~1~_B8k(jlt%)S+*66jk!uS-e6TM>u9nP73h66ksOlDvqC zihxNndu1$F&85EZgrhF27o6&XL%1vur>`lpD@obsKDL-Giz>}NYv7{tX){Fb*6v`c zY^I~m3Z;#wY<}-J5B>tKq)E9L$kW=_Rl>MhTn!EJvIXQ z;h8l5%~09^Cd-nHqo;_C0*ex|;-Co`6`6wWLP?<0DX=_B>bcT@@%Z|iw{hbb+R#?8 zJCfd8I?~b+{;*fq*}Hq3Go~X3+5WCbAcaF;%BJWL&zfZ*+b0{MBv^X{;|h_|+_fA_D^pgJEtj7|`oBZ`~)W zocQL%dEa)fnxqa%o$+F|(UmbNX?W8{TkUZ;%RqHua^Lj5@pXlF zvy^E141cy5a&<5YE;*dJP#P4h8n4(q&)d9%vS@6}H7dQA-pymFcq)CD5t0Wd*x|&S-IX<~Z9?jAhNW^We6@52bU4R=4(EVmlM9jtfjPW_1Rc(6mT)^-O!vK6zP_?i z-87k1TE2TNDPUm!T8a(QNd#=|V$;P4hM3aOhO9N=NXUaj@x_~p#fSItf5!Gop+O(^ z`d~Rgm&2v&54Y6>wCO4LuGK^%^xW?94V_Tl+P5aqzA6WbDplX{>pk$n*UnEL9)H|xnsxXT)!WXoEJDEsAlirVC*5{8}ZYI{b`eR-$u z#eM@j{npN!`3;bo7BQ>T6PU`MXfDB|>7YP2W=&FRM!<)=~5E^r&GY=s13Y)AzCHA}O{#cvaUW+X^bA3+8 z!@A*gerY>A9#OWwU;2UELyoBjhjrXR0Bz+$E2~()DdFP(WI4xs zO(Ed3Nb}d~z?+`;OxQ~f94*@#<$ zB36p-S+CTb4*VMQ-x7#E6wk?;hiauX2r$zk%bcmM+6u^@6+w9q)>9%t@CBL#`2iQN=+Z_CF5`4q*s*g z)pO-Xs3%`N!6xeDCe~vGo1Q)Gy1bDtJjc_0Ls7wXEu{KP%z0j7S3(z?4y~|BS&JuF z(?`$!EAt;}3UZgJ*$JpA?g5#<8KBje6KZ8>CqeC^+q;hRcBouxwy|wyzQ9x7s&C^p_|{{{{Y~O3HMk#H z&^Nklsl5qP1#jLNun?C%@h~lHfry%*Bt39cET8)_pUyIF9ri-&%B@1k#Va13!yud? zgq&k5!^B0l61bAe(S2p;Vah1{F@^Q%0-BHgRh!+DiW|j>I+txYcS4c_;%cpGujyXb zikw$HV45Im!5?#vAX@rBjXy?PLy$klL*u5#qMf6o^J8aM8yiFqCk&cLuw2lKBX>(T~Y2g>>m#HdJ1@qg+$Rq4?p>cTC@7k$_(nsfi*i!a6Z z+#uWg>8g-lxe^E~;b#@aL074`RTl?s>gS0YoHCs`tC3$j4Xx`|W}U5nKO-$x(Qfjc4qBx(Q9<^iS8LDX%s_N$^DhoN(Y^^+rr_{r3w zP1e%`uDiNXtx49It=5t$I?VU{NHR?JU0N%uXb*W0IU%dH?38* z8Ew3@il1A%sWh_6owr6SsiV6Ptv2*`u2o?YC9LffWb+n!`hCvyl`em9*gQMVrTTt~ zobQfx-T1gR)UBU=osSF6A8r@R{4>*36NdD@1MiipT}C0kKCm3`aS`j2|>8YdL9%^7x@%^iZ1rUQ7W(l zL)YDIB_Q~?t)9)5`=#P!=9=w9oD1$58Ge%m6!;50GZXMB-2{Jp$!c0Uh%5+kk~Z$* zQuu!64yAmmvpWASXRQ++%5etaw`x&aE=g{OaUOBVaLx+6H{7`K4x~`M>avZT0mMO9B(~Z)a`o(7g1C~Tc0vh-uo z<*)b<|Xw(?K->(sj zOk`s^#1q^ma}F4(l+90zb*v?y;AetF?t7Pt*bz~!>A()`Le3`4j-5_*3~pS-yv2I! zR})7&CElisS9ovCOQpH(x45^mX4O(bPFqD)r+D`DJ9cHkNRS=t zwNCFrbV4Z|ZhM_q`a8xjwCFvjDTe6M02F~~0O16WyZ-tZNpuM^mBv~B*T?mHU+K9`7TW+{IcK|SMQ^8p=@_NR z@CaiF0H#~?&w-?leG)ZPgHHgI4H*f-C~(q@rx z;4qr~>j-fa8Hg}w(jw4s3;v%^343$0H&y@sI6ed_{nKCLR>uSKzzimm_W^HGVi}ym zx966%`tylxo4c_akU(aDY?S**fIw^zkm)3fjMX0lq=Ny@{dL%XGO>Tm-+M3;prifW zl z-sB%Yox3|?h59SusytsyrZ_`NFS(}t&n#Ov@PkL=OQdL}CYXPZilV%$q z=U%R=G+mH!LhBCVbXTD)Ht^Z7qWle9?*jd_>ol(CWGOOx_d&XMK;Vv%P9>|+sMM_R z$5ob@&RcQYQnu(=u@|L9AJd^TB`h)39-u#cGiH2Ld-dM92C4JWM(m$>DE6Zu^U_| zxFEds#b!8TjK>@Q0tr^_TELsRAnmz& zOq2}XV@l3|0I#o$AI=O`H$vU9zxOHZbJ|3V%D#M-Z`WnH>WP$2$~XX>mU>XCJVK@! z9}!~{e8d_?OpzoJO~-|4aq){UzZbIxYI@%i?B{gk*J%>IP@&+be?lT{lJWcOxK0Wd zexMvS$`QXB;Hm?u47%#}*=M^0DxQq{))g8YvQIN^%5OQZj zy`NK78X^A>X%8YED z3VcN{w5is9T%lF&`k}{JAkGKY^5SG-Y9=a*pO-&U?sduW8cE&EyCZkGW>-M0TnIjY zbfjK4YLBfXcO|goRTEcFt-Bw#uc87r>FnA9_}8(r>0>(q+ir82nK?PxG54MePdnY6 z@k!+~ofTdIC7k{sL^_c@Ena=*Onx#}rFDQ;FID?O*;9rCA5MNe`9*IqAdmJV-OJK@ zfdX-pVfD!fBrdNkmE^=sY;cGaMcjLNPQw0$Sn7DHv6Suo_$1@Y9*gH=vw+w#=}nI| zmq5b!3U-Yxnn!8r>UGY<(qAclF5#B!1;ohPS!}U%$;;|b2k(CuDCjoO&{XHL)vLFS zu6-;01YhiuHnQ1vb=;K_Ib5D3Dy|Y2`!&KiI;NzslzI4t(Xm6B$FCka6toyfrLS=J zZc4~*I6x@xs{^oQ9nM_C?YVL5lG5kh@ zn)jNCqqnZMjDu|;-iqUS_be&0eNvxL9DK+nRmn2tQCp2Ki;VUpJC_=FE~GYxRh>WT zZglq==L_#LidFAa3#xjl%4K)8>Z+O}pYG`rmBUpv>q7TKk&YLiYaEKCW@2r4?2sab~stVROnq* zcGq>rgXw6GTzrM`RA@MVpbI7Fiuye#EhGad|1{iIbyK zLGJzJw9GVHTQBcp;fF7>;jeo6VY8y|)x{jSC?nj z$zQegdUW2*OygMbVGzGkK5)Uif}OP)9s)T<7Yum3Hr=?h2Uk#BrjSa0)xR3&DjJ22 z`rF7r@2l3V`%R7h5_OY!Y;-$r`$nNwit?%1k$r}W{5eIu_7p!4Z8=CR*(6@h!DmYD zGARf~u}g6L8KW9`+==6^X(aP2<v2DyF`b!lQ^K*w?T6BB5l-Q<-`e- zsU?*hUXO_OKhr9l=j$l$HbU2uT*u3$V6V!BiP=VRV*%W!2tU&@jT5Bb4|MPks>~(G z;%W_Tr~T^&pAegtkgoWQk+NE$e)(XB@Xw7`*iH2KhfFj?Rdt+U+N9?s$Rrfqb`=&z zS{lok3tV_K6_fz$^483UuFb_9E`i#hCX*Mlv~Nx`@;kAI9_iBYV<}id1ja< zmO!W{eDm*?X`cKvWa9Q765*P>HdA$VsP9TojqK&tw)rb4V?m~qw+A(D#(h-LbV}N9 z$R<%~LLb>28L!X;t;59=Bws#sQsEV%LQhyP*Axgmt#1uWd;KAYv_UD@?5p+R9`a~I zpF!Om_3KP1`977CI@G=I3~_Yec6E8L<^j_YOEO&bsMfJS^_>MOQpq_WckDDaXNabI zx;`+jUHjc6EXxnSmi4KO(k!T}Xe6L2{!M#4sl^D-|FSyN$tNvYFo*Ki_U%2}P}O@I zgzB3MJ!g*Axti-Kz+~e5`6Dm!?N?^o3C~$nW@pq^X3xK<=nKNAA7nZ+2qyPPxR_b*!B$3Q&vaa?j7v+Mx z=)OImH(R&Rb}Q+aM~m_yvyFJNNr^?h1`7VhNcDcLdhxj>;oQjkNilaswRr?RrKi47 zi@5uQal`qKThthx#4PqnM@?)$x%l$JYj1&R+N@&aBrP39+8|6t)CXoIUtGsu_vDO^ z&SXmwus`5)xg>j(S6*5<`Z=4DK2QnM6X7gRO&-5++AWmxH0Jx}PERR7 zpSeD%AQlNi=cFdhh2z4GzUO@j<-Bgq0|{1Ui)y_+NAs(y&bz8e{H zxtMs3PbQ)9qmyxPe8xw}7^XoMyFlQm!#~8VIVgse+Es?M!W6<_VG3DH4m)4DfLA^f*@R>TL~#QR7gzj5EG#M&}m{q zAw!QSJoQIAp0flZm4-GK#{t7U^$k6-XWD*+>Z$>Mr-@c z@L-$dGzqrsXy94IcZ;Ak+4#Y&8P8uqA;!hd>(rA^1xn?SoKWh+Cy-^CL^`SsudpIj z_unIZ|Dj~;&of!3_sp;V+vzd?3qG_YUg@Y8v`f_FYh(kcU(?)(m8*lP@YRScHE0J| zV8=^qb0#ScPj5%4Y9@SLQ`|tJY$(YOZj6oI*F0{2`(@_)W}#>PkF*f8fw9Ry=M*t8 zVns5yMNc;GMyJ|q-Wy-+G+Zez4=xnww?OM<>y*A&(Z1JWCI}cznQ=8|#PJWV zT@U*lS$>Y5m6=_6l2cd4`+dpb@%L8b@z3kM{NcqNA{^;SsVO5C4uIkcD{pWV)N<`h zhM8BEC8fuBTeuBXnf4To7U>O9d?5{&a}vs*{FqFtb+2W%kDm`cva}I_aLCm&HSbkO zo2(|J4ZA&@7oAzSQTodA+!G_-61HsKyt2w01sB;QLX5ays_?wYfw>Fvg9?aCH8j@F(kH2yaZi*p9Gl(d?!1y zb_O`KT1B97F8KO|a54|8U2{w$k>}xjPMd8t@_zqMpXwQol99x-I&o1MIg+vJocBcx zoF17S@ujOT+?g-+nJ?=(TD>v5e)A=vwXo}`UiLoy?H_8Ke=T_pIRk*o_Jh7d~P#_&Q^S3!lJ7EBw#U6J|!@64*Lp5-|A~n#IIMHW2YuO zh+~%=GtF*7&P+O;JUx;v!mjrwQNUYBT2#JLD~RdHhUZ6kg2`j5?@lx-$k1jtwv>2z zP`gWe1LL_R0BMQ*HX#jDLU%psq4L1Ak8?EDHrXM3!2h!Q5D zo?6mvvpFWbD5=2VHSF+u*>TgO?Vw5vhhgzN^sqxp#Pr~&4Tw0_qo;KA2-YS+NU03( zX1#Ar@=@pQuX9E34j*`KVqBN=wrd41TC9;MpXQ1z5H=0= zsCVD*+P?ITF<&uyrF_y%G5Q`KefV(|eyYlB7dsWn;Rw{kl^ z*2KR8dK3&@HCLuVL_EY14X32t%{Y&g+`@#J7PrSGJOYUf9 z)?JYwUYL6_xPh3Bx^Rn&Jax}qWvwGgJx4cX8|ZLio`Ap!+9R|zteISNDxt_(gS<9tO z#c3CMI$pZgqV2N7oNa7M3KFh#J~XnGJ6-hB5%{65@V%dPkXZdpu3AMO`mrV}mD+5Z zcGdo+PjJ*dZ3{0A?fu!o_aE)Pl2KtCJr_7lQoyJ5rOp2z*4{gs?f-xO_v#)-hidJ% zwi=~I?W#=)wfEj4W{e0eMN92XQG0I^#HiYP&xq8nk;JHk2JheVb~O$ zd%nltl03yTdEBr2?Yb^<(;#-`;eM!BWUG|<9w(+1=izQm(rl+K0+>@BCnk)lj(%S1 zE*DZrS|>Q`?O_;W^VV)gXEv!TDJ-%ICLaHUCI zz4*m%BKPH+;R1YIQs#3t^$dJ(BaXt9+U74$aOaQ9@xBB0?PRdw?hUZcW8O$YXiOet{SQ>lfB% zav6pra>-fi?z87QSaV-Y@(c_^W&`7wX<(Zqfn!mr7pxIIlMWTT8)G&?dZNvu`4ype zq5_x3S7!#FzuI}RiHU=4%36`wvd;2}uZ9}X%OAPECh|{9r+np&;Cf%`^r!aPD}R?; zH45Va@F`*^;UzKOQsdJ9K47UgPY5_}#o6-?LR5n-L}9nqq4K+NfHY2E%bVZ}HPBjRr7hgX?jj z%-7${RwlyYGnrM}RfCD-Gnm|p6hR8N{nEP%*)(agsNxEyo*z1}JZ6=woRId&Ted?q zd(}&PHf49oE$}F1R($;MYHm7)(U0{U+W|ZIhN_{N$CMqZtZGdyS~81QTRv@e3A~us zpZ90*=dNv8AUvO+*(_bJjO@`E@)%>ApCe-KF?EmsI;z1#Gmh zAj_H#(&D&HIm8+ktMi3Sg_#Gp=@!SmNK^?t=2BkHBP^K0}FL zFyEM3rpGk#OB;1sX~iDOpM7tvK{ILdwHr6Opw>>Y8+PaI#V6UR?KjUTIc zPS0^g+^#rN@q4DC^MJ#!e+&wBKj_F_OUkTVadi3XNHr;4tnschFX(^76 zMWgv?3#EOkh%Wt&`dTG_tL*iT%icbB+hc>8tz3Q6YeqXpNpbYGG8ZnHqo+JwHTZ821Q6%&`;XLk z^U~wXRj-xa_z+Je9cif(lz}kYZ_6FZ62<)?8K!1|D}^;B%ST`IUSZP^u8^#(7fwyk z$0#ITeL47FLp=9f$2ZJ@J~xJ-{L>iJzqM|=Bf!!ucomz=V|N-e*~xH_jng^Ya{*W4 zZi43gI5hy;&~~lx9q=2(#eTbjpDwZGse$`JA_>!aAk*q3+p34Nlt3WF<(J=t7ytv7 ziZ1JT4WXJw1;VZ;^~{2!w0`Et(F2`irm0=)^^C|OvMu8k4jC>7AH-4aGsLSKLhGev zy_w)m&~L~xkfUOqH=+y?&OM_ zb@c`m^-`Aqcg$$eou1L3kylf@Hmk3%s|3>21U($p(b0KT>Ctsfs6vfzYM@JBkIv!g zKOw-Ag5s`cWr>Jw7zI_LK5dxZdnvTOixu%2)^;|f6LP&>E%B&-h2^8uA4aCKAm6erOU%a?`FW}z*A~RrZ=(}j}xS36DYW|vW%dh`XD0BfD zDe&^D|L4N~52baj^dJ^jk9no9KWu~p+LAYJISJ7|GG{#X# z8}>s1<~d}Og&Ih~sSe)=P17)_i=pGA$Yp8w;urF2K46ZpOLq)3P<1wjYhQ zwn0o9rC8>W=nCPFDLG4vYES(`+ii36#Cy%&&$)d;ket?SKIp0G&j*wT;e2lOh89^Y zCTrt&CHDV$!9npi`e6t(ZrQ>ze2VHq02-Y?a~Jkd@zdYRb@K+A^z?&Yk`BjsdpvO) z?AZ!a^R98hTgt;wD;K0ya2l3 zcekn}XbI1UG-7-gKhD_A2R;{MimEQz_`#A-hUNd?wS)Yx^KOZmEKCCFatZKFTVBnQ z1V$xNb5M+fa7_`+xxURG6E7C)?GXebTfy$_JPiOyS&sm6>)Mv3rA z%!Wh2lLo*Dl0?i&Mx)V7@{gJdZ$GNP!}~m3pC#%$#mxcg5|8nfbkw`TG}PqTM>RlfH=fo%<=n;qsc!7y#ol)g-fJZgsjn8+;!MrkPx`iR zpxv{Q^W%8?LJhBe2%w$BggA0fjF9#(4Am@brF0AE*NvF&$(KI;de0*;Epf#DSadvj zc+*S5>{~cx22+Z!rms)L(`)v-yG5yaU#%#R?)?3zL6HWDRA=MO6ZRysRv^e82_}Qf z7jSd;y6j%4t}7`%T36JjH5{kkqaU=>G^!CjDQ-5IEiMm1(Se>cfs#h}a&l+?tgp1G ziJs=Lxt^5O-~fC`$$@|Ldt>xYNSONXb<2q4^&FbmDH7*%$eLa2PneI@$q+n4f`6jltoaHf--QN7lpUwD5RPAd0>}iAkz2^IR znGBz$4`WoO=9$RBj9FQ5OOVImd~E6qOT;I`{Lx{%MZer@?qsE^iLbNLP6cUdC+03o zpb_mqPQg?`i#L)4vT&p3yf6UiKYCYnu-%MZXvz$F@pD2BL>${lt^k2Z`TF9n&{NGprl|m_j7o{Gi*U6tOKUhoQvrvsv&;SRHY(>CMp6NhUiL_~@7S;5 z_DE-op|@C}Ie&BWeK`M&__H7yx_d*Hx4up(@iG)VrT$PozW=qxj-YwmQYhN|O@M$U zcLq=4{z)mX?*7F~a)3NbPtA$txkfvsp`Nn!@O6ZEiowQR^dif4^Kgp=)+}3%a{hrj z+l+cyLbSHWld2c;7Dciu8^hEZo7IMk_mn(az-XnSF!NLOB(2n1m0ON%x)gmf!Sv8O zn*WH@sFr$5LpoE*QI0lCb5cNaf0?b^F)0-pHh4N z!*_MkFJ9a-nyJ!CRJj8Dymc1Cw3_b0$4qaTdVNtZETSEXnw=?o#*kuC{QVx4W?-DC zFIaI>PtQOfq;sb)eq2;>YV=NzhGLyMew?AFZ}%St&@@H^b#G*&_P7S5;_6BXp%j}e ze5b}sOQE)=dL^R6cYUT30TInDGg-!4@?=)3+7_#~HNh>Ei+I*Lqps)F8y6Yb&iIr{ zDxIQ%@wllJK)a%%%r%H;&E`TN?fMcwHgf1=D*(4|@l-c%1eZNvNGF4KoAeU{X z06xqdro21GYk5mpH0<69?^3UVts>T8I`T2KuKrnPr~mOOC$=x-O4GD%aYy5-<#2g+ ziHlSye%lRsvHMsxs~bei&r_(T8R#74QY0AzoQtAkZeA!){fA=i^rC4p((=Cs0{>nJ z;ycS*#@?11u7tT(ipTDJ@7iC%?gj%sZ{OJQ`3W4$kc@t-?fANoX~VUouUf|8kCfod z(#Ji=I=%6w2W`QIv$f81pD)@Wx#xYI$&Y__W?)Aue)W%0Rtric0yf-fF+&8!zLiwHFZj&rIdTA%aiP0k~WgbVa#@rWt|Q>D~~# zT>oKTTKIC#=Gf?6lME;5Q9@ygIuJRj!so^}L<3Zur~iBE`CkF8xqdR&Hn0_72-yfj z%Y-Q$OKs{glK(lM2o^r+!(e9GPZoDtJ)Gngx)bKcoY zm#Oe8OXeuh1DqLfc+AD-4o9vpOc7+4xe{1by*ISdNYxLH8^c zFKu(FCH)FeT;-^{t2Esva_MM=4a7R0xgUiMv?oUV{5`s}AYqoG$v_i_Tq{W*n9vI)uYkVFiC($|h3)ZoV;4Zt5^^!wz73MB zkJ^qee49uD#52KWDVESII5dZ}xG7#OXuZ$JWnjpz=igH5IOOP+d|$@wC3_hFIw}+V zeUL|ge+$O>T1p~s{)8m7ht1194c4&!8(GvL?C0n0Zc&p|0Hx+yFL_7mw{jneb3M6S z?!(LWlHj;0Pw+3m9S$;`JlX69}dO_Ob{@#CB0nadZb7Fn77 zkS)RzW>ovsg;JV%9hhg4m)Zd}>9iM0>{l`l^qA2}OX;5$o0`;AXZ~bN^S{+ek=FoD zwE4CNd%q%oK(=n`9A548gx_C~qnE7kJD9Q^OoCQ{DZLr$L^yyAd7E$_&7Pr#);zKPm|3#Qq zK??zn{SWE>S>WjeMu+g&)YGJcSKAh6 zJMFkeS!v>Se|D$JIY#z%5Cg8gDibf$-L^$wDLVtnxowq-i;yEdY@I8hkPx>UyC$W_ zGwFJfRQz-{w*hrDH9NBa11rou>OAe5SlEy3VNF7(0gTGFKY#${5_+(o{YTtg<;2KZa? zNQSXa)&>DS((vo&ZHp)HYy@)7(Hp|wP!BE9@Krv+yr#-yS?zD4-WA4wDvOLE?j(Y$U-0shX~A%d*d;EMyPnp2!f@THSh@ToaDNqJ z|9=5jFNi>UE1dM+85%r0hL_M@GU#0|cX2MOu`aK#)7}3)wJ-C&m49G6*Dh;Z*o~?E zUKVVHAE$kA$gH1r!8@qU2a-v}boT#Fn*lV}y z+#s!~nke3Y4PlvJTtY#{46Vn=Ky^PFuiuaj5fD3uwb1-=?T3}Qehm}yh`dS`)w;@j zQ=)jsi>QeKC{UHn#r60o+E5Ix5qA*h9^MBPMVGwq|(F z;drL{$ANMi#s$F>(oEMvXQ%K2e^vsPIcNIk2I|T_`<58Z;NCq_mK0aErZy-L8MAX8 za0^!kyd76Q_ur($MIohbP&j5}Pt}n8V-;*{-=Nxy>oX$fB?O$P8k> z!?|_Ny>GK2w!ShJ29@+cx9#32Nrx`ve(d-1$5BauhdtprouZOAsbHR!_w#L z=xQ@zHP42szFBBr(Z0Q_OYV+h)5pueHJ7uKNKxDde^J(n^YCaIQzRrkV)@OA`hk92Z$kf@^i1aU2plFP{>bgiU#nNO<;36>=|Bmy$%G>XcipkkZ^J?y3UHqeJ40;qs zx7u{SPwn|(RYmM$u|A_8vNfwy5#Md9xt0m=ZOPGnn%3ol@yWVMXsTZ~ctt%%pT7a} z!WueKNMSI)+w@qTQ4X5(w<52BIUEi1D?HsEG=VKcw6dK!1$ z0__;>3v%0uU0aaj2$m<5mXs_rPa`b1fiT>7ORQ;6q=Ybqqj!4H7P7(M`Qi{qE1v zJ$S4blyIpbQC+==_G6uv3TsE@w%h9_t)S_GBMO$_0CDeCoWs{Et58dBEvVfKtgyD{ zhMq_BH6Nyr=xOpH<-pfKLP{gSBcn}==>7&XOAAP3t7=TCs?A%`tNeq>T@SAff*!n8 zJLkRq8?@g~O2vIU8G-d;TclKYkLH_Pf}~z-VlDPOI-3n%Ho}63P=W4glQKVe8!ng& zoucCy42^o#{6KHq@sSlhwtlHQJLg-LoGBr`Uv}}o_gGdc(Z0!#gr^K_kftZazcI8% zlvUD)_pEcQKtzZ`BdBfvG3;S4^X6>U&}@0PCso&5sym&b_(va)xT-^8&UmaKtP0X> zakSDqVt@*|E;8J*kItD&B-}Vudt2^{9ZcQc$#DgdU0e`;>JImfQ-T+h7#X z-i82Hft9pOm5x-y_(7O=JN}_2!kv3WwxqWymj2t*GP_W3Xks7b`?`cryNVrBL0r4| z{RJ2Sg<{=AzCSnH`NndQW{VU2lf=D}UDM*~2 zw`Psv#5QT9+|F~*O)VOyloQL`HZf0B0#i;u%F@%8(cjdk(b>XWtTH9FTr9}+k^6gb zL;~|T5559{hl$is`e|E;j#gf$^ES#6eeC=Ue&-@l*@n82_v`qP-?+-0+_MH#)=f(V zXqsP;QI7+O%lD61f6yivy3mC?88WbcRpQ;OCO5C&by-sae6{|4Q|E;J%S8ZF zKehl&$ui6G;06dX|C&Yyo>J|;D?2}*!IYXvFcX10fFI+YN^>o-2-13ajo@CpBlm^* zu)!~tu^9>(PG|4MeI^#O@yN$7Wyf4w*u4{r7*mP&i>i=*B`WG8)JC&?^X}FSx*EC}WBDf>j00C3E!{3p&Kt&Mw}5?L*_M`R z%jTFZ@uUaIx$9IIyXS77sI+V)^ud7Ux=nUUUs3GV6*UK6d8~g3Zxkl(XsUCqc-&fXOpc6f@a-N>vcG>Y_9QLVZD35!_B$C4($WX@@b1PQ6 zBrSMOCQfv4XkL2Sno-_~t2t9)wg1-hjwh7z34c*FXizD*9;+>-Vo_1L{6g^k#YM3STaZ700VE zd9^ZPVH(beVb8{u;}r~zh!RCYRS^wsfOeO`mZng{Jx_V!#1%#Fq1=_nBTPF;9Lukx zag5wIlAsL)sazi&P?tD&`P(TY&$)P!@7#64#^AjXYAX4bIp$GW@ke!g?u4qc7dt79 z_06p_PsQx`Dg|V}$HTi7wG-ymXTx}Fe<{J`5(duy{?}fa-6g=#X?V1`10;)nS!8ZF zjAT3FEy$DAGdTG}?p%wI^1zjw_3J}del5k@9ifkHAWTi7KCptT>Cq6~UP~oT+0@2r z*(|pAlj<|T4wJy_G+&dKcFt)jbj0Ws^b!{rDkq5W4PL<4Y;GR0iBEOkYz`NNn~Qag z+jw9~=0zLzcR5Q&tk%kweQ_TKr`7m5w5Yf(QWfsxk=ExUb4|JaU0@nop6d1=)t=5C z!G3iHosYp2G@35;gY5P)q^{mxLWAg;=tmFh5uX}sau%4=9GbKj3mbxYU*?}9q(uY$$&?b{%(U*PXAdO7VW5J?=4Tg6WI6agm~=$L zme~dE=qudoSj`X}N8gmrSD{sf8BACJBA3svg$$*XVy= zKP;UH47C!#_E&K01Q^UjkZJB8ZzIn>0pKiG0 z#VkXYHPRS)p*i~)u{~Esbk^s-InO<#KS28t81T6mUsD?X zRu8Xzt>MM23P&(}yHPy$3S||G5iYi87e9hVr8&5(3bnM^J<{7r?9&vz?#3f>gD3el zaFzZ`*ipZ;4>;LgT)u@)_@U}RP5aF2%H(UWuPzq^=jZcbPeHXw~v`^ zfCjJax!rpQ#gunz+iv`{$%_sB+O5Pe9R~<7%a-Gv84J#Nm3`;&I0m;yR!$dLJAu_p z*&}>LFv!5V5Z#0s)^FX8G9NTWdA*j%Ni7`J=a6~#{&gzX+&u7tl$Nohg4?k>`yKhX zGBUms0$~Z4!UyM=f2?cmuYyMW7$m0hBJVDuBCpQNgwzwU77DGfn~aw1#$OB8RytaR z9t`rR^2`B(VqyqAPyspuip;X*s_&5VqXa$_H^dPy8g`&75C>m^tu?gM<<}wZOE(eG z)ep6p#{6jySbB19Y~r*0MD+VmdfrD9DD8niu)_A)0c}|xr>$cINJYR>CLUG(nMeb$ zP9^5u<|t27P(%Fzsi5Iv+YdNbID&Djsf+F1X%PyKg134!l`;q3-gj}~xUT?|Z2#`G zkyRua+})sM<*kzmOV2;Mt+~`d`ox@{U~4JI>N@Klfc!>YP!Od|FGx-D(Krb+%31PkK>@a zP#I3c&W6TGXw863%~2;5v5aQC>8RIr1aee}4ZDtkaW**Nq?sKJiFbNG7d`SNJG@hD zc?hDfI8J^K$TRSL&{okgx>3C3J>g;+JNt(mS3uS$qpRgw85t`BNmru@^d;ZRD)DAx z6AQ2x?qL4yCF9$5@fUr5q6+Z?!%v*Pc5wLvH9_AMtj-6|6lVS3xnuTXcUNFs48+K11Lh@RW8kXxC6NG07m>l~?Yaf#VN2Ef4z!61dVB2r!NAM$J>xp| z+ZZ1X)GYf#knPGJ!;L1yFB^~6H9%8;?&Xv&q>qlbnS^R?wkh}R!i(ymDF!E)dRxH9 z`gx11Ac+m=Dbx{Jd14a-JQlAk@XzyK&*Yz~s-`g+ZDpOGt)Nf~vo|rDL6^#}YhmuM z3l8@J#Ob`up!Y?-=q-$whW(KJiRzR(D()AYc9+_?Li~P9JHwHE?t{X;0MOM_p5xsh zA_0#g{D-0y%G%K)zJwXmGP*T}ju|S(HkAuxze8t}(MJ4N%kr9M zphPY;W-VA+!BHuNqymBr!qU9|Ep$Z-kpyoEJXB~|X702PPZM>* z6NIln`Z!Y}w|=u5l!WE+((}iD3K=Ffkkbf{+GLVC#E2j$PSx3=CMQC27c-brw20wC zzQ40%{OrM;rf`Kkw}85A_J1h!TMGR0wzPaQo{Ml&wO`M_@=`wIE0T{Un>}v7U!UcI zOoLl>x=13|A9o@T zP604ytTP==^Bn^?<>p7h0aQiO{6!^eXJjgcC@fVn4@ zh1JnioZ|@5#TD1IA78XhKKYnxOC04108umS%-G^VD-diAbboAm++rJV$keil{4r>Y z5KzOR`Q9&eX&Pm}#p^0Qmdr>gdyIfmP%2iQ~ejQUXKhq44nGd^Pi{Sjn5tzti z66Q{;st_I;eAPIWm?a}g2EM@QS5k~ot~~5$9X|Mc>wP4`IPZH&k;LDDmHZUnAJ7A# z`G?)oO|KLl=t$g5)-4T@_XJi6Wk!@q%q<3cEiYKRnB-mLS}(=&o-WSu`V{*PL|$2H zH~5Q)1w)T>lInMc!r`ai0B{O{U|ElrnsI)4{+&0Nsu{3WSe*zlyym9OV z?bz@)?Rux!mPy|C%xsP_bXMGbV}Krd@ol%S z-SeJn#jAm52R7 zTl(nORJ{G2u(+qMJc+=$i^LcfB$nsevX!*dU@~(1Son=Lko*QJwX(fhnZD5pY$sM| zlEgl3Lbn&i$5e1sO_18I4sd1kPtisUTdV40_K;|Q>Z_tpTwNwPFBU@BF0T-MnL`4C z+|CpZq!5WbJ9U_k^E4fj-KSNLj8i4kU+R&Qhmn4=D+8Hc4aKiSiTbRN{AIaL@B}P- zkfate*haKZ_~#BX>b)js3ag>>YD*Q5O2iu%UzhJCE#toAukdv!W2`QD@M3!E=h)_) zn&al+)Y`~UW}Adu#d6mPqTJA;$^aFU#iMlaPU#y$wu!(*G;M`Kz)(jA+<2~0Hqux| zAEXl0gq0enZOPbkvSejloFJSdAP#z)zn^;&{}vDGR9qKS^ocRluj1C`MhXoeg93M(sF@K2lb5xk(b!*CVKVhHfl z|Dj+m|C_WbaQFL*x>4;UK_li_E}i$?=JR^B`P#!qJP$ea-^9HdziyhD{0%AxmucOC zC5SDemd%Y*Dd&W$=YNIQ5Cx>~Kks=No+Ikj!eO?{R727rm&=}Y^zK6t-kr!S+3pd~ zUiO#Anj6cfemqP4rgT!2*k4BgdfrEg$ZDVZG3Kt z!=xM2Vcj;O*GD-w>>V=K>>BGLouh7x+&1(`uv2u1e^KbBCPI*lK3i!R*br`a)#)HN z6#w>Es4OK&vc%wGTNj$Ro|bJI#h#;2|EB-u+00>&t$!P@cc$0xq11)m<^v%H*-@?_ zSVQ>>xGEy&NleIA`BixxWsw{C*>;gl9cSPmoTIb#SS`-14lj)q?j$Jy9=8If|LZ_z`_U^niN*hR2;^1l{B3+dKP0Z{?p_ z`AX8W8LBS+fL2}ia_$Qo%kf#AlMCFv_&>x9|7+mN?Dr5})(rC9)&2p^Uj60tzke@d z@ExtACp0daQAMRSgWz*z_xwa4)Kb^B6yR6AwAWqAOzt#W&FTuKgKeKfY(GJ@7JTNXFyI0z3)O1v93rw4$!E8cN#c91vqb!^$E(-=49K7Ac{a5HS z)1_dOoc~Y+tw{7?{g!$lzf6>$yxWX)O47JeSwJx*I=iC&v82**ixAw|_ITx@B>AF} zh{dB(WZ&_63v~8$x*+=(#Gcctm4mAs%Z*qgd+Vxr(V60>;B~bn&=b{DiH;7QwP0rV zZ%A!oNe?y(E1Hk5-17Dyn`Tfd4i7PuhYF_<00#C{!kVjs{UGp9d0 zrO&UY?!x2pU^xLkH0cGOK`HMvfrGXLjdM&FdV2Yf^ub@haHujkD>*nAP~IrAnqP@d zY5%({dx)aL;#r@OKaS@@9X8XSBI`Dz5$N@n73J_uFb*uhe@BJwv^QFlQb>u9>S}F- zztI|0aFjLLwB!u%;S0#ci(t8koQHdwNq{E?nB4aFzloX}1X=8BW-neP_#qaP=ruV< z2i=z=wu@D3{PA|(c~t{YG4z*&&pEIlC|mW|$I=2qM?uH`tTXby`|G}y6k6wmUrPZ>xE-+(5d)yl1U z+Fa_djP&>@$=*AU`d!_L!)|S70$OJSkto>Gn!6!zx7;g0^6Xd1K4s4KGI_4zIta;J z)|QgE>Ad$ek;7iaK0_ceu%h!k@K;9QzVRSNY6I74e+J-Aj$c&42`_FbMOfZ1MU z1-6Lwl|Z4fcoI6mHQtYL_|jyH+A`NSmU}ky=L=U?j_hg*m#1G6Wdj6>i-m# zZx89kD<|O~jo;8i6Z;MO-?pK3Xxw}qc8N~zcPT?@v*@$Zq0Y~!Kp*|G#nF}8=RRjge7fiBLw!y|$c>R%KO$`+ z{m=UceOVqOP`2(6nb||M+z~6)#oq6jlqCtXY;)xY%&T9@uhQ$NHE~CXG5M{C=;vih&72pvknFG3UL41zCMNa0juvHU z1-{r*Y7lBUbu1Yy^qCkpYP!qb)4gGB`1)9E7LLPp42O)RBGIEAdk=^I)O`-^5xrwl zs+uVO#7be}%F;(Sy&rN=f^7gfCHT~IyyaU7$pPD9i8jZ^3s$))U-)qxk2VW^>B;(2 ztY!YNt0%!ZLmv#@GJ3E0MUH~0wk_(QHBUvrQz*rJ47 z-pc3QPn&4A=gaRM;veEOAv4;&)c1a7pqDl?<-JxsDC5e9T-lCTD7UyPIL-lqC9pMP zZ5zYg?PGk{8!BBm6CN_?Y)}q0GRR*YuKBMeo4?=exUcPl;@~ZFn9Z52*cxZ3<9mW8 zs*@6fE5UEnsy0r&dC%rAcZMo^g>5_vV~ti+7Zqw`?jYEckUI4KO2(ANyG z$GlG?F|Ow_#xe;MI znFJ{%^w~L;_&bK$`4m17L^CH)lK7(A~gEq5{_9Npbx8nZE-!CE$dkyWj`4Iz*_ zW~O-a_W27<&32O#30bBo2c(S4L`FUBwBe{AFwvB$oQ414Qupl;Uj?v?^N=M}ZiVFD zmS11zpRH{AHj=3F(WuYmZ*+U-k_->(QH#w}kIX}z->8-tqm2ogfe(ZjmygVj#Nfh^oOnNy%z9V%$GO|lRU27(b=cLgq% zjp4XypVJ}pNJIw{uDt@VrT=7n@ejCHb>^O3@xWLLNP`t1jTq0q`xy4JCY!IH?=`f$ zPGIsHfS@v^Gu!#arQpF{DAck}SdQIW=J+W0{sjC>gRr@|sk{aP+9c^-wVNT6na&Yg z{hDVgs#U!>SryQR*n&YJ{Dg>fNVMfEB=zuaHfoxA{2(j%+_@*F3~^~Yegs2p_d*>5 zCVZ$b7cIp+O-&)xp?lPmc|!&=u9I#ir}jS`cD8yoLHd-MhQKsh$;u{|*7?JH6&T<$ zEc?deWb`{)uZDyOVv}-NTTxD=%L{xZ(&jxe=WffTK92B}u`dk)O;urzTtZty_Lp#* zbdcMopVUnzm116Q6qO}9qyYMi2GkO;f`m!|QGw?Zfl|enGEk&CvGeE<@BZQRxE6Kn z?T9TfUMaLe-u)kL}_jIg&Z`kWxI*3?& zf@znS!TuJkY{-DLEn?Iz$m2whh33x2;?JuQ7Z{O0S&`l}tx;;>N@lM7MUw;CKozPy z1h}F9H^bGx(q2nHZIWtyH{&p0bzMKL)07%p-JR0U-y2X5tteV#cky)`2CZ*whj)8lCEsOtEu(f;SiPah zHs0g2$0MPFwOG6 z!_)vqEHMNZo#(KB3aY9~-;v`Hpgpe@y%jRIjfde{<^HabvF+Z-m)urvE$YKNZi(_A zSc9<7zYfz&%sMxY6;fQCP4BhKeH4-gIevKNNG*U`jXXMDHoC}5sp#jw=|#X*c4AJ$ zeWjc3+wYJaQCg2}5U+KnGnfxO?iD5Ize`e#TOII&CCrb0!!%pYX!kyZKdNJicwtkG zbsgFI7B~&xmk3GJL&LEh_~qQ8a3f*&#}gsO$U+aEDnVp&>fD1j*Q%<~?s?^UcTVaA z--i5@Cr1Z~u|ffpp4_*B`y}mkFSXea*26RR{?SVPIQEou#C|qOGknq1@RpL^ zm!197llw*{utKsd#`uGyRk`$H+;yFvx}&RH!}+s-c$JaXWoE8u>XNl3+cUB?#gp#> z{-}|#KfWgX_K9k}!O7fRkM}>d5@jBIQ29lsHuv`9HCl#q%nKV8jUSv&HiWbl2p!3q ztD^<$f=|5ZFl4knF)Q5x9e0~5riVMYKl`~BJ@X=M$^AL=rt@A|x^-Ffql`1%&uA)B zTF>{)CyjoV7S`M>9>z}`kz3O}Yc|^R4H|lN%S-c5VY-kJ*md-EmO-@ITb@cNN z-S$4Il`PtbG)+UA_IUPd%7Y6tQrmc+KFC~aeDr-?>uWW3`Sk0Bvbc{GiW|@0kW=&! zcd?C_XKeAviufv-_GB4B9hAe+n!xg-T`qz4pv!b|@|yP9eVyZ*A6dSiu@rdxX#8?I z8CCn5cgShz$ELB?op=DyE3zODE8ogDA54e>F|R4oBJ zyNW&?0k)RkPj)vR@Byv>pF*?zQ3Mr`U0r*>*>FhUhFt5W%u5FAw@Yc!d%7XJm%vBl zyZyH1m-82eS-H;#*{A%umD$W?3{$nZ0-R8zyY zy!w?E@_vX`WDh$ULbvu){Xi18Fp*&LaITY;?UFaB_SCwW+uMJe?a(@>tqtW;KbaBnz@yqPI_M9dwpSMH5u(?;R4CckN znL10Fa`m{#cRzZ4nWf{RHUd2g(_n-W3>l-@x@|-5g3mzdty|)LrUKc08yDSPww`M5 z$ZiQ(H^1;M$pSID@&)`=qeMZi^U`IqdJ~6y5I||>oVWk2Kj^b1AU}s ziy(rrCsP3nhJq6nt(e1}#xt8(<_O_BdY6GJ&<@3Yxm^0H9ktfJqdl#5AnGt}k?B7a zy^^iYt~Mk64I}|;?s|H+8v`W+8b)8f7NmAWsXrD;(v{3G8fI!DMQ>1Bueg(3W3bSq z^!IR2ql=*U-ovY_ZI5p=|Ll8`)2s6K6VH1pkZe2ta!alq+mN&5MM9#)k+Lg`Fd0w8 zUD&1bW!aLu;f#=o4RPLkNx+>LK(OHWnz7xCXwmq*Vwb}5vRnn0dzN^fd?v)Ak{?*& z;_KLNQH+E4)A1G*bja;zSIjRk?_?~W8I=KSMh7~_#3iUWVf?d4#*EgjDOCX*!`T7M=}v#HYg!NAxI3){piIxhD5JPBS&ZXz0QzF$)ham1I% z640dA2~L)5Lc7*NC)+W9*LZ-+KE4W~PY#UCPN74`l+ zKBmE|%HDG<7aL>rbyI!y$JEw)jjSHclQ6WlUGkF%{od1WmuMBFd5BH=>OOc|*p~c;ycqvxg z-HJmX!QEPl6n8IB+#M2};_gloT#5vW7XrL{-Vb+Y@7$f8*}JpfGUvk~C&T>D^ZXP` zJ(hi-I6sBzwO`Ej3PLE?_UE-NFbVYf3N(uZLGiVi;2OAH$udyNPRk|sy+yM|3HsHLP3BAe zMXbk(e7|@w9(2(6CpDv@UP31l@Fh1rmWoQFm_bHU(?r~w7UBZ5s8w!y+g=h=6-who7+qpDh4L#QT3sIuU7z`rlS)8+U=nCKE5fDhP zY;-elnXEvsd&)oYTQlfue-4%+dm7s+T6aQX z+*^Nyet>U29CtQFZgLR_zfJ1R6i5*JWUZabG}Ei?`feyj$3yq&b4f>c`~T_3|BtQp z|I39r#QzdJ25ew8|N9opH^2xS9u#ZF)G2i*b95)^c4v!1p3K~5ebWnz^KkUwTrES|wP6*vEHZqI9inzg77H{7d1N`W>?i_Zqk#6HFb=H0S#q{+N7Q8dg(( z+9Em`+CA(&r>h&G8IE+S`2lEmMYH@N%2#KrSy7^GFwgx_y}fI}eZ&pu?rIBRfT&VV zX;EHq6G|y9AGWS$oInm#`8Zwd-niA*ty8fWW$+>RC2G^ zg3jLWiP+&g>m}`*fP%%WZ&X5qj%_`cCUjkOE#n38d8p3168@=3cDchi0fiW%KLMHD z>*0fd`osI?$(d-IgqA0LN7x?UWBbMM^jZbSmSeTy5uB_8CrTke}hQ(r4?Mn#|H zW)&20(3%C>dyB}jEUE8k6dXeNPpX5DkYa8cC{X*{5;F;@g`pYt>p=iBklMA}tr_t@ zcG~vb9=cXNasU3FNa-Mf%om!MCqWrH&z?_t{0Qh z{EQ-{B&%NwfZs`)1{}nHl6}9{;PlnHDBS$ZXt#^nd3zuX!3mMTpGGbRjuA^wzQrJ&BV2+xH z`Hwuf0EJ-xU=W}ex6*Vb&t`qb&p-_YEHH%|t=86Dms$6mq2J@ZF{?{dHBhe;V=#i| z^IiH{gKZtr`}FH;b6(reD@&(xpHqFy%C(Sw<;dg7U8nP`Z9Of$i(KdHhak@*s$S0i z+@Ozbepc&3dQNKd7q4OtBhaI@R}0I%SD4-^^(+Y##MK&3DI?_Aa zo7^+`O(Hbng2`MK$|If<*S&?tv_0m?t@Gon5z0pymrbCs?nf8JbD^-<{?XklPy3t- z{P-;D`Q~NoEYwbnZMGG#S%VL2cDsPm**2bK(QvSTGEx}(#KAM~1iYNO))r*xnc^Yo zegD0m$<1*Y&E)_YILw*-hMS-vpA82}ka;yUHD`M2LkbFC178aNNG-dIt96!TK^U2^ z21h^3*-t45B?&_d6kWy}q8Ej|^$T^pm= z1-KQcWIv7`cg(Z_&>k;WX291@fJ-;u6NR=$2{qg{)ZeOETX?2U9ipOYp+dUXjCd~K z)%g`8rb)xgAe&4O2FUP5gAXQ9j*NFb}@M^2b;P@K_BWF}?U{V-Ufd{B)* zTL$>CB$cAaw6)^LQ1VT7Vbbo}YE)lN$z=kRCBBF<6R5dfu|-%xcSeoIH}@5^E}R<^ z*nB|E;MW-52d6K7UeZ!l)}!P7Y8saeodVBK?qH~aetw5{)RqW~rq0xNFD;)>V$L1U zd}@5PLGgY~3u{_eKK7&LozF^rPjEq?m!OFWF^e5-T=i9e)r_y$W8aX`6Y?Sgp#m9x zCx-C-77dla-IEWY;ZDmO6yp&ct!6nXe^6f~JnTPAl0VkYGHYIha!^dRxB-z|ciIeZ zWp-jBHKm>@H@q4@kkLwE!-;y2r5d9g<+Mi7m7II-cjF~bt+gf8Gw}CjQEPUd=~nYd zj8n4M4rFIhfQKFLWV)7nPkZcM@$9W(G!FkMf2`rhs6AlzU2|x+PRkThLTwr@s*DwW zAa6oJ!+XP0)~QU>iGLb0<(^bb{%9hCO7x!5u==^c(#HZhM_~oWH6+=zDjmm+*KS;e z7&Atb;K~Dw*23hD+dB}TtMUGP=(>blyz7y0(>tl`otqUjvha5=9MYX8eJbfj??Zid zbc{UVvB-!yK#Gk$m3 zHr{pKB>*uRKr{8b1-J4Y*V- z(+fjM%nnYjQhie}x@x@8vf}njs^b+NiN?NE@A2>Iwy&G2P+?3@F^RAIEi|751|d@A znHXf?Gr__It>g;(Z+TS|2%`ijiSacCRTQtc`VZb*;+6c1J)N-6rFc9K&hoOb`kA8> z3$iPF#qsXmze%8$!D1+(c27YM^YmZ8_Dp6@ef2k|mqlx&a`pssI;glJ{t?Sp-igeh zcfP6Xi2a3^Ezc3ax>f3Q?%(ZX$d#duKHQUsm@@~yIr)(~_{(3cYSJlM0={2qqRQn2 z#IzQ5q%=cyRb|4-)_laL?(*F zxD`lUedR{}G!_9(fu`6lT&vPY+HWw&53lG|Nc{CUBV1P-WK|T;o)@N?ZNIJY+SwY> zyBfG(MdGwOXT9@r`IxL0XA%*g#vu(oOPZBS>L(ZDKS4*3e`B$$fd>V46kKh&scKVJ zj9;N;`}?iiS2+NRmBckug@FE4Mh8P-<*~oHonbzZJuAM09+2e{fgnyts>T*bIw^HU zMb`!Z!8E&o*b#U;`w36X=<@`>R|Ev1n0rCzuK`$cf%T3{PV3GUfe!Mv5TZAllx*>P zRm+`$Dr#|XDD<{k@n#QMvra1dq2pt>J{X*Q{=t&ln~LcBO&U@>+@qbswyqP2a3eHf z54NYPM@&h-6L||%Fhg~IWfB=KuX1||kAjvOZE=bF5SQ)NZbwoY zW8>b<49A4M^dO|9k7T$wy6WBh(?oHT&5xRVzYgfJCD40*O-E+UIU9~yxeZq{!!Z42 z1t+i8Mzz;SdftOCm5#wamJN}0@_w%QexdPny6@?1J5AdD!N5v?FcOb=thUtn4+d8t z-})j02ZM^5i@(|M&Yxs6dwF6j;mol;HQP4XMJgTLH3w{aqLhz$3W@ZgA)Pzh9rY=V z@;>-MDj&NVDm5bYi{tvkK1}<@KG}Bob!m%ax?Af?E%8yG-E7^viSySQJywpM)Alwt z-Cl#6)d(>d&ug!FsVT`f`VrDKT;uAND_XykB7SRU{ai?cmR0-WIB8o%l*%X5WSQv{ zmA3@f^4Q?rf95Y5?x1bqrAs0CaV1gYfHIX_q4e2X@0_=^=`0Cka``1|t&3{eUv+dS zyBxhF#GcwQl4{74R)0T`rX0{;C|8fVz5mFq_Zx2tKxytHhjiyYA8dt3-6`b*a-HqC9)vmO@u;6zr7 z@-J@hYHqWQa{&xS+-an&N#^vp-9Vc~Mp$Kg{N@J-?x@ym zoMIhF{ZsI&PsK2SEi-vgt86eo4k7SbO^n*y5)7vN93&0w1BG&gY&ufurJ-KcR4gDy zg98WhFXB{ImE9)z(c05etfer57r$-^CxK%s*K6z?UrmGhxS!rMa|GMBTNPAjcaf5r zXeX;Z`*?Fbo~~haxQ_kaP5;YJ>40o;4gFynCZQI0+R9aA?;F-Uh^KMDMMyAfx< zzZAwgu(!`FuCbZga=n+=GkK=Pp$qLUNpvS)mG#j8Ag{%=?a4d(C)?qQlVP<8rtkT=k?#{cLQ29LIK@Nha*6 ze4Fho$`~udPi&0aG;^c$$7%1npWKJ7(=CV#43~nv%gJYHv&3msWy0rgEVm$#gj{Ud z+^&@KsAg^`=Fuk7Qa;XKXS)B`x^jRh7>A*~&%$(X;h)*GK2^W^)Fh^;ToPAf@bVvw zXVBhB^UvtM`&D73tU|_`=B3_y!`0>B-}$6Kx8yIh8jW(nCYu{<4=WePAi_@e#EC7iUGJ}>U0d|Y0PHaFvT#j2Y#@5O5t77?Q->Z5o%H8g>8=RX(tRWhO z6wi}@``X=rEJ(vO;g93Qv&U7`eU4#^8@$1hfkkoj}Hq5zim7qM5Bk`>$ z4tE$;6GL@)g_bPvN;}IxpovN+<>CJ9JGd<`eRVZ<^Qa-QnweEd@^rjAX2pl~X!RnC zj&fMT1SVvKuPaUYSRvIWQ7)MamZP^z6p3rrwW9>l)-l01F;Y!qe(`MBLymKMp$2=M zdserMe!YYhZGTeJ026}OwA~e5e_50GL#V{v+O-7hDBrVc@m@|uS~g`KFu4%4P%<#4%$`(v8Mwm6q9*S~79ulLMHww%@V zE_H38XBPo!$$9w*H8a^{Vmt%oq<%FuX%3YSrP26qdT)>5eW?_2P&9bU5v-H5(aZ4@ zEG6}|#GDV~Hs!GNF|m3Bh)S`u`~K*D^lEo9t3~LfY@!{8*Q#Nc<*R zAIGD3B;bS{&A|?qq+xP$sYaz6A${8o3U?(BpCDM#yKKb`;z6rf72pkE7mtZ($OS4! z4+Jlw)ZQIaQZuzc-{?=DP|_zX{IbZx(J{TmVaBJ64+x8EG9GlE?Qa-&3h*Fzuq!yV zOp+6whrA2<)I!A5pxcaD)+F%{M&KCuHOlK@8{F2#dL#s6T%|bdHutfPR^{THi*7AhvC4OV6Q=e`Kq;1^rTZ}F-2?@H^2 zDuYD?gK@3QpXpzUS;K7aFkaGQ1SB8BuSRRTFGUv)og8rOtUMHFzpJb0-z5{cNX>mi zoisk|qU%~?(%=$O$ZO;fF?OnMgYk>rMB-xasY3iY@?k!D&=Zo+k7y04uspX?QL(+t zRE}>wh~GPHDs%|tmoYww*EALmk!D3178j?31nCVTzez3n_LF~1Rw5fgTTbM9i@s2b<*kY zuinOtKI2lJ+Tr=j5xUTJ(te%#u{@3@N@d`Z^oO;l4JduTw4momCF4$7G?R?HC6T|V zw3>^Kw>VKH3k*dkbOsGe2Q)4p#RRENOXRzj{Audj&>#&WQa>FMW6}2kVlq&lpCpTy z@6x#3WOB3kj0s8Gt>{__5cD>noH*wDa9uxlBKmbBM}fxiwax1@i3iUv&e{u)Hqot1 zq2Ac+5h)zK>#Qb%q^&@DO)_PkIjZ`L4BXoZ_PN&GSj)(=uzdVVMgJiyEqhc6o4knW zG4vdg^&N<>>rALNk^nyB=UT}8v`Bv(V%&X=ygoh$HSgqnL|z?BZ!fbL;p#MmTYcYu zibt@!(w5SlN82=hF*a|}*U$nEl>l;wdpJe(UYR^UylFcN3c5CNoYmG*Y7o(*z|%v4 zf~}rsH;Arz;mmfr4QsrfXPs3yr^mfASYp_rmL+l?NRTEkRAeUpfPwenIR;v!|JC6k za^iT;8BxQ~+?6ppOkX|o>B!Xp8DV4Lol2j}w=lRy)s@QCeG)eBeWW))^X>lCLRK6} z4JTia0+i=IVr4VCA6sk0&#jhe(&=y6ZerLQyWF=$^q1vf?7R022g4o^a!2U}6&QCD zSw6O#T+2J1{f`f2AO~76PYk0zYc?m;1Hfy!e}(@&8qlJ59c}c4YbY^m?P(||yo{7H zC@hGfZfxB7imfc79~CSq@$cLg;d(F}7w2fclb0h~^s_qQXL%{_kX%a1mrS9&jPySN zAW1+}b({@d72=8MSG8GLB4tZtKwF2ES>)7JJ|SOLCJugMKKxGpS=Xz-06a-Z%(yqy(w83nAlyPHYtdIv|e2}wc~bs#bQ3YuHGh<+6%c5^C+!_%2`^IV6I zzeDGh$Z=$t?+d@qn=A;h?|!Sv%ms1+lXDq5tpGy%xF!Xe(&k6k(9lE(N^@7>pr&)M z%#^x9+ghXSX0o2uUqJ=5=}GTA#0A(tgQiR}mYkqq!G+%qX$H2JWEu}?L%A7uU-qA- z;V|&~W6nnWexfYlnOSDHo;T8~rA;@D!%i$)zBqH59>Qu-_EG<}c0FSCVVvHgW#VxQ(jf1iKxB_y<(L0d8K9p+yk($l&j$HWT8(IBugoUSgr8S?GwCJRc$4{L*U0)$nZ)EN<&QAb za|CM6fA6@*8C|Q5a;`50@SN^h+iak+7ZZyIH!S+LS;r}BpU)fRP8R;u1OQid(Cqxe zn@DC0O~-L-+6*nrCGfGCUwiB(F(v9(&F%Y9>@!^ z;rEB$s=x*t^2a08Y(OOY8{A}XnWADRRW32IK5K_@u1LE67VR?qJd>*E%YovEufGJq z3up9^u}1!bL2dc&%P@9hPKdq+3&hcsI?_RsShATrxzzNxL( zadBQ&4cjLv8qsX5B4-m8QykQy@A^{pRQ~Np{l4)dxD65qx<}P?yd~x$+|B!#*_-!( zL0@Z#eDQfW)uWmlLjN$#jukIk4=Doz+EH4u7qsf9PrrQ zN<$4xes3HGWGF89&DPzz31hce|AP@>;aaP$x#OI|^6dGhp}l>&41q{+J;RBs@S5sQ zQ@I-K#Gd}?p1Q7N9SC!0`dRTwGs;VD&84L+m5!uHouHj9anwwNocg^mmHxoW&B-0= z)^2w8(rcV6g~t)g(6C%O^JFADG-{N@H4uO@+f)ohO*_ z6K+CPSH@LK)%R8;ox?`AhN}I|*1i6|_b$hoAQ$I=;nJPJ5r}4!Ro_3{2|l0W!F0!L zdDDDE=~#b^O!||y{rsI%TX{v_cI#}NZ<2o>L-32=_V&C~UM+lWB8nnD_G4Apf6G{{ z67v?1AG4bqn_4%VVkx{T_Yu&|&HhyKF^eK9s!grTkGEd4_4VKIv!BG0oH2N&z!BT% zxr<3ZFUioA8hE?>IJG`9wYsa+FRcdsGH?vR@V`ODB%-}77C0n|i{mUmL z;!pyX!ud;ZBd4oJAc#j}VWT4$6kIP)yIKEMjwT8FLFeGt?IA$Q-2G@Pposa2=*Z|0 zdE&Y#K@w4GaysKT^ODDavi)2`O!Jtt{#y_#63ZBSq()Cq+@F7{oApx>inT9a-{zZI z%&Q`AZG5waq7N0;`qWi#wkFTH9?Y_5RftTC&Y3m_&SOF3E5mlDRI?4-M&ouomuo!- z6=zvoZn|4S%Gz{{r@gyCTuDq{U8{ovoh_&!)NSEba9NRkcE_ToXc_HUoi?V69~Z;x zPOL)r6~8itu}CJ}S<0?Jsv^;8;`Ukz5kqa$g-M!Z58kh*yIKh@uVO3-Bc@JzQp7H8 zhW?NMyw7$2l~%+9^2)*A6(xh5^SyjpL(e}J>xD(OKFt{;F2OUNSET!_qr*}BtM*@4 z=+$Ze4sDfxw5Zl&m&U{!72{709m>pwxts3Yzft&%J35pIJdImF;J7yU*y5k_Ttlnz z>Q0MvZfbf|>&>!ijjPF4SY`o=;}V09K#d`=6S$?ExtZJgnFnd|%97vq=r{*Us))W} zGCpCUK#Z1lmE6~h5IbbdL-@Z~fKKjs&^F6meV{e@T`~HvZ7nqR&#_MSFFWqBS#7TStJ zgak_>6{7$jWP2@Lo;>q;m+;y16B6L=?QkIfW)q8}KW1zp>Cr$AJ08XCoNoA-M~xTo z?%1iiTMDEdPf|Vd-t8E zqHirJ=qvsA%Fnu2i{N?=E>_4jTCAx$%SXv5wFz#ma`u4HjyG9Pp#WMfcZTQ_xu$6dlvT+nkC+Crb?m|!RemO{zlt{h#}kUjE|;CaCd77 z>4pgCo}$q5p4FW`?yN?<%W7$5;!SzSJ8dQCX_}n}6dta}Je-vf8fZPz)HwN!3te@% zZb$-ivU5PdUfG$lGp7aj^sz6WWuSHm4cahxq{*sy-(QlumDEZigRYZzadNY~#?ykX zW)W?|GSEdY!GAEiP#gyMsqd@2vRk05R?vuyF0DSL=AJj@3Za;Gv9*Bv?K1Q0 z0UqjR8H&HV`kp)3=lKu2?SH(Aru6d-S9`sPlt1>~CiWfMxOLG=;5$L;m$EQ711JAl zo)SXe3X}N-OYYK48FWq^8Ju&-D^71;U3>2eV!D9uB6XE;v{Qlx?CdI7i!yUQy(_lK z#B)PXB7trRMgmuw$9A=S7=pbq+IW_cHi{BLha3qSq!MQa{hO3!Sr=9QLH29%#o&F9m5B! z;?CJz_3rHcZK9d)e9*6+3GDB=OZh7VzZ9j}3XqtLa<_0XcrO}ND%3gCzXiQ(3;J6i z%bt#X^GY(Sr!($_WW7 zc&xArU5Howy2fcd?^9=2yPU;W_Dm|42%B*_A;x>)JSU%s>ha3@KDgY8wHJHZL25)5BCyU?SNi z&1s%xE5cz@j2xxRxZg0&n^afuYCscD9unk_u8%r3$~KQerXzF@X6*xZyhPEKWY`R~ zO)bx)Q*bsq6DiJ^w($J!)YoDbkU-^`K~5XeNsib1FE5_7S=7X)VLnKE6ou>#uNeB= z@OPlB#CvQmg`m=vPVUyk-~(a0k8Qw?(LWf-wg<%3wf5YjJYB~^jxpuzo$Q>i%4q|YoB z*))6}zI&1^s4>}GGs1sXMq>ulEV|cUk$AVemSzUmypc7P>usp8UeB$pjf9_EiE{#0R9Ujf=P3ukwmIM>}(^%R62@jZu=hTzp7 zd_K>-*~ibJ*CLul?_KL%&B?#1U-Nvn=9NyGjBHsry(aOW11&+XnpV;j{>s#wl#%Q7 zetBT{?GL27hMWh9{DYBsYCdrfUz!X@%Et#s<_jGo#sbXW!sma^Ygf}1dXh-K?Q&o( zW2qii$r!YxOVq`>eBsebfs$A~3mg|(FmkLLZBEh>+eRoG{cTr>s+HVVjAPX*Jwb4F z(yR(0s%l-2&yT^VIL2}!l^O?pl&FP_f&|_)co>YG5UlXnI;C8Rgk3@C{50u-0ROJ5 zwa}8!j2XQL*dUG-KQR|oufRDoqw-se^E+6}ZL14w&>~gCOCF6hps5d4DmjBA%C18n zZxTh!OZ3MVrp$-~$^9w*x-_N)^1EZ|xt{ycP~@ z`474)c$-{OW#9E{bG2T7yfUl-@9?qEXP8WKU{Cb#RK$ubzm4yhX9jFhB}BV>_j3jx zNS+3WFSeR4C^bNLS!xf{CqFv83#)!#ddL*oS)CSTqLK=!+}G_-_b%faNqP1~u|edCqt#r$U;ZnAMePCJV^J*Q9N%hC z06y=aSfWK^-eW0#12Q@@-Z&I(i}^v<;=c?>mW_D!_x|zhIF5`+UWu7Ym#psxOAFqn4GVgRD%AfB~a~u z&q=KhXNapFTCXT9IFx7`W-!Uck0>pzu6SLbYo(~b@t7P1H(GnoMH@?_rI?!-CkYFe z6%ri}1qifHw$Jy*umRDbiYkpQO`2ivQTFgs*2l#BEL&SuWMQR;z~nQtKc~jS&SCX_ zJ@bm+E`k-~j^ZrBmp$_nD%*TTsvlXiyY(f_C`hCpgIz)PABta+3K!$yhKR8q2b>!w ze_5|l=(U~P@gx+Nq8hdB;}y9}8fM!gF~5g#r)Bt zz{f_l@_xly>a9RKRhiY{OyJDQ8ZZvbs;fbpKE2hdaNH-pgg@-Vw{z@Ol*FtTX=ePH zYf6kn-Gk0bkzI_=ue(?Ek!k8p->3{SdpvCP$mHu-bhG`P7jc%;f98$%rj*#z$4HC_ zp}#|_l^rp{OEP;MTA$d2nLI919!NP`e_67(w=);@<{fJBPwE=rH;o*8ypQGIR%QnM zAur$Md9grvBXglT)9nvF?218)02%I*zt=tG9G%vtE_^+Lu-w#tVGb1EJLS>5M9_tW!Ef7i7p83sAjTb2_wSmG$6vZYG=i%Vu1Q@!DRMiH2tu zw|AInxMcMv7K&nb8cwP!_-5lNB(>Rk`^~}gc%{$UKIr@B1K8EkaZISf67dBl&Fj># zTs)QMY_taqpa{AMx@Q!zqb{|*FA{r{?5!*0=~8)`a7g9w8wH)mHG4zZrc-iG8&3!q z48X-uP2%r7N=eG^F_LfCv=*`jt$k_My`pHoqiVjl&D!m;>2Ob5@B2OB!XH#)ZIV0{ z7QBBo{n>n|XMCqLUh^sYz#^p|wn9J~bArFi+vi24Kedk7%u?~>;)W@^nqdouhK3ky zORs|+20|&ha7p?+#9DeV-fF#hauu&e?mgo zdO@i%UaKKQ#68N-G)Ej&dwMLF!}R_xoaX$3n6lwz8xN{s)c)sgR9R|{N0G$HefD#s z-kX?fH+LR{d>5_uifFbY?hMoOg43D9QvgCNw4fP$z z-zT-VgH3(#LF>cYmaYpK3j>+XXUQ&W1lCkwFwB^7dT&pCI96s;Fc4rT0Y+LGQej{S;aWsi^h+$=+yJ+XOg3%2iiG>)u6VNj&()8F&ktQ#=vLf)LJa|LEQr*keV+f1w3-p& z6A%1P4_JdSLzhC|B`+}H0Y-V4BAyTjOcGV&36LR(gWq`^JLOUp@=En<_No@}5`_PLsD`H?^WbDLZ5+lIE)btTb>m9Ur{EsMQ%Wi- z2@_U47dpiF!<2YzvaDrH+-{8BBUwQwrj~#)wVtC$DQBNLWttqTG4{jy&l~N?*g_hx zc-i%vRZjCjy{p;eV=t4H_kBr3)08B&sV^AYT2c~Uc{jbzD|FUh{MhmogAEus`KX6c z2+P?Ez*%y0Bit#-2}?e%nqI#5gR$Y;Z`xFc0hKoKtABTLsdZ;Gv7j?Xb3ady$Y6dY z4JVPdJNHTMZS|7}l^9G;eXM5R&ne~8sZ_I0ka(HG457KrfqQ3=$qp*X&6*(g`s+J^ zY0xu@Kg|pjBKpynG)_Uh$g-$X;C~{&?lnaVp3P+-MSV zlFzagd)BWMQ&t{RT@2*>=z))eSSR81XYw3&vcyAl-_0o+g2e`sez@%8qOK*cL4(>* zJScMI%L_&YRMa;W910V7?~{r-dx`f?y&g+ZQOD-rgq})nUk3Un6{9;1kB3*hZ$VYF z^FVb2v;=}$A&3`3?24rMYJ9$qeqTuZLEK&2mU59^b<|a^EpQJ8nG%>-3?TXw%RpWf zG|NfGwoQt4;}M5g9`;8LrTqc_*cq&~#7mo<7LG&@pvyMYuly10jbo6>LS=1B*+anSYL z{AP?-?8#?+riwRSxMPuRbywM9x@^0n(ov^M#lJ{C{-UUH^f4)R7|-Ao%sO+})E`;6 z6Spw@C11)z9!=?yMuE3hvgYkMB zM8(|Gp$llSalX}FBRP-Y9Ee&$}{C=G#Q|;>NkyA*c0ZXs2Q&YB2k7siL$!Y#tAufMxGB_U6A{M zaHl3TG+;ws{0!$Sfr0B~2_Hg=pQkT`I4)JVR6)E^j(4i6=tq5z<-Mr)d~9q*!}g@x z-Opp>TGZrSA+jU9&CBK$f#5Mgz`ct2tF5}%6PGCY$O0n$+o!PxhyF84MAmzpmB$ZB zDDb4j`0*3jmhrLumgH#G)}h2_hCeiL-Uw8Ep#NqZ8;qtwvN@siq?%m?myf`MbPV%w z6^`}=J(3te|3mi5xVq&_^x)5mMo@II2wSkD!;K^`7CFUA3N=s_q@1YEkI!mf`V$#o z+e#miXR>>lI~^$}3#53!Bguh!*_DH_XE-V%8cl+%*$3mw z3)^;oZ&ZC?bHIOWpc|4__B8n^5QR7Yt}?~Mc<fThPvq$}R1Vn=jpUK0LJMlpFyIj>qzp#P->q)5J-i-??U@K{f6mQ3;-MJZDm6(f{ zG~)SYg!*6^xoE_Jqf|J%3q5CCU!h>)VgJm2L7;B6fZ3TwiDA^{)QMbKRWf%%MGs>u zYd6ARJcvwc_UzMv)pDKR{h8gZZ>W1zHn@xaJGc-Z4`>At3_OHLo15nRN)&-(5DI<+eYJ1Q~a9w%er$$0a+S7*vHMl2)`F z)psDK>(y19uV8A}&b4+S^@LA7WRKYnC4B#jP~rdX!U06+fs>!+k^(R$8f^i4=Hfr| zQ+y2n!bksL+{Tmx_|X{v{U7`{H5F|bi5O24KVZB{RKviKC`6y~4{t2YE4?m%X<>(P z{@Vt=M$=~LJPin4MRfyOzG4guZmy>AXGy-qrjx&ssz4B`^Z&`EtqWz~u&EU>{ADtU z$WejY-tx3nEo}Xg235JS2oI!7Pi=`r&Jq{Ny4EC0Yy%Pp39pqwULhEtqjCE462$eg z`7%3Q9PAPso&?W$eL$}Kk_9BJ-XqLkn)TToGT|w@1wDXOIZ7p(bj^`^R)&nQYYbc> zhNVM&Eq(=?7iXXjU>H1~cO{*LY9*arE%c3GFJUb1nLcqvU)uB9(b@88W4LC^POW%N zGs4$iCp>QBS&bjU;XbT=W1*)-Vd&PXjwl%w?Q{-XU$3uUs=3{BUNwkTcxzpr^wfkK zeXGCTvGguWdR7lp3pn}Rl)scN@zNl-my~&SZSW2_)#0>{fBS75>1l*+(|IM6CLVvTrGhMnNDycySPOZ-Q!9A)a zd|3@k%WF-zW}6IdS+TyG=Dp3yV$u4Vnkr+R{8mSkd0ALGRoF48RV8+HRnfXNbaW9Jk81rsiuL=XO7{D&)YSV`RX@vos*fvc4p>VIZye=vHw53nm6jy<}h4 zU-|2^{e2O!K)-DUHAnxhRrkk{t^SZ>qm-8x zc@9gt5*OzakWqlq;lFZIPF5;-`Y5BT3M{nLpx}e`@YJBR@}D+Lh4uJ|L;7sJi_v_g z8XBd488eMGx3&VR{MfihpXNNQS!l}{>K*uJXdkDm(>wpR5yGk_eNP$q0l;UUj}Ahx zXy}`=+;CI~D;s1*>G=&T`HU--Yh~3dUP6RAaDxiPTSA8S z#c}ixT(qw=o6d=X-zya-ju70HJ>&o!obgoW?}2sIn5IxN=8=&6!3BARr*&TsGByo^ z2-E;s(1P6490~w~l0xx8juz~!y4py~_DWJeSrIQS?U&KH3nnm>r>xksT8Lp%f9(1S zJb2N=?kFT0{1hx5oS#Xk{LFDwRJVvN`JIg7BVxebTGi|jFSR58uL_px!OCn>daLAY zEV81CC*4tPm?qPxlZeXi)T^@S%Q3r+W^45ef;QN-9B!O2p1uWLQNjUjzk-6sj~e_H z5j$Eg9qI@S0u@ZXSfP}K_fri?U*6|*deV$l>@b}R-1H*$kzK-`yVo_vy$Y<35{>;} z<7_;c%N*kJatA`3#;Xa|3YJ*){L(>#Z9kK+Ef!Mga*Y)X-N=01yM^)XVZQVO+QBsb-uCRgq>ch&EN|lxK<&mvC8jQ` zMlFQ0{L)iILQ1S7^O|W^f%1`)`S@01OR&Q<<8+(dm%Wx!-^kfih+}7&d6QBpG6Hu- zBh))s&cRF~p=EXEa2y>UkBa@#uimZW5jQAB7cZ%7Uxt5NjwkqLE6(;x*C=(8AnX_WJWtcp*&!q)~*Ep9n9R_GPg*ygKm{*z%usD`+WVw(VP-@07 zymbNjg3k5Qw2ZFgn*85O&Nx;U#nTp%J+)`Ekj*$VsF~lgUQ82!FM%g^YWbX&t zFMT+ zQh`G*udX(EXs#EDsphrc$rGW=%3n#O02`%g$ilYKD&Chp-GrOQ+V$$W&S!0dfhXHs z6DBoU@rOScSN?W%T~m(_>7ec&#t~FLXMW}oEaL%QIm2>cA?m4NPfqgC&J}LUOhe(k zR6&E}dhQnS&JD;l%*egXf6W9t)GC^NOgolNJtFN$pa@5**cbnJ%`?YMdOra*A!9= zm5j~KPFN+PN}D&y%JubaRSugvs6Or)mkP;s-L=arjZ`UXKK1s!3+4`^W03kZ6ld3Q zkD?j?dea}T2y`^0V2@Nj@}RB%gdcgxIv<@-rCU&Hi|BF)=(&mlt4#XDQXI>+w2*X} zKmG* z?N!1w%MCi_=1JC4dPn~hyul%ey3gue*$7HyOXa(<>0XbFVLmhta_rb4Xd3Rg$9nN1 z(VqFhz7SU|?*lI3ipjE(af7MxC^>O)={S~95;4&nX8KbaHv#WjYAbM z(=UXp1liVTk9CbX{5U{YNHw?dIt->kfcn&+pFf zljp=vWE6*XVh@Pbej}C9+C%d;;5+@YaHi)sH_=g3FcxdI6>gX$H(mOHy8Om$oZ((k zYHHTA%JXjP(NhCs*i{rk^4vcded`#ce=33%h$t~X=t%|fBgYr-@0&Yc{DZ+go=fAb zJu4<{ed0f{QUkwF`0kTp)!T2@Y%w-&*7o~+O0nj{%rLR$dxv4#M*(Z;ErQRN3U)gU zJxF$2x7a_GZR&opdz?W=`ChNck9vnbtJm>-?2j2&&k$zV2%nsmhSs($UP86VvJu2x zmi)4Vh?J^7wPGpQ`|#kDter!53(=fOnUld-*sG?cp`!C4eV_iZJ(=mJcmf!#`K*6+ zckobs9%KBOgwB(%CAsnhCyC&!wzMXi_V;X@)SHKGwmh`MTbUAq?tmxL_v-R24J^$IppEFok`k+yg)H<3ez* zL1gAzQr>1}db~W>uWM~l^4=j3!|skSPP>z5np4MPz|dO=g_&7HsJfNsVzi{6 zVc_<>1)A)NV(!g}oMGE*h!XqJES2-K~zLx%*OV??HJKvdH~IY0&EOdZJ-r6%Dk zp3yXhsKsXr(-tNQy>v1vMKJuyv%J9nfwePvYP&f4SAJ|Ny&ErtRsMixXK`U~Yt0nA z8oop!lz%HNW8y|02UlV6#A|3DB385p*_i^Gxro zr2fIfLvVEB8h7y|yKaG>YIGq>VV_TYa1LHj?pc4NEVy?F?h=>9yHz?=>2KP%x2l0( zXjS_WrxOckJL?S^iD+5ut-38k?61`vmSCLDR=LyEmBg}dgHV4Rf}9o zpC!MJ{uN3m`mjUei%L7b9J0($B}$4VRI+(8`3tW;eO2J2f>|mOi`Ubny3ozvO6b@mU#H3Y}fD(X5q=X1;43o zUd`>ZD-Q0WkXS7qnQ8E`xjH*V+D=Z2Vd6Lb`n2yQ=*Uve$k4m4G z5qOluO>`w*3Ok}~E#%-{)o8S%Ez^WM{Ti8^65*1lQmuW+>D1&bQRBQ1&RSIeF{n`5 zOkUUG*XYxl>&DYx)@sgi(41Yr+{wUA!__m-Spw!ZE&hc+qqvCFjeWkMncO3*k7Je= z#&ys63ACy+{7Od6JRd%wyPVqdj)62muV!#ulOhM|`sGHhU+P7F`EXSTYaxVWw$g!k zOiA|T26B|4KoPg6i(0hd=8q?y)=~A+N}JIQuYaLq7$Ia~=g#3}uZ=g0^go;| z|ApeAxS@OHtFf6!Vr8@9cMRt{o2vG9Zajo7Wj8S@mwkSrN2OIUWQt0$73wKf<`VRp zo#N9bEVmnH7Qlqz-le?Z-m6w@l7=?cJ|poYDY@DI$Uz}PzaWBfK^d)rj;H7OO2?j5 zotmrG>-@Z`6x*(AbGEsSxqX4HA>;V4e(&rd`?Wb>+k_m`n!Pi$2F~NSe}%rsHOwy^ z7=pS;Lj)_}bjFCq=5nJOLZ)7;cWcfLu} ztov-o)_#mrt)!w~p`JC&5?&&fIKr5M%lJ@OfwHLSCx06bycBYq*E(@g=tA9|E>5xB z2+(4Dm(YlCsnRwnK&GCM%GJt)pxx{LlA?8!#;Nwi3lKpugB;Zf1_PSvK?wWBA7UR zf7r|}(WRo?k+h+>_p80G`|8%&?5Tx!w+vBJOf30YF^9QvktM)6&8!+vL|hoDH(Bb3 z5k=`7`!9vm-yCDiLoHf5O=xJcOTC%L^?xf?Ww&-RR6g(wR}#~;c>A7a(6)+32!J;G$2oo6&ZUpy_(1XT@$LAG zmEjDK1#q`@H@f&u*r!{_;yXJ|h(g$!@3#k*JLzvd6G2ajo6Ehh1)Ik#h%^in#sbQB z+_u&M#PbYrpSURwuvkl!VBhVB`Sw@O&)=g7sqaH zXWGtzM>TB~{r1j$0R%9)x`S1y>&owKm>^qWfT0IdySjG!OEJSrDMPH&eyLxGG|G}w z_+?>A$Rzq4k!v6SVLNt%A)1|Tmf!fX1F=id*s}sPU7R_o;CGZ9xKd%Vw>MECr}ta; z!~uC>VIDh3I9Xxs0P0ZoD?} z@7J;dHrM)MOa_>j531LGkYCL29S-ZnSadHo0fN-H3kGM0OBb8` zUQhS!^&frR9{P#jgc2mE5se^_*T`)t^-=&-Ypvj%h%YKk*HD|OPa;60GKubW zSuz!boaQ_6Q?`L5x+C%)hRWvTEv&GojtY&9BK?<&5g}wVV(@t1i>B$Fjlw{;EKgJw zw!q6Gz$%aGi9vXeDz=<)uvzbCiP!{{eq_kP7D@&A52p~0HnY0kKm2m!(c2+AJ09u6 z@x56gPME!Z7C(nW(trgM8nP97VR=kyyM62fxv|68HiMDXn3eVFqkyNZg1AJ{rtXKB z$A6}$RxO)Tsx)loXoeY+w1IU*yb)?_S z{%CzKv5`g;RyLxe%4gU~D$i*F&?MF;OwUhY7ALm65t=Y&(5^Z7h+X9t-cX3}kC^L< zbfxgCXjC?G6X-r9pFJ3nUvv3-4q1xE=D;>?JWlxXjU^#xzFD*z-99nCnI<2fD0UNOK2-Nlz zp@Zds0R%4-HuUTQAC2@lmugM*v&-;{R~s9t(5L=1^nC{8*;n{~jI))utX;NDf@VF0 z?!4l$>WbCB`TsvTwY=rlQ&q?eU!F<>ZFv?lv{c`TeN;dk}t-)P-N7OSli$&mY0T^-dVc8Z6iBR83EH_uB z)Hr+n^98tQ(j*_oa0;zojuL_Q-n7r9n?3B3$#dM{fwZP<#1Gm=k{%eeIHU{_{?uDa zUt}gJ#QMuy-@ls&a?N>SHd5kxUbOstks?C!^0SD}zBS>siI6{8i&fW|hp>-O8%xVw z8&Z<2%eqg1vrkK;wD zUDV>m?@u5km%k;PbIG5Zv@uS8o+imfxHG);5EC8=32pQgedPKhb9r9OM~jkaTYeKV zaOHF6^^qy@L~?`l&xFG>b!zjjk^@GVohPHAGP@azH(D+znkWAEbWdD2l1fCkNDD(+ z_3LI4J-py;BlPN=dcA!FT$DsBP$8=4<(02GD*BS`^Q@nl+->_YXa9>ej2GG~xwEbQ zQImzanc!Zhi%qFk);LPA)b+vQlrkPWwJ+~>r&Zottm#Sxlp!B9yMb{U^GcA_IZY!m zDzE%#b~j_ScGn)O=*%ouyxgwDslMQt>+F<)6CFShVIJ~=iI|ZT(wXeE#Cq+K=LT*5 zI?X-z;3|jJ@ODi7fHLqL%MSW@H?=}~fl`%4-Jtdi)P-txTI~r=V4Kp9CqF!)HPm~9 zgPY@?alU6>iyS{KbeS&{T?H0E(%co#f1?}j()9hd+Lg$t7@8!{O;Em1V)oClQh*~{xAbSAy`fK&x5${zx>uTJlx+wOP82j8YOB5duG*s%>J$a z)^|j#BFAgqTvDv|ZCjMRjM>CCKe7#@G1l7P$|v)BNK%jfdm8E^m57e+D}1%>+KNBq zf9;(ISri4Z>SNW-SwR8qbmPr|PWXwvP;7iPV^?nPiTeT`TJyooKkt3Qh2$8OS{MtnH(O5_QQ+C-B3B~V2bpRixh$lMz9in6duLNK8^eU4qM4vq2p4|p^M zmaY|^S6bF@!&)f4Ul38jgl!fg;WM-sPtfOb{q)G!`D?iIS4p{QmH&W5Do3)_Mrn!O zm2I&yyZuG9`x&kx^(`U%&H9EZqy*p;P>NU^I!OXDsj;qwvNYlpnrv_cgdm_iqkZqvqq?wDKxg~9K#pjDS(0J-Hdaw^Liuq}0dMH<+|Ok3YeP=U=<_dXd1Yul7*R5OF^b727P_jEYu=gaL=L)Ih+9nXF-P z`WNI5Uj`YN{Yd6nPT|ojt|Qn;{upEpy4W+R@Wdsaj;t?qf>q9{DK~x`b?GNq|mIcNoz_;oC1vZqNafAqhST!PQ^$$5o?hM5BK{ z=oZmE3V();X7I!bp$iYU;lZn5v3B6-H5ol55B}cQ;v>}5vH|8}L*#m)D?do4Ok`t> z-SFmS6i;k-aos9bB7F268>KAeCE_y;3@Bikqo8yy_j_p%Ka%XB#8on?~<0EMCtL^)uvTL@HDUWGnl#u*8M5c zlB`IZ&7|NI1zkbGLD-IM7Lu6|vgsVBshdJ!b-63VT>u=w?v1=(oRobb>ZcvOe86Fr zSEmwNGH0MCtru}h<6tD<4O$~hxzbE`hiHNvx+@Vm;=cgpZ}U+!;Hcb3;k4;dBy7nX znc|Ngl@Ys*=MMU)c1Uxg?nZO};aHu^%bT0$<%2h#P$TBPcDCv8kF7tE?hq+Uye!rX z*H=@#y}bV*P4g(C*Y2MEHo9+JvYOPpBF#^C!4FL#t=jgX**A>a)gP@Y=QOOpQ*UIr z_a}_sLA?g-&m0jas~_J23Jh$`TpsUT#72s$Z^w1Rmvag-=)dZB_TXzjw7#@471tC@ zc#^krfXW}f?FP1au>{2yI(KaqZX#v+T$+=A z!oDMPuCkK;e%`U$FW7kRT5hB-phOj^>fnbk4O!1T%z>u;T*-3cJjE1>K7oqRA*xkS zu&FV#v>|<)6Utc^X+^gRy65PZXp?1-&%5i_=PT-&)4QLhIrE(2Ic5sqo>}l)s}er6 z?cqcvW&m)W>V%>}zd(vL+aEt!1q)0@%e#)ZHAWWs*>!CT0yN7 zHoD)=9-GE9eC;LC(kPus`SF2vhwUJ*d!~hTvY?5~0S6utzO^-SY??_Ojc-Mhl3P&l zaM1WK`e4*><9>kf2biafnNwWI9$dr43VK#@j6N_~qfquM9gqxZMn4RkwRzm*mHdg;DYv4KeVRq! zW~~qt@y8UI^xnB-1T{K70&l^TxIE_LB(B%^R+YB?HQ;@_+lT(!_cIR?nN(}&WbW4* z3wK+`(fMO-m$?oM+9C4a$(AM`wPWeNIdD2d#NEzqq@3Fy$r!3RlFZeAICOIQlfjWg z3wH0d@j`N#ml1wfLDy^KW;QiR03g z$0ZsXy4Fd4u?DLFBL|s#RF^-VpVPLbwRWdYn0vj09R9<}1NvMg9cf`--Hpx4-$Un{ z>s|q#!T)d!w(4Uh6(UNHm`a;5)Eg5sV>&tvGvIuHCS%Fr$iA0#H7vCi<=a{Zy#|Cd z7#Ed$YS|iLp*7AGIwR`kf0>y3$8R38?+a8}Ksn5n#fqLa>*>ECV4bz^!p~Q9nOeP4 z!bZa#FXI<(oXFKr+&=te37Or7%m%(!@oBiB@%Fu=hC3IDCEH1Q4z2+WoKUo9*PAb1 zg{~ug`JTrQm{ym-}NhnNyy8h6TMt{ML*b&%*@V7lm`0JyC}6A3>ho5o()dH_q||k7pQOn7W~Y4)YkYonr) zjMC^A(FMovGPvhsS(CPK%j{bupbxQQPW~E$rOUE=-%XBfl={h(L$-oCZWap(#dHNU zA+LBNN$Kz0e^;LTwe)ul2P@dVNeHsVwD*OLZ0%>rjW_yn82>SNCrY1?m^4Ju431t*PBmP-!n3rnL8V zNmKX-klD@_zeAM_jsQ{yhMI)s%$F99IjPp8Ew9Q+b4YB)kw5be9U_LyB1K1b(^Nu_VCWUFxH6*VNV^L;&gBz!8@#Ck`*wr zV;^oB$occ$TtEx*#{N5u*6SzpU=dPK&xL;TI-^k>MxVu?k&MhESST!O&C9e^4wLg( zDU1xKM(^UtFAq!2kS1?Hlxn(E(SkRK<{aQ0kWah~N+N+*_43DS`k2F}X{4J&w41ox zi$qR$$Ayep=Zcw3zAhjeTIh2(FV0MO0k_??HSa)E?L%{J_Rqhr{J6fE(eou~ zBAjuCVTN&!>6~2aYbgwpk(RL~V|gEa{Z*eY=P0ycNPBBzturCa8So+X%n|*$IsTUh zNOY&l<~>j1KzrRe|Lj?>N_cvcCXl^3bsqp;ws^e5ei=sA&;`mf?*izQ2!T8{05#f% zgQ4~~yz+t(abNG9*Ir0xH41lH%v+4K@JL>Sa`~g^EvgaiiqW21BA0jdNm(SO9}I!1 zapoig<(Xgdh4tpD6}g{r=)dv15lyvptJ7fy)K1N5pj*~^nqctW0?ki>^4_GWllX}$ zZ=SI~ILI`#H~i}+0Xi4Ix9$u{ukQDUs=DV6!Zs?V`HTI;#f=Asm2iKHI{=hS6!ZX5 z|8Up}OC3{Iqt%l&SUC{lUSsVYLElbb+&6@I%fh#9-k!RPC@SsdzC`(Qa8r<%euWhzVe{M^- zJhXnD!+zT-@>=7z5)`9U6^IMF4>@2NwL*^ER-!>(e&|1NtnIxGQ<`55zX|ZMYh=<) zJ{xAb+B(S*^8lT9e+0w@J|0FSaH(6 zuEv#Y>8q9>yEhHA-9-5876a9+I2j&(VoUi*Y#^7pq;Qm(Nz$`+OZB$6OY2Wv^|BdR zhV+a0=ST!?b|=@cV9()uvQwD?RVq(kdGF13kw%)-Opdo1P85_l`!e+s@!8e<9j~By zGh8uWvE@qcg?tKq;GLPDxkrOE2?z_p1-3!G!IP*5{W3qYWrO4Rrp#BZPGW13r!58I z7V5V>H<2#A=4e>#sm@HuclJOlt(P69rcwpR6g2j4Ew2xV<>tz&IMttT%#?-E zl9)$%v~q!#U#K9DKM3j1=)T~a1#JDi>vxkt4=XGVM)c2d8!- zp{^MwqxcaNedow&?UvmZx2t)Ak^ZD6_5i`(h(6xkdn7&gTQz1_KvYb4Fq*xz)$PaY z%IsEve_G)6fhr<`S~;exNdBoqULSWK4sRSlo%I!C;1MPUO@vxFUVzRsFXtL=6NPHn zZD=})?*lGr9_xIY)NaaBL)jYpC#d?l*3%hr0R64S$gR@knLt@i{sI0hb@!pS=2v5J zzf@Cx<`2!U-;4QEsSw$^yNEmmF_i4z64{;t319yyP)&UmrF2K57ccY1TD78=dpD>P&3``GRmF_ntlrFF z0&li%xCR*uN3%fJa3AWm<}A4ME~~SxBt!FDPX91sp5Z&$OhINdY$iXZT?Kf}zM^xR z3rg2<-z5DLnJ<##(Od|FybBpwq08nnnljLTj3q~w^?SB03rt7xs$LJs417r`vR7nS z!~;djFk!ha8AKwQlt%$d00pV02Mw+Q|O$$@?Em}?Qtsr4KM`iE6B(d8t8r_?#X#3hukB%nS?Jxt-UVM?K``=BYcNrn1*&5(o?+R z4AFKn*_My${O*K9#MnkrBHRX*n8#?sRSC^I@Wr7}pOtR+ajRVhXtlt}s_EI|bG)i- z^cv#c00T(%XoddBz4Q>td=O{{gpQJp6YUBhSx-%joDsT(b*z8MZ+P|<|Ih0A|6o8~ z_n2@kWjAULl&3jdvq(c6?Mt*tn-@@S z=yA)cBmiitgU26DD|SZzz5I$WH}ZYd5vY}U7bVmL^cn;V+_iFw!)#n+XH@8$Tx4hw zDlM{SRJsp1CYdApE>|*sD=|5_dc{W0iS^s0oVFrn19MjY&h$-J%>s2i|KU8X%9(Uo zU`%>*P=zb_7>(=YTZP4gyq3pq<2K%ZK7DHoAtvEopm5eDbsnxEkrkZ>C}T*rYu-V= z`rZuObPjdF7Zc*<+rzKdytFC5zn5WANukh!%l*VQnu#lx(Vo(R+y znYatb435}9k%3ksa(?^{gNx26lqTcy0kvh1JZ2qf9nbEpZ=a49GfoZjn46RYefcP3 z^V!f&+vt@%V-Oy;U1Yc{-t(6KvbbvtzC`;|WLwIs67J&OQXaZ~nqY!r-b9d3S=Z0! zg4MPv%Et`&I-XJ7do*=>961Sy)vp|%tsK(~tCImmwF-)os09}lXEO!EaDMF;2H)J= zz^T^)>VV47vt!6@wMa#0H{Vg6$Mhh%BD;1Ax!@+pvXS4YU}BL?dAN(_{pG|zoX5LY z%1bLUE_RHvn+`;iuQ z5xoABstuV`5bf&WO6*76#Vfjlcnzbvgx!Y?j24|L`8j;Bl&B2HF%(Pr!Z zguW0;@ShX7^YOt}+313k4;2vjAm(T7n2uR?^-q}HZvCr@*JrPT9s9a0wWo%QZO@uLp%#1+98)SIXYcV5vjtSJ9bTgY!`h zY0$XGW*TiW#`}ljYEKJ!jlV?H;8mzy4b96x>yq1&bUfdc>pehK9CdXaVEr>n$h_XF z6nSmKKNvqOr<$rA5V($(v(yf6ub%`xF$r?Lbln?cGIKF3PZFg=g>C@Oa?hFaxP9I- z#GV??{4ISiIyzBgu8u1@aQGKT%=bghV+Xdc{H;Vw-!SJXp@nN?o`UFiW;7HvTc2yGWcJ<}tcr)TJ$}2^ln&;kn zM=CS=^$LLC!Ahq#H9u}Ehz6`$o`k744VY^Be(?bW%JtK{4;eEP7< z4p*a)YP#Pr(H!fhH0}ygXX_Sh0dlxeVsv32HkTp5~4YpdI+GQ3u%5?zE%B4eF<$C00{^5Ma z4j+{yud3Z{K&kS*H&V4#LNKo#&`GJY9VB~g1Y5&CLRz$V0+Dy038qES$K@gxWxF+X z%=9D_BWo&o_lgFQe9wQH@roUR+lDJDz9)`03R{zRAx&%S1CvljDJ=&?-13lEol)H& zUpC10ljjNyzZp~tAGrRwk*U0A$x|B}yIq73=p%V0YDd;${^3Z65;;1TyC7?a1LT#q zpc1$g`hRtcW^bTwHS@#v++91IxOcD*X~nVSd0nLd$H8&(Z{n$a!eRA)oD~co_E|RGTjJt;cafXLM)!rbNl~SB9iMqYXFC z2&`ooYQcOkaKwvH7N-~Aj8j`FP3O1iDq`^7c`?%F$;W(vyKJtSYP(Ss^g>(xd>r3p z0V-$%1tUg0SX0+ysot>5DYt+cf+{`2&%-==zph-q+c}gOSUC(G{5fnLVB)>QZCx;W zxOAWiB98XZFB|MlfX~*qE9+4a7HfR*ODNya>D5xK7}ruohfx61qV zNT-L_G2(A&o!5?*qn{}7(>)P+%^Sr4)8QbbDt=r>DNQXXp(?uKSl8n>^9s^Q@pZy@n^^i&)5(FMsbwBE7cnnadyZ z&!>Nx3bDd7i4=EN+p|``Z>+_*@j??(S9vFP)q9dOFqYWXQ;rN!Jkz5jmuKAR6Vof+ zF}5Y$aK&vBC{dFb<~d~&)h9-vD5#_@&FCmww7Y7ms1!X|1(N#9^bdy?q6jfb?kPR# zXCIJfjVU}UHGp_oUhG)SMnPDNEMR~WbXA5!5x7EFM=UWY z3U_r#Qg(WEl7qV~XJLeutj?YVIfYti*7ltca4vuMYVQ51{CLK}&XUR09g*HL-T3rj zZIE=k|{0NV{X9B+sKs&`*^r7<)bK0t>jkN`YV==B0zdV0^Dq` zeoq3W^U=^~0o=&OOIyK}^dz`&07EQWq&^<8J|AUzN8y*|~Qw;k&2(G|>aYA1~Cs}JLEr;5nLYpSNt}~r%3*m+P z*N9S0N3L9l#MDeFxu)?$C~V8Us)vX@IyBGgdo|}{n|ADIPd;-SD`o%QQnj|f(N&1v zsQha79&ur@#syl(p5nvIRYTyt*upce3hy~VJ2SLN$d2R-Ht=^mWE{Vjy$!Vb?Wy^1 zC8I=}L9}gX!?3vNaWQtxjQjQIoS>cc+V{OsaNw7?IbXb_;U`?kH;+qeg7~diuo1%m zZ;)Wy>S)=$h1IAXv`cEizgTb;=Cv2F28)YCaZKnRJvmEhkuorAsh=E+i>J}cEa(6G zQa__3^~WnCLgrk*s3jV1Qd#x$-TTFkk@ESxKmTx|_Y7#x1MmHq^cGv?pm2+{+pha} zVtbmOqlK5(uytnU*j(x0G{4ewlSe{^o}&aS#%c?$LoWh__t?p4l^h-^0V83b%n5!M zE0gF9euU+za=HEhaKgZyJ#9XE=qu8yc#nTL!pA%8+7XeG3HJthbinzzinwH$_7sbx z^+8qU0vUtJJc#fp#yHe)z_73`ESAkIU!tSovl4?U+i?C5#`{$;G5867M~DAfF( zt;+xQBsk_?4Lej2*v~vr5a+*>u1Av%F&dbNylV|~96!3dYNC!vV`5j~sbB-^8O9tA zJLqG%ygDaDg>y1-HRK_)DLi~$=GaUs;z`9v=RKn zS$`gaD;0h9_K!4MEu)J!R%OR#zilc?EyVq3Nm?!9_F^bs{E^b-=(I60cvt!r6VG;S z|KEH95b&q5@estSvmwWwXD2rPXzHBOii-68Bp0#zFfbS=IK}V6vyClEa2$61{u@S8 z*j({^{Mydy!fy6&!TdaMXcG!moUZ?cEiwDcb=Ga?@3$fWyX@GBXiBl09yoz<2qeT!85g4xQ+K)m&3 z??V&9Cq}p_ln==)!T0R7@Ay8gvo zc8n0guf*;jmNuThar1WB=DBh9nTmM^didL|@7X6`cAnKW)=DdPR8VK(!Vhs@KhwnU z9$nASo|0ACq21wG?MJ7JGO7J9-)xfunCwMiJf`{n0=+M`xmRU|iq$v_$%a!{^F|68 zD4R`Ag`S(>%$ND-8{|06}3Dc6Bd3j}=@XL~pBkr*HeL&q4>X0tD_Hv8o9}=~{SPJwN*cTdX z(e2+HCq&T;HJqfQ8Xvp4v z=hw7iJ}Lp`WO`#R>$~bm2?o)|lk}?n|9x|}`(J)YAka}IGkFs2@g|;+D zKJASzsqDCrjE4i9U`&p#WYdPpXp>oXm2Wq4~)ay4`dlUnomQzjX=x$jw1rhSZP z?M;m1Tmovk&r1M2WR15<6T22shs_*fV!ngSZW&_a&l>ZQ+1@DXfx#)=TP=CQ$@|{- zb_F2=Cmt%AWx3UgPZ{T;?yZS)A-|3-$2}(xGlTo?LgxH#W}Mg!Atm>e0pebytyx+%fkd1QagKyk(g||)qOu&E|n+n_JQ7(GVe>}Al#R}7Ap!Z zb)BGd$<2Q_=A;d)?OFc1+d#Mc0Exq@l^g@8v$eRisBHF<(X5$NHj3SkcJ%eb!qZvn z5~5ducGS262R~#>)kZ~*1HKLa*#){xe}Zk~8}a@8Xgw$As;Ug95%!rIjTgurqm)eO z2U{o!G>!6vSt(WKK6y8DQYT)kO7vjP7f{I=UVB-1mK*T9YWU@a7ywlQWe3FdPj=9H zKvKL66HWT5&FD2E%Suwq^Nqu!&F@E4c|5Hw+yhy%Q8u6RW?s0EgKK-4Xk!&yrGDhR zDre&DSYh!1AIbjOVikOROy-FjVP~97=mHO){)NTTkiaFk0tP)Q+eK~y1X{1<+aLo| z;4GGm>Sf>pQNn721AiWncyUxvMJt?HG0AOUN}TFVi&Pl-uc6m72$Wuzo5ww$K(9-b zAq`1^69=BrtJ>0Eb638Ety}j>+e}^3cbNh`1825;1SJ*|O)tRuv?Pdsr=n%JKpA3Ex`6Ol8uA&F|lWeq79(Af5C!6?k$=%E;UMbscI4CTTgXFb3eZ zCJ+0Q&{VmJyo|#y1xoCMPFQ#3lRdHb(cNnKF=7M}v|q2nOU++mZ$zVA((97_1br;q zboIjC>ak^cAA2?Iulnkb8$}PWU z-q7Ood&}&SiYkguhW^9x%yVhi1kOI%rTzQ~oXu!Rp@fWUR@z;?$SbRKJ(H&iHSx#v z9}c(|wN@AB*4CCSnPnb736t*_w5Hd36#VM1zj;s$L_&Q^jaM)7c}^Na2q@bbsAbGz z=J?J5o5PZR@OgS^RAX=}ko{@tI*d3HBZ&&QTVx3aSaiwuX31B+ABev8XWVNpS@$50 zQ<5>3fkAl3++3^V_{!{Dk|K0zpALm$`TY(q}fH6fzDw6 zK&8!-6MJl)@#~ag^P@rqC2dOAE#Bytgn4V)(99YVsK~iCvTG;I8WEEqm28glLXMh5 zncYsQ_j@@>H^u-9O$LY@TMpfjjR0V5VF%0yLm!tsA?Fp3=Gf&{Bkp4|-w*lWQq$RL zK(c%;vsTtdB&{z>md9^H^MZqIuS%iLAAJD>dC<_e{w8`yId|fWS^=_*D^aTT?ZEQ= z(}p>vnrON#cse-HA%SD}p+lBHpme%y-B;&^E@TuEepSb|FKVetYydVYmx6ut9Q;%; z^o*zGlSyqZs3WowD?3y#AS@k`R>6>VX3v{0b-z~;vhAsdk_<=n7cQUW7R0wFI+SFr zf3)OIWBWyVDCjC(sM$~RHXx%{Q{Prr($4Zc{HW3Uj1Cf-Bq?JKYa7()6|26oU0x9p zhqeV|Ku_A z*~9&a8_#QhWu2(hPy4?IsJ~?kVH(%s>~E@2!JR{veO~W-A;3s!n3!(gYsm0IZy>cW zHF6lSE%`~1s|~0BAzT}kUIhJM|3hk^ZTZ;h`-|_AB2kljk_am5~ zt!VUY@yOizo@L?3$)oH$_fMrOi$NMKTk$j;h9HoY4uu9=s+emUjBiyRF1hO8f}HTG zl`9yEI>`-qOKfP=BRsRgE&f<>-7f&15sZZ(DPL zw6r^x}bJ2iK1f})sYHJ84-WCF7NN@zj)M|-}*IRsZ}3X=taHWdL$iQvUnC&VTj6o znB}W%(L*jft7^)YUTd__=AXO2c!h{qSZ#Ou;C?q2m3DNN72vzxfGrt{&0RRz5~g!? z)e2{X$d{W|PwGn5UvH9`bm>nxyHQg~>9Aiy6|67Ih{{S$a{J+`?Jw-bipmnTAp1B{T z<&E|8u@PQ!+kYjeOHz#@QE_ZMIyD@&kLusbP|fe2&B6~@^+tM{t9qP=K%gIBACsW3lb1L-3s5Mv2Bgg=7y8t~3y8dJyEDRFXzk%Je-`XF5q!=KB-Q@W|&B zDCXmi&sY!z%>ww7j`yRSu1_LOoo5gFDt^knncZZ=y5Ns?APr(`fwi41yl00~xkt5* zLZiSTzEdTB39;q||4V)K8jd&WP8NJCzr4o3EIHdPSr{a(U5SzJB0`!|S!^2yiZpDN z+CBcj#?ya)@iGH`{q*-#xzygXia z7H0g=Q6NMHuzE;aRXZNBm{YGjxgwygloV$EecyHsUZ9=#WoSJqE<4Tn-~h*f z9>>x&aZF;uJy6mk@4#XC9_sU=1PF1yFHWQ$^ zI8|jn=7o_uH+s zzjp>TT~Z#`D@QGE&uaXGh6%B_nwDjf^5~Jr3$U6g zYdcV+I+=U$&+^C?NxGp;JGM0OxaF&Bm4oWeRE-jGTrFcF`c;n?^J+bSlC}@x`qlGlpTkHEMSg?H_>=K{j`5T>ZSu#TEB!JbE}EEHj0g zu?!V^YWkSWCoMGprNXzfxEjy{Qjx4LFJ4`Pw*-i(XqVvJ6D*|6K?#bvf@BH!ma5Fy zJOP@Qjfp4)#7i!NESK2_*k7E*F4vZ2g}d%$ z156CiTFn5-s&+sTP{`Te^N;!-Bt>QZKwz!WM;a7_a?d?MFf+<6MB{y~Eh`J!-|L`s z6z0gyvOH~#omRg5@%2WkD6y)3h~k#`vAhk;oHbbI-nNtBbm0S9ZUSy}SGsz`@~4?f zZeD)WXOqTowpMTc$lP@E;I2J$1z`7SzE_aJd)vj8hW;yspcPAQ4p;R6-W#Kt9GN?e zGKSq@=V%7uWgiH}&p>UrgI|{d+~DehewTZcjjEi@qi=?|!Z$9x`T410YKR!Gm*g%1 zAQ5lDwWH%Upr($i04pRTSTbpP&jUYO=TY^bq7qMnF7ynbb?>vqgL&E8!w(Ea}>?|K~mwk!i|1yt3>kP@% zW9E=@A1xib>)Y3SdpWFhLfRAsUk zNyb2Yd<`;=vFoX}Tj1>k`KD$aZFOSh?a8^ZYe4eRSZ)nPmvwL0;QU)J_!X297-Jf z1mv17LKX#O^q3M-_dhfh3Vr8Dbp4>lUp87<$?EHHB)RH^n!%WOocp7b9d|5kx3zl~ z6+U=c5;3U0{m7=*86$XF;z*C~kAEK^{&Y02rkIQ9M#&A3is`6x%&l zf3)Nu-@nqBS?HUT#+7iee?6LtL}@JZY^wjf|2rF_Wl+<-{x+O1A$0!c(V*OHRX~>E zGZf3~1CC=78 zaT5%!ESkC6AEa3QE;7Dntqq%{d?_1yizvIBP< zrZ6b_a&~chZE%r>8&;t+3d$;_mq&V>@08oB%L#(yy0fJ{KlwDEXzRPV{QZ}&_`avM znSbJ8X3U0X`DnG8KVki%WH9z-*5;VCR8U>qqeZ{K93+1ZN~(8IqAhvL zV^#I1xCEYujh?4Wj7dphS$og8K3y>1?`0!H^fF)Dj;BMYsDJ-bZqa`g^G3iyPKKjO zOPf{InB-d%$IIJGtZ(q|8A_N!RfPb3Arg7@4ZEo6${b|*TYVerPY|rnb&@BzcUgSgYr4z($QZ=OPDZ{b{^wo<6nI$r(eJzxwT?V>$_K=+r_fHu& zWbayQFZF7A;Z#aqw@vp(Yoq6z#flCkMR~r+P}%+tv@sraQ-Buo-F82Uq%);FmA;ov zQ(Z~Pu;674r)@tuB+UM@z~+iM*Q_A83Jj79zX$)r34ada$iZ+esh{};<@xJP%^PhA zcOvIH^XkqhJ>qM?u?6nqN*)gWN%pQ#n6sp-a2+E69Q3d)Gg($s0iEO-m*4LYRLNhfmZC}f9$Ru}FY#e` zt2~Q!0zEe*oxCYTQK9MqD`8bEm|PfHxU+&*G@GZ`#WmkvIbo+h$$N`M+5FBMn(|Pa z+lb3#2wIRvs52lJ*v{hMAE0{}k_9c_6M3CoqR1mZm3q{-@$plpd8v>^YE_c@PShtH z4)C9j%+(S)dnIJ?cjjOfw@i>+*;J)&3c(S}p9263Qt$Ss2xyFA8%zDTtL}8gaQ$M5 z18$U*Hr?yn1oa1%3N2;nd6Pa&d*X zAq2T_-XlamyX6_|DD2$VTGqaye5A`Q6KSP$lrjfUs*n&IKai_ler4HuK-vob)R|K! zA%`fvaVMQ#PJi`CLX_-HQPcEg;iH|hjNF2n5_PVORWqjOkMF=DB{>|Kuhr!&xS%zc z{fCFa7e=jw`fRZXzA<_l?kBv0UjB?^2S=tYF|meHL0VHIMuY^Tx#ej{o%44kdxy*# zHN1qM{uf(s71c)LMteh{rKM1c77y;w;w@U-2^QSlU5dA~Kyi0>cL`3>;1rh-XmJfv z2!sIdm;br=ZqB*StTk(9GV7UV@BQ1R%AHM_hMzVa1ESY_#tnp-SvsnGIPAGU2hnOxkmGo}?>2Xt0aj;xOgM{^3T~Rgp37hZUs!vTIRxc9XD1THC;@AJk-QcE&Juhpv%%5)Ygngxx!vf_kf?Qn|SPd=Qw?Z>)Y9P7;QPx$119F;)@$HV)p?DtRLXuP|ddX~Mgqc>k zRb~n-F`^(EalW4K<`AlgeR=6@N+jl zA+f)R_e&{IagkISlNGMR6=Vf(bV@YEv{(dH5 zRv>SMx%F|TWqmUIMEL=J44d;6f>k-|ZarPDSeZF#u~pV?kkicSNdZ}E<2c1g4W5^W zu_RW8bJ!Cc;9(IjNXclMm}DkGz=zK#xujmNg`TF+ zRQRTt^z2W4cCNhb}B!cn{67`d=i1X<;ZGUHUy^A|& zw$Iy)P;~%|n-;-mfAWehXy>8*pB4kYVCh$mcJavtaM9T^PB1MiM#_@%TczyL?P8-a zc;VJ+JR}e4<(dokd<3d+RRWeqDW$|jS1{}zyup{XG7xE>7MGvch<6ffTjSS!@^ zXM!?0MHRRv|ovwW^yZFqgB3_Itt*o*;}n zx8HnPZDcAnPakh2wl?MzBgkA1eM8!2i2JD96JoAi^)8*u2D+2Hy-mlQ{uK)X1WfdUDUM72eKg5Z9r664&zEMa zXumV7$#esHEBZmJZB?;oY(Z!D8OBB?s9q3rwy}v{VE|pOt{gi4L>oRf&Jwcm;oo(` z=QIVG>qv_Orl444z*Ly(Wf_NyNG{{Da>CA%K1yCp^;5LDpkrLQ?PB^paX{TaW;Vz_ zQb}-4CMeZWyYikgR3glD<4z%^w0hXKPtZ+$YUo$z{f6tsW(WR&S@^F%RhM5z$LhF4 zL@1Bf131#h7G>~A8Yn~-G&TH%O-4zVZU{N$R2@IRl61?s5;v%0N{_)xP4p%mhPGe^eB zh{}sUMpomEi0*oT%0!_1-0z1NaB{A#wtY}?ju%G{6d0X-# zXY=q*``eQVs>I9L*miI=Z?COoO#o?V6;VLk3(h|*&7qf=oVKoZY8H&k9ohW=8dr!7 zu#JynQhGN;9U<@WgDPUJ)dfv3G3HR91VzzN`eSP6?wpBZ+`d+We1TcEgX0Q@UD!x0 z)CJwiD~N(cG;9JT@iVtNduQLPNTWhZL=8;Z|HFvXv$`d_T>r4Nm}SYgptp0S zw|QfAjpcM1`X#T+O{_Dp2L_}0k;+FDTN}p&8Y?uHdFG`|N!x7ax-Q&pQqC#3g^?*= zG=P^hu4-L{ZAC5jWuatYsW*keaxc2(eM${PPqq#pq{~CoW~Nr@5bU8Tedicuaev&E zEJ?Prkuz}%e)}1uGwZlm^qVm>4`g4Opt5@5|)pbIRq5Pc9>XYHsSKm}&xuZ@m;q2RJ5V*lA@o z;>);qHuFyWpzSAYu2in+bJE2_+HM?Gl?IF%rcR@!5r3tAt6ilaLmu>tpn-NRM_pYs z{T%_TdmJ8}k1<`%G@tq|jykF>>t^9ozFxNT_56&z)vS@@f*~^0H+*BWtf`9dDYM>l z~o*+Z=4uP#6N*ZJP z)HA;249ySc;<2;Ds5c?rkL9|GI-SL>NkGS~g#eZdeIv!w&eQ*4#BUfuUnM7yryeEc z_eC)9seFhT*JO$#H5QbGDKfp(Qup5w`isMdUrygXHA2deW$nZG6X%ld+VygHeb+L)KtR@v-y<24N;QredWfAtFDIQHK zeW$1Q4on0yQJpvbRKqLCbW`MZ_3=rw|9NN*WP}F=6}|OCr|N<_?#@;-DYlwKP|R@~ zMs{940J|N>E!$mTGXwYzqSFx8-7VB-8&Pa5A%i=Z?uf;ntR}C}WmN_UMN45C=odB^ z(s_j%+V*qsi5$;W!)n>F@A~I&E#lO1 z$B~{qt^?5}N@2%WqIx~hp_{&suJ-r02Y?ZDDdCJ9Gl-N15ac88X6{-&#(PHMqvfKu z&D)_jHRq7bf15gMhFy7h!pO-;{seRqnj}kh)!b}AIIJ$#_0<06y$SU9DMCKyz{xNO zbhy1a$ae@^aYhXX+D%C8oq5p7W%xpOzWYS;N|mDx_++=d$ryN7wWo{Et3Qk57}@!G zwYv#crQ7kol3f!^+{ZqE$4dusvVF zQsbrol8|dg?ReD&O>Z#YFB-J&T}``T8s(y`BHcl=K;WCGru{m$y}0st zrb_fAV`Zv=8guSxj%oZCG3au-n^;i3ahCOLOgE0XZTkfwC8m<#w}CVn%2;z0+M??T z?%cfHn1-*wAh62Yc$=11w4W!~Qv!)UoV;GzRn)rK>3OVZhTbwk5C(0&f85|Ctzp%^L#pQ;|ONMv}XxH>+8=o%EOQ6&_mFDd4r|k11x6 zc|n>Wn6M*= z2nI%&(+WZGA5_HSMQ`5brzr7$#Fo`wfAkP$<7BGtp5Rx&N1N z^cFi2qf-py6H~#jTR4sLGjyB}D8n;{UQa>0=QHloS#7P^E{Y|^vK|Mop>{7*i{+vX zTgU8d3!|%FDlzxa>Y@=rbP47zCmZp~tG4$>(+Jl7I_wV-`C5yWCWJT~!1P{5hEl!S z3dAH_^EUU^%9ZMt8wCn>ny?U)-|!QPactC=!S)ZI`GYtT@JLp9l#E@}o3GW0PcNzN zGP3#lm;obM+lY1UbE#WEpVT?mE@wo#Dw@wNB4u?>!Uq& zS*Jj&!5z;~4EKS1?207-WTMtxapjNS2Xy46mH>zFhFF6X#Mj*Cq0efdRWj25AwcKLCrq_3@Eh-Mp6AfJc zV$4@v3#qs{4!mnq8J>FXIGoOEu@(6r#zic5i_~+W3*^aFjc{6Np?(ctuhV6q)6$%V zVioCLaRxY$@j0`N7DWHA9Z8^};0H$X?6@Oy) zSp7-+YN?nzot+Oz6{D~5YpVGLV9gGl*9M|RR^@fj#|Kl|2F}#=mbr0h?6Z^@3Z?>o zykvcG0qyjv@(+$T)!&E;m#SB=V1eZiE4FRUeDj)??0xG+ltRu;q^8zx3yy61@~)qn zk~$y$*Kn}nsJr9w(J;1L#&I@2fGKW^@r95<-@TAX&;>GPX{az^p9h2YOaO} zwm113$zNJTb9`+66ecpMT9#H|OoOza^QnlTubg8+2WNlgy9c)aFu3ElOt#E=&?tqK zD~qCOrL?s?w}`5W!gGR*)GxK^1|N{sS;usY>~UjO9GZ?N)uw7mKl4ALXZiX4=C|36 z#cZ#Cx4%Oc+=SNbW;=bOk&f=a0vul-T0dC_%Umwhpm{3xL9%y8ZC$tJT_ujEh%x8K zhRF1u70|&&vO;=+aEE7``=Z{t_)SNI*yD^Dr`S!K)~A+I<)oThj<8L|BWT6sVY7B7p9=a?_G`hSa95tSCB7NEqekI&#$=^+ZPI+RH zQS<&GqnkGo2^ga1<=I(G6QueMM=dl3jZf>!&H|U(jEj4GIz%tM87J6%+QYoaZvIxs z6xJzYd?Atu-G4Yzj|MpSIS$5haOl_;T!u=tW0yYJn!WYp*B<(@(OcD_29nVp&xupI zXb$VO8zRH@RQxDDXcR{hYhD2e)Reqr+Z&lxqEUVq&f##foUd3exvoN{^@(-`>S`3c z{iXdDWAwS#SBdrP$M41C=(N53D=|DKmi+$ay!Tam5k7hq+3a(vBIB=1E627 zt)Uk2(yk}{iCivdslGoe*e!V|5yc|aM!(JPs4h{K^E#tfYWZs*R7Me{K+}q#xbN(y z5fERorusga6a%{M!0qCB`W?87gCzJTE(X>UBhw1yc-pLf4VJ(UWpIm5p!5m-2Sid_ zxVg{Svd-=_0Vto`Y=qmjQry4n6z8xiw7VOHdfHfx-Br%#l?smQ98ngfV!Y(;pwi(O zf&a4lh4n-$5fV%>gc=x3a#g-xc;c+K%i;gWifnkuh(sDakUm)zd<-!N;v4^M#s9bl zHRGghp=!TCDPVRJd$|Uqx~mwcto>YfR*kG!HKjYURrhQJO}*U9#KlM&8`iptT}UZ8 zfj2>scR0$`6R$iamrw!sxIyxFkaxH;DYVY6*ROeiBf~!x?B7~G3^PqZh!)Mu%o@}12 z>8iPWG@5jIHkhPQT}f!Pix~{P{^6B&3{8_T0qL|j&H-nU`IY?0wtW$5SBbV&qe+|& zGojSBC6oeZ?4Yfa?}NK_9($a4h*#} zJzSLU^BljiAf^D8K*LPFnVXJWKc5km+rIrFzbKHf(>MD^d~DdM<~gj?k1Eav`iMcdC94Kc1|TaqtjqN*jI1hRn{(c;`MQs z3jBWaB3pX7?J>3Jk5haDus(#@){8u@DrHsRqpGAU{DFlsWOeIG_QHy(K_|j7yHs&q z7PY2Na;eSnj#1la!|wTR_jiHM-7c4%gf(`GOuq>xSBl!Ey9_&%805Nqo*(TyK<4wm z93sy`_onBK-n;Gk$zSDjU8`R%x#2IR7BkeigGT&ABNrfQ`(sPmDw>S!<=+-3%#@r0 z1rtUI=WH#WA?@8T zGqBroaarfy$|~kgfVc*nzWG}>q`Auj%yz)qct&6}S*wQKj{S-(Xg>lpEz%GzRH0+i~O5uL(-tacd0`y5}ud|Hp2(6%93 z2?jl?pUD|cN{FRtHK4UXv22CHyWOwBwYe_k&)barUp?{F78Z!pS3P;ngWlB$|FqVi zx;Vy9$ouFW)b$i_mu^gUIHIQnZs8;)lfg+EDY6I9*;-GI5bKoQdE65Dp)fDD-les{wg>B*b~0@R|@{-&&4!# z0+1-Uovm`tsObuvsl+_xIAJs#FE0qajZc-|BrJ;jV#^~nQrD8%b%wPOE@0?UPM zMeUtq#j=!@ZEb(S(ZyKI=~H{hjcq z=T`ly5NPGSj7UwTXQ5z7*7L`GM}RknaoUPe$p@KZ-FmkX>hZYP+l>eVcBi!+fip&- z!hw3-J-M<|IC0pGrJB+$9EY8)xgsTKj(w@8k2BvH;Ag1dVWUaJYVUVgYd0fv+Tb=A zn`mjAg`t(?i7}$V(4px@kfc^wHFYV9SriRg)UNzA8QgphCGa~f+Vbr@^~+H)Fyv)e z%-sCi{Nc<(12ouC@~plv?A5Qs+w;&6_`ARijMD(6avQv) zx7!iIj7pla1yg`sAjpMlS+B&sp9pLx=hmBfwZq+%~XxeHo_vvFFRdg=ODG z;>*A3mzc!G9Guf`O!q$H^r9YT{dd~85T33X&{=<~8D@WG=t%Em1HWEJ^{tzCqN3bcYwJavH&riBTxCQ4(<01hbZSEE>=X2#9S3a8qJ7^8r-NDpNa%s6uao&l z<5injp(NniCj8{uKc&4r`w#Tw10eFNBd{L_KfU$oxcj?elo5d7S%(>^(0~!yZjjRu z)Re7nyk&j~TUKrWT%?EVoQB$CWjqoc7g#*O*Qr>K$TMGZFt#n(Q(n0`{^dxAYj^b& z>}u98nY$wWkTtU>WCj5yo8S`|{g!zwQu7g*IktwO$0L zR)`(eLUF+w#Z)i8ts5s9bOQe1oWjWYxB5e>K1~M=W`4b(}G=-xdcdwb&Pd+zCHB z^)cNUypG@AxJ%J;C$gB;)k25n2k_b!c@&c~MI3-@km9WD z?|&=YZTO8EN^fHy4Z61;C-%Dj!(io+d6hG=0_2n7+vjykQ+^jr;Kik-@=EWy;V^-{ zHTbs-bjhmjGx8xprLZGuG-d>!n_V*nXd3l?jAlRxU7gz=M@mAGtqIh=r41g>t}d^W z=XP}9O-r_J?0OS9KUcRA@U5Tr28&;@b_ws}?}G}M1}7vQ50L1>2Ik~58#DQ8}p0BF-wn{Na$)^WbXxA z(w)0eJ9|@3#77`EFlKTmNNeg(JWHkPN8wxQf%eTImuoVFu4s7Nhm`NsCr`<;Wxzx( zDdaU<{?okEcRwFLKRbW3cp_Sk`(|OxV-i41QHA-Rnxn$(=9UU!TTBOYJL~#WF*RGN z`Ry$SZX4qw26I={42~Ydr(vjI+hegn%mnI(h{ASvY?;&7@XVdFtHbZ!*)x`v{>jUh zMiXm81v#4Xq1*RnyPi3Qgdzt*h;68kR;g!uKn3B0g2Rvkm9ZA}43Pm-X|kn$Z8Mim z>0T|Dc>d&c;#zAGTu3iHTmg~H((&@<(uy0X{-=MoxNLR5O) z`u8oR^*R$2UK0AJ`{fcc0*w^-^5@#at_ea+x^ectZV!vOE~ZXginL*G*xDNtE&+ve zaXYEy+@0r7F3wSCiRG`usTI-x<>aysD~I(iMr$795>cP|orT&oY>kosuX@Xw=@gY6Ul|L!F|sHQ=?QvBCB) zF_MPAnSqOnp#H_2`Xy>hl+S;R#)p-@Ph_t4{;vGYUaV?)L0rzD^@_%#iI0jbI)SG3 z1To42el7L6i~aDZx{5KYs`hiJxEOq#r)l>pV(GZQ=W_2q4D@{8Db&8cE!+5^O3oC6 z&@g0EaQe$ZE!CFX)wyVHU`n?c*91FM`i>%AXtzaD z$*dX}v7n=1^{T#J4g*OqaRLj*y*0l4+oH3EXFC^>#-1~^hP&Zi9^bAPOIVzbqsYFV zn}ei&gCrhtxWXxee`^#&TGp*xDY-~l?>(l2#7bu9PS*RRmv zK(LYvG`cH78&UI&U|&RF4Lp64Ax!16lL3yY!QUj-KLDpIvc%q(Ht}^8WH*XyR*Z!- zK3SUKHotD}a|&|Vy5myTDVInJ`Ro%eZ)Lx4SMyaT6VY!s0%W1`oMqDK`jJWzy`*F= zd?WuyL9cJovt;Tvhpuy7n7DvwRQEeWYprFIHq+a;Iz*iL=uWWy9)c~DN%K~E?`(?o zEpdtl={=7F^bbtbOuZQ#%h>axXfgh+HK3QwvXsCys7M3>i-5ftWS_X`2Y9tk+nvTD<><`oxq$ zIUJpRO|S0ubUy2+YrVha@~LJWZlC?b#2G9TxV9`U-^twA`znxxNvD>~b(5k{cfJc) zu%j#Ep&)3cG zFmx0WRIjIYR=WImtlr9>Pzxkb-J^PVvQeui&LW=UL;L^7S+qU+FFgwX!>C+0yWaw! zjrslm%`fORcA1smGfFZOIK#Owdxi0x`EA$``_ltMVE1$Cww4i!s*SAd=z^Xye5{(s z>e{j8t{DA+ZdP%x*$&@-8=kIf;8mBT2`dM<4Zq?`jJyxB?^LV_w~0#KStqL{4j&i$ z&~l4c+?LbY(^b#E>4&wM+rR+WK)Z8bfJ?e+{b{rf?0sp*Xhc)jmwd77+a&>tM^bgQR7;$qoL|C!djjq4@V7+OJZ^MKCMvQHZ7@fH&n_{U z5OAZyM2?gV%X>c%J&8~%Y3o+}e;8vb$f=;KC&ErYR*)-C@hZj7WiX&$LJ#hkU-m1L z(nphpxS{6Ashg}(g;-!NI0E{`CiYpwiJDAZMjFyD!|DPdp1!`S^`jUA^2onn6xwdJ z%pRC^-q4eOwHa*JWxDSsy7OYO31*^rA^+tmu90Dr(0HCLQE##?A%qnz@Ct;8oI2Xy zCd|A~5zm44;f67+_7b)w=sMp=r0bBdr)*Mn<#@PpwNWRQAb*hPKWiTQ#zCQzMbH&> zzxI9yh;}PKnQpyKq23~uAiMU{hf`ZllSwvSiCWTJLUB{LF_IK)&OZqQEXJvutt=A< z*Zh7ccMZPa0(RZ%a)MjfT7(*d$`B@Kcq!jI6d3YgW<&bzLo|EW;v8 zVW_At|30)tapnKi2q!hyR2^3GQQ)Po286a7ILSMv5G_~56=)A89`Q2{)GTb9z57W} zo{x_9LsHM=eY}TvG_A}hIGR15QIPBN&HozqBtVpc@6cMo36!jh&7!`hc70EmIlG-} zS(1?Pm2{_FY5ZHJjIme<+&~vt&fC8{9J{g(d`wub$Jokk&ZjYuDP*Vg>N;7IF{>wF@1dz zFh}=H2?FZ9j6urX7EHvSLC{)O!a-R#`_t#3@T%D58_7YWU3^7ph?qG?b6ZX%al0@a z0MOHn7|ZL{OO$kLu|KFRjQ%`t=j7?*CV<8<__r1UxU>| zLDSOONc`=}3QHogtf3Wvm`ExG1>6AzIn_2LweKU_hlO#B@gzE7FLfB`K4WMqP)0{T zpIt)*2PoIqeXiwysuy?Sd>9gC+;_bi9s3UhuYJ=kL@6U@=3eDR|n62~S4V^gI zXLYqjY|3!2m>r%FbXNU4Qs}>0B-J55b=@6YR9-T23pmq_r>=+2_;VN8#L9_za%xY~ zkuj@qD-merehICip#oCJYwBQIT|L=NKJ>nUaw28@B8D5rc^;-txrgJYelLlu`RH5% z)zrzikIa+x9oWqcvKQ1z%jv!>s22y9}D#TNs%NmCQQ zJxD7yb&TbAHM=pz>}AV^u~{u*_S4SEh$&xxxluAEFuQu%tnsj*pWkH3JktHd(kESk zp}kO4gpSWR@0=WZ7>EQ}6YpM8vR~>SdynmNK7?BmgVyB>2d)03nHepP)i$v=^J1fP zS$HiLxOXK7gT5ZUg7)b8DHK<3hyE&wV%WwFkJYnoQe$pVnzHs#tJ2POvN#8@<+aOA9drnsm%)(jR9Y~*fV|fBX&Pt9_#$P( z^mT|Kzx6I;>iVOwkBf5fsL*0>jERwMz9ttMQZu+@Q&akNoLf*_)+0TFKq#&Er>}_a z{?jzmzEcr>!m)nJ@O;7U-zVCb;=MVhkoOA&jn@?WD1{(f4vymw;u$945cw22ri(cX zrUbG%3OdvXsU~)vp+AEimm4v(Kv800b}DC#zOef>AqCSL+LE%yQ_+C=Pjw10yU*1^ zR}Zrg1e0jNoqn;qA=Ei!{U|i4HL%W+9aRsT+<)SGeFXGsF+U!>)6(T&BK;g8lUsR zTCc_LC~mQ2HPGCnl~nwUw&1+MwkX7Vy2JAWE;$#)-#7}Nw}wwMGdKQX7P8f8*E_)0 zYjqT9Tj>vB_lhi5$>Xczgh0KPz>MyH{&*Fhep}Xv(Lc2|$$j7;U)ueRelKzBIJ$7& zG$iY&bgTw%Jja(EZ3~Ojw(+!Y>AH^oiwjp*N3x0xi&2!7Zsbmo}z#}D~W%Xgz+1PW%j*q{``^yBbLus~L zG&@WOYB;)>TF5y0fP6xSLyV0T1r=&j4xZd@g7bovB-4bi`i_BnYM03g<-R`h{Jw~Y zb7#{7BmgF`SVszUbi3zp(9L-lnP2?zsSp`mph5>sE1O3YHS-)F^j03QJMoEWrLh z43J3Cd1Xb$*>MRt{&LK<8p+=|k(*~Kz%RMhim&vV?yu3b)#&LB)Q zfn?0|PnLYFV=}KSk5$L#MTD5JREjEC_~{N+tWrVjUG*EUfnxf#aOE!I4y1+@IKT~8+{1OP>Gi(h%RDuJX*jp#Zwyt>Pb9euyjhSe|kS=Nf%pKw@mm`2%#J)$0*8LKKJLH4`oK$e*W z@|({b-6_s&kEMc(FMrvi>wzOL5ntLx_j0&O=FC?t)VUwtyk zYWHJGR=^|e{$c5m=b&koDJE}A$nOy%o^7_S=EdEN!@Gv5NB0c^_;V;}A=snh!PP1Z zDz3Vw?JqE__LDH{4y0}Hb=~|c8X4@C2QiR)Tt5|#Q2QIbc4q-BF0q_Db7V?3?MY*P zjt&tkra1>C-1pWrb*!adL2rW!4MxjM-?`znU`1giW249Ta+2%gjOFf{bw2gfPG3AG zsX7PX>6l?E<4oboN^JpcKmsclDkA$$9_+EGzqup5d{wjnGZjXo`A*wa|7BJA7D3O+ z0zvEqbzrgLbxX?viTq=`B~A-x@9~ztZkXirZ`cCWTbDnU3X~Vlj_~u>yrfMp6BC$a zv=QAHpKr=SX6j|c!;utV#}8Rtb++?o8}bWlsKEDGux_hQQG@V}ecuAvz_0>V1x-Bi z_3G#@Tb55pCL!Bje41fn2+aJC=WRbtij&K~MLH&Me5iWpA}WcIeO|IiFsx9p3;cJe z4@L46Au(6H5WdLO1((M(@I_8dpsQME4<`c@`B)h+6Wz_2xn<<#x$V@1G-=5V%Z~&J z`U(|Oe$&|&6!Hwm?v|YuHK;C~+o+1RN3*tUW25<0sKS!z|LJP+YH-RdRCT=mQqmjY zPoKRu+@wS$;3da!VZV!pxVqz&Qc_ZWS4Xo*_CEbPKLAby53F~)2__w$EiA$Gew2+_ z{d+{V@Iy2Fv}ZeoU(cVy`%MSde7Zy3ZH_H}&FhZyNVii?B&T9-@GAp*BvB9)&Z!*> zq}5e41Qu%5?MmEX6sQ-iPbQ!|c7p#WaX9+)E0dRen?~7s3&zK;Mix zOzG2E>|rd!7MXkXC%MvZSsg9J`3(dVFf_glAvUd`ZyBIsy$fa*(4k7;Tz-T>sW>9v zD=5RSQ-JZ~K2PeMHl<3ra^)6ce&)>c_rW`~qurs*zz$)iz@(`h$)(Y%5A9%C2apm6 zH6*Yw%{G{;$Ux>TW$dpB?cie}b@SGBi-U6qi>>VO$w8iqFuAzw>}bdK7YTBUwYa<( zX_Yv|;Pmz2b68H@9=!f+^vu{w?N9aeO&_b5pPhBNnDTrt8Kb+OuO3yqyXRz8rlN<> zC1aDvYd~fB;8x=E>H3qI46(T>?eJgS9r4&@PO!hNw|Ig?%6H?2mxn;%t*s4{5~l)d zL{y~i$)toNlW z9$xNydud;B3;#TqmD7nAcuj3zL#!hbhibgW_v0<_8i-%z`dpgB|VK=*18jyrrZGKybSlVm{V;pX-uee+D$#^mvuEe|nSOAia@Y_S!&P?H>YE2@u$TP$e znGtd}Db4e&-0Ar?e@lPVsc(dTy$fTly0JW8?t!cf(=ojcF>|qp2$+riZn$ z#38TJP|M~*G0!&L3e?KMLVurM3>h!W_B5#%tkP~#FjOM4F6ALdGDlcSN-zKDeM%@+ zpUnILQ+$10x1S{f$4tkrik_22gkv$dw=sxsjK|$qRz8gQ;fRf@$x9HRN^sR`)yP>>o26(5l%4w5S_i0r>9h z>-Fg}V=tcnxlvASg&>ipp0)*8{a_=Fd_u`=q*vX$n1(d!yqOkn=*S| zaU9T!iE^5&H9i+PB0g*4efA^5Ml#KZ08FDN?2ibYy63|V&ktl1C| zDj1F%%@uVTS}9(;XaU~?X#Q!}gCFt|n(%4fXnI`VAo2ghP-`oXP|XcXqa)2JcK%qa z;Qv*6#_GlT7N;;*vHZ?t5UFV2d&u-{_&I5-kZdxR(ta{qN7GzVGB;^p< z!m92DV0BbIpn!e~8N>67+H;>#W`553(9){<0Pjjd?dfJdiu>$01FZEs+z#D0>OoWy$)3MG#TI^K)BD zM2C;-=VOiX?||=Nz|YIbm_p8jXzssFLN2C(A0{q)zGSnEO&jZcsi;gLCedCLi?Z5d zx(_vLjJRySVjc(d3W*B$ry?1SxsO%7t11f44%ON=yx`ng4B^wo`C^ax}7xrY1Wc`F~l+wY0IURbSG(@3x2y% zaXoY@txZ#^!_^CyboHeY#xEs;nfFb#*Zt>VJg(G`&f;wlmL_e2lme|kU34~pry-@X z+s@gKb_N1J1B28rK@8j`&t{lvMnQLTWhHe#OFd--Tos$h7>0?@IecmEA(=vVZl|SM zwa-6)(pLSBplwPCTyqnmI^uGB8-e|M0grPSAkm5@p@ruLxo-3Vw*asDGjDZub`ka4 z)lv6W?&oUV0;@gg>!?8NJiJ*K|XPE?Lo23W!8nRK2 zBj(Rj(u3nP!r^Ld?OAR7!8j}E(p?Jfz1G`!BCrdBc6!*A8=O|*=-kK2ngD^TzEIA~ z-p75QHO)5+=<;p67MXYj09K&SxANb#UGQ|nkMTqhwf2D zjFj}ZSh!w;9#!^nWLbm(b{vg7E=5~;>X!vw^wDhrNF_Aq7LLSkJ?0Q57@SR|ae|TC zA5>&#*!qcc1C@Nav4K44B+&SHlcg2^BYQ<6fd+#JTMciSN{(Iw&{EPO3BwQSF!7g1 ztG3ze_VwI*_6PEKwWT$jSQ-;@FX?vQI=)fR0bQ|fSNt=2GQHHe@HBQ+O-se&A)=6>R+D`CqP8X!BRRtF-B@5DN z(&y8$u`A;e_g}|cqJrKhgxrwY4o|4g?ry+jQVbnI{>Brp*4BntSSY=-;v1+FSbrWF zIha}hhq094>5ryH&-kc~&N(Owv)u?{RG?BwnV8~9F&s$+tBw^VkdG7Mn?S71&~BO) zmVbCCMa2{^{4N5wZ7SZd5_&QmU*Y!{mKY=p>4(H(RC_= zEr#HzqVs9J(rX$@$@G_+OQO2LdkWkvP#HJ4_@&VQ013W0b?)A)_$Tq_qPnkP?>(^3i-K@YYw)ZfxNn(%! zMOB6wNmo*?j8%ar-k)-9d_4^wLbDw{Hz|;a)V(a!RTJf zUV>>OnWJVR#x)^O+Q!zmy7yh>J5D=1c${H%BHwY7ZyaSvApZc8#97Gy0E0UJ0Il!c zd#KwdDYv7g$Ye5@dP*7T9qJ!17B+UrG!w{KBZ2hPMM*3!O8C=AC;=aze(T*hWV=$C zLnb2|H9@eoMSFd$KjUZ<$vcaGT^{|{x@XxL3^iSCbh#bBNB1A)6|0q_$4e~@JYX3m zf#J18G)$H{3Vy$#vHJV3bpHU7?Hp_%rW%fHgII*9oBWcKkJ8E+TB1ZF`Xc`TukYP^ zq`uV5W3oGnSIKR<8j6bfo>Z*I(M>#b6Bxm7xTIq|F~=Z6%|8#U-GzVLl+JEF%bmzk?VYE!@EAHtD|0#R!=B7NH5MNQg`LuJG*lH5B@}3E|Yj~M~fkg?=PO!kV}H=UaH&G66N;RZ#UNa zgC|QZ2G_$<$ca%$*fmA6IR{ou1~y5JEn8h9c?}eQvD0!$kqu6IHb2Yj`CNQp{#Dy| zaQ8Og-BS0T%kA4qmCbh#%kIirn!U|cmCngEcI(A;9X58OA(Yv;tma0pcdg4!EW4j@ zNg-;=h@xRgiphq_Jb7F#2NTjW;@&#Mk&;Vb5A}bCtiA2?^LAFtU$?qOuWxOd6sKc1 zVD2hok(8u~%40Ajg^IE*R!JofrbPvit^I^AIkrN~wsG+MXFsrcbT6{yL`5=gQXOaT zk1w?U0FZv(st3C^^c}Mtb^ib)zDIV)XJX=}GvlbUd(r4HG)nCAOG_r!+VWztvr^Wx zGJz~o%zzL*AOJx=>$+T!E-siUJUx05#kB2^FX&oEDl3ux$>}M#epB@~$E~G`*nLky z_Lw>;G3`x7k7|mVT6)@58a&l9A1;?hB$-K(xKhVRKHiG;soJekjz8cXHzk}^B(jQm z41Qf?%Y5(O+01=k+tn>QQNr`mMO#l$Q$Oq4Qa-lI(cMR%@svSrhJc=MMHOdgWPmj<4;4mG8Cq=YL`JS zN_Tnj^E8W5P?YgWtX0lbfX$&+GR=GYymsvwT|j|OH2z&NCDOBKsI7fzk?YZ9!F-V2 z$FLTU0lMoj%}YzGIhw0{j1tNFTIs0^Q%Ko-oNUW@;0}o(^|?P^ZVOoSnHD`QPfn`0 z+K7x*m+kEzr_vDHvQF*G>&l1OsQHNrJgms5Xm9a96(gF8c=-6r3c&5CGBsKdEVfHg8|UAJL9rVJyeZFQ?vHGw3`J! z)}T#EM-KMfb6~dCLW-WHnq&5>kymCHBn4k&yU#sxXDPSR^A9ju!FVbDFB^SD&T;*W zI+=c9%8}>PyY1)Q%ioW9piRfy-)}Ew*c(^){o6;k?dM3;blqMUyj&4ar;cjWQlx>= zT9@EA&#vppHCFH6T~V?lo`};+i`_fwi}<_{O3P5+dT4R#iBVZ04BA*DeH1F%;kEbA zl$v*kZ`$u>Abe6Z5Ci_zq<3GCWe2I^5AN&tN9dxx=5KTM3qrz%D@$F^ab!8IWER%Y zxgKRDBmA$?eS;8Zj-F)HJC~;-f0@F)=Y3R{FRj zfgP8+HkY9#9JzDh9sy^!Vt!g!rG0SS0=Iv;B%47HFTFc)xUC!Nc8${A1`S)rPpJw4 z$9!CIT-U37{!5ARYxx@0?#jRB6Y=xpPf~o4?WrGaRQ$-T>#APS`0=*7zHEa@7R=b$ zorhJG-y2sKmy(hi?ah>v6*;Id!yA~Xpc>>2ubugF{%9=cxRTFukbse0CxTsxz=}$= zG84oFkdx*GI)Qo9?!WI3E$w@+G3`55r!sPNlx9nd?ULYb3u_o%O!wAdV%%(zJ{Oka z%_6M=$ib`D&^cF)%$<5`nP-SKE>;e@q~{%v$xK~+&JyYwf9ycr7sm`7d45V zrk1HeI%Gh?Xq(dNtO)ip9BEpUkV5BNXN z)j)SA$pzYY*=q)Ft`yYY#WT4qgmwF48t2qvZ?+9lStg&Pa4Qfjbb;)udy1}}74tkl z)%J92ZEP8{pFSDUNRrz)lpSULNz@$7M?ss3`_KB zzlc;NMpk$w9+M#PnNZvlVeW-VsWqYD{(haPYJu?#{{Y4GDo2obBvwdZIJNXkLlkWB zRww|N87d6b6P8{YNgCF%wa>b%I?%d;JjYh>!Tdx>I35G@JqCTL)cH*6Qs?@kT{6uP zmnn^*X%?o6prz$6O*D$rC?k&*^bfD}_q&ToWl+#Y2=fPxeL7KRxHJWl@s6(|NTK}4 zL_4(pKKE~8NsgzQjZAxcDIHw-$Y?7+y;O0S7*$f^rYo@!CMg$CW35OkS*-lR%cHS!NKES z^Llk3Ol{DYd37<(NBR0BUo1bD7gq1gKlhJsZHlTL+X^(4_4_Ms8MC40;ik*cZPPBl@Jp(<3+TUKLWOE4At=3J=^2>h8)pyC@{<7Pq+n0DYFua$eBLQk+WZr`ukIF>;>w z9BT4g8gZu+PK7KcPO@L}TD5vfV-{}|ZW3izXvVn59C> zo5b-W-U&o;nq&Yq76ZuUgy#dJtvWOzKc!CUjwj{v>snpWvM^b?*)q~lqf}N^w9(T? zN(A6ErA&Y={?20}+!ePLCdb}Rc#;GjE3skeoOym-B9g+|c`5}D*+ceze!O}%e;)o? z{MY!BDeHO@mg#Q3Kby+r5p^!?^u*maM{>NJxd@KI|g&b|Y$6JorpFKMF z7uJ>4Q&M9od+({KGFcwFma(V(OxP@xU7<`BG>t{4@p>tJO}xD z4|@k0h~5-wPrLA2V|r7~ATv{MU9q?Kd=q_nnhnW~%0(~N@~7I{a`DxXnNJSVNB9p^ z3^jn+8T`7W51bzf{uF2FYBHIBi60%)El?e&%wYP@1++4fyI$`lZp({rRI%01EI>bx zV?Cn&`4ka%D<=vPPxxz2oK+>G6vlsVkpBQTTJUz4!EcS*J8)z7A6V_(eNpm1X>QDBN2Pz5cg)_M$>XQ2Y+0o2T&Cy2(@&5}$SNMA0a=;FV)9EO zWF{of46Uv80vHAbrdtG&r8_ORiqs{Q0t{%b*}iYpR=eo_Tt&u z+?Ly~#$&TMsIeJJG_R7144n*h&_y@cWFd}UBLO4ET;P|Re(1Y?-8H9RtNlWftgI@u z0Mt{3at=qAQx7PMEyHR%uICNe2BCZg3PUN$EW(EwAPS0u(aYU?e|+uwN%IR|(Rqe= zQhd(YtHoFB#ac;R>aE3Qsp@7vc!(i|L=O-k9ZAXd0^BzHs8yvwv^>OBqEOKSJwpSW z`icXdg*I2aeaSJ%cSJ$($*E;E95pE%Dd=lXf&T#RM&QrRxq9uTjH|=3X<@IV-58zM zOB76b80?{pR#IGWW0H1{kEr$xUB7agQ7oHgt5cfz(afqmw7G0`eoqN^#Z*wI{SNWUyr-CpLFf2V7N-hh8@YbrGh;*xa4A9N+vC)JdHY? zQCYORadHo__b%?YysdPXR-;X`5vd5l9-_FY&OzuSz3o=K&u1l-!&c-1QO6L}^YsVM z_VvU0=JamW{$tyL#Vd!SXMzR8uSEsP~sith>K4iKU@aBaH6h*idIM zk;E+KOr3`$1Cv`W^<%x-CC!xD!5Q)(`HFdUj(fJ#d$V1=rSw`P2OflagXTJ>-}py& z%%|R84g0I&o>b%O_gBSk&>Qz*jnWKuXLuz_Kq%P5#}gopd~`dG*+#nAn@hF zs?;Q4a&C>s=ij>bOgq0PhsR_wnG8PPrSmU`Bm7>gA3Rvvh~$X0F+~^wb z$}Mwyd#`lyjqN%~LZ)9GEjc31QAEP31AaM$^iHd9>960q_f4C=zi$XJxojp5ma)mpXvN73ODe;@1Z^2!Uu7+Al_+v_Z zjy|%Ec-lGPs>fFiGr=-8myDSel#p-v_g?E#kLUIAGx;`b-J^|@5%BY?DE?#iq>H$= z?pvzgHPgdrU`}$1yE)kXk+U`hb_Zzh3HLnssd2PW<*~ELUey(qDLC**WQP6W_aQka zXgg-!{{ZqOyomU8If64#XCpbmSb@VeTOkNNDgN#M0J%-i-hfcD=&7RX)f5ML#}%eSAI7c6Y~o_fvJA6E!_BXSy>nG=qIlcQ&+lA5t5#rOwvVO#QSmk#&OSF z!3!9pkTs&Vd`SU1r)uPcU_2w5$O~galb>JSx%bolr)@9yQ}%~)hCBPqHj9`ggSY7{ zq>ThSR3#3TYp6?oYEeXXjT{3|xRqnqW97f{YW`;52jQ;D{D}C0+S`9;MqplI$A0S#PZkWH|JQ_Zr!)HY2KLmQF4>fOi^Cw3~~j_p1yZFt!#R-WayFAkP%4}7Xix7UE{nxtx)Y(({&i?=|7=CMXdF)=Z!9zdEewoJ4TeAECqO0sJ zmb1NX;_E7@7C{`fuCmLJ!L*UcQzsdvR)Rc*M9U3($L-MPJ(Ks2+WIroh>ITWD*%cI$)>Od+c`6nkc^+D+Y9gl&Pljq?K8kjMz_PJlAYeh~ zlkUCK{!_6w-5gCzMGNJ@LlK6WC5nK?K~{~XokVRJQ)?nPBj39BNZp$r%*j{O!;r_v zOJ2_{O%)wgWRv55)jx5PnPu^*l9hi_$Q#qj@CaXZ?w7Uu?`z?c?Wmn=UNFIFu`x!_ zM#9!soEYgN)qleiZ^yrN?t^SqZqUnaDP_#!R~-#}inMVG*$z0>$mah5c@nHE9MvR? zX+9laQFgz-b?$@jm>)R)CVww}lFavq$zIUg9c8ewCZdlIkByYlOq@$e(0XnH5&S61M*M_u6+G8I(Vx{;IIo3C@n0#Qx8`%`t)M7dqUe#+1^;;nrv? zF*-?r|$j+RmGwl)S#4!ic{k_TztP%`=`|1r1wB1$(J$BCNJ1qSQ+Z_n z0L67>I}6~aX>Xmr^?hx;=ySQcZ{ajqEFR!W++}rkUn7gB%2ms*lC7!nnA&)1k}6qe zLTgBZuHq3du&(M<?L09uwnl5`jQ;?u*Q?7bwMwv6 zKhOPNE|@yor#?)4l-%(3x5xgw+J8sH3mBw9b>FRGn&m+X{N>DVv+5x zp~5uQ2&}{@Qw6uw$X6u!`E-uv@+d};-68q#{{UC)>e?6iCT2RfZ_SDA-oo58o04G- zZsW}3Dyeq1-mjvgp_-$3Rt)ZH3jM(z-M~nX64o^=Z(1Rlqd^E(_F^`OkwlWnNT&{q zKY7U+2#gC8^Zr!FRVBWs*$KYuf6;a(81^O?JtYp=%4H~KsGxndh-RXp+<2Nw$>eRt zTbrzoNzFw{M;+K{Mo>qxi=S+}IA+#Z2pvAzfH2&j=!O~Mr5~`$?p(6l# z{{WD5X%jm>fa^{sgZ)|P@NOKxQ*_qA$?l!Zo1t+uSlMz}$%Z{~qaf6dKZf8i$thW7 zsmNvLRDm8uX)2^wAS&>eNtuKwg`D}EDD@=z0a9t`dR|&PWH%0=LZ=Ec#GDEb;$lDm z;-{fssQxPN4&DCiZ!eIzIP!Vz!(E7~*dHFK{Ixp|t`1eHX|~NS;m1zR4*vk{8Kasn zzR2YkdTL6E40N!?{s1??vu#efw5V8qwlWWZ@F`~f^OroxK(={rZqzS@ikWF@-zjdnow3J ztZ+sQVregDZT|o%Kb|yDc(MH>gT%zKs8y}(?z^E@0W6Vdqs-Pws-ZyrI!EAf?VY>s z-S3*w#WGK^Zn$?xCAfG7E;=`Rb{2)wv4Xjbc9HIPX4GQ<|lTWGqIA z)l}(G??1h-^EX->q32JJf$)FSlgRU`s;(hGD_aoj; zf9AeX=6%sQI`aEfoMu^}Re@tj){qG_##=#VPzQ4oa!*Cu<-fv?>h5mq+uO&fG968` zHa-`xX?E1KnQ8Nwyp;L1&t$T-HA5M<_T^OrQ~k9}QLL>ulhQ_z0QOJMyn)Po#l2bH z>{oU$ZSmU#WRN&!ePosfG$MgW029P@EB)Vo@*drLWyl-G!_QlG`MC21&gRpr!{Esp z#o(lBg{PewrInb_P*%A;62Fk$VZHu2ZLP1c`|l&yJ)5$-iMJLOyJ}L?Wb$}KgB3?a z)iPI7ZcKb@=c$h(qMoJ%j!JoB)vS6?upcsQ8=$+yx{yW{n<@b{*TdrN zVUR~zGwlz!JiYH8{{XskAGNz~?Xq)5z#y4!jFHDL>N|x9_UuUj#(YSel#x!72(MI4 z@P~Qj{vUrd-S6;gsVnOb#V?ZE7qB<}FRUf1mRw%I?LNHPn9a{g*n55%CY5k?nfxc0 z9h#1jAde(ObGinMSb6OqG~VtOT*t88%_Q+{lSHvd6P7qtZx| zrI3{}gf;tr)sCVMDa(E!NqEcRV#@>Mjno0kQR$4UO> zMkfzU9w4wtoMEZ(>tzb>hP2w9_e;g-NaRSf5ey=`KpTXAJXIPa{m>Y`Rr~hJK>VfTHj^fG9K4 zucx>j?`Q*>)Z_hB^y=3-Lwn@+g(OclHzQ3AERoTgYS>i|l~+NPnlkFskU1KdAg~+{ zZVfIM!^+o>NgY}`mp)&!_HpRxV(_y^3h1MABgb&1Z>31o%pHLxq<^XYg2URA3+9M= zpqLP=tIEIX{{UAWpRt(yoMj4A$xKkUsy`%Q$2Y#48v;-I{{WwMSY!r)NN%X^m2WgW zeq9Mvd%mL$PXtoUEP7-Cnc))1?5Y$EY^-##QTeyELsdfOq%N^)EyLzdON8#+^mFK? zr@d??gcC_a6w*qeH2us=JCCJ}mA<~;6VL!vtJ59{B$!MxG>;PTFIS z`m@y^*Y;0#@1E6gOW(qEh z53uFU&Buu#t{C6}kGK6?IugefqC|?Z(ZR_ghllw+M^t_CPCxi?kLIbdemQKKip;N7 zY#q;r=xBoc&}%Z#ZxyG*(m=Qk zzmA535sARl#3`PK1&gGo#$hnan;V;=akJ+JONgLi#(^&5<=%TUor!PHskRB1a+z()l#BoZoKOq}`#mYq+v?q~h{J8#JZ?UTVv&_hqMjQSoq#^J zjYpA>mN4zs`htYbPO5(1jDFnd=(9m*%hL&Ba5Tj6 z4oB)5%kV5e!`z9sZ4uwBhDh7P2Lhaabo1z^b>=I3GGc+%pU>0&FQt6n7d8e>gH-Lj zb1j9>+aQqGU;NfvE6KEkg_ol|z1De9FLmBF9MxWTbZ$(L+m#ftZhgs=+}P}H z)W_B`8E2rPkQ&;WnyB0bF~RvZEIyvmrsC|{bkk6%01|#*XG)@Z7^=F4Un^)*tmIR3{z&0wB=HIhmS za0Bw={vMT0W{M=##c^6FKkCm$58^NLGx@!@9IbL!{k{F`X_7F7Uk_2_e81J6l*G#vpt19*&+I>ER1w^}Gd+#S z)6q$V&q-4wP6af0n)%&XbdphFfyoRHHufV7G_$0O;d)n(%jZsnHj+k3%~*WJ2mD`8 zKOV3Zw0oWzG8mkt0<5uy85~`87v*^$bp&d3k}YqivZ)>YYm>*!d4I9eiOS1lO-s%h_)9wQZ7D$i97@BQ_D9LDh&a0 zK?CK$kGG_Rj}kNI!|liTcyw6*0O2iLBL&?b7dzh@z3Q{sJXcS5t{N;x8x6RzSSQ2N z_AbX?Jq8(l-f%GS24L(46MOV z%u$910xEcpr=M*(mh#VMpKG*u{;4K+O=ul-uuV(o2|3RYNEipLrK)K5cH6^AwJG<` z>Us*5nhJN_nT%#uN=I)C0#naoie2&z3zOsef4{M^oWtFHp(#cG^gZnN3Tlvotnd# ztd`qyx78wprbQq+8eor6>bVE4EkBj7U`70-zu`w2-;Xub5K(k*ZFctX_?MZb$PXnY zUsrdIYZtgaJLTG}p$dz9ZA|1sn!Tf>c?edc%f%Rl*pKW?-bzUTxv?w{ z_@wNW@2)5D~!j%UsW85Rb4|BY>SH&F zv3BM~1wKYOF@={)M_UrjMn?lr+(fSypZGeU_wK#YYkJabib`sF$~tO!YwKjaH9jt^ zK}lB{G8%`h6#C;zbzey_g_M@EpUC%K>E99AI3o-+b<`7LBaSqI1W}5*1&vf7QQ=W6 zafKGKj^6#(x-0(xH~vv{55zBz+oQhs!eg?PG^hAB!`gUkjCkCyVek67S?9s+8dC_6 zQ^P-nsxlQV1g3`_4Abb5kz6H*J*?#7&?KYAzP;0}HtPjtS+3n`12XCn!4YNg?jAU`AZB&b$KdzI zF5>=hpEfr~W_NB^CtKI_IjTMD@&kHOc_^Z#!?aVuv^uwDN3D||E@~V^c)A#pLHsWb zO+835NlzS8;lC#G?)C2%JKk>F?9A3eK`q>a04_vuNBla1gg_7J#-*}U2KrI^%KORf zm-lXc*Ew_B?`k&KA?9|pYaN2gsO<9st$Dg$ngcI{(>2w@vi|^$UdtRLB24l{zb4n) z8+&B!ox8JkmLDItcBaz7Vm8Lv+xVJj=yv6;VJ{P&|Tw03JYf@`b+do4+$}d&e?!2IDp6{kUCA zb8~Sk7nXa8%OFk=fmjS(uZ@s$TwmpUsm8{HVSbW;dSLuf^4Tqwde+J$LbY zYF92kurBF_nuq(@+PQ2^e05RR?Jk|e=3uX$H>Rnktjtwnv9$syat%CB^i|i#l6=Nj zaPEn-`P_wGUpJi3$(YRLaudl_Uz5t@@+P+-kgchdw6zs=wR60ZI}*<9N#y(YUhDtW z-{ar9_gZ8B06#C~!TyN%wEqA$x?>3q4_fvXW`>u!cK#ZXX`ajP+{CG(loAeQAZ9O`|<79?wi)NmS&N()%Aa!cH8>!`#5qwV2QQALxy zmX-XK{{WaS)%kbS^7VId%yN*ezF zv#s*SM?O_(U9qN+mI)m0S_17Hgb3tYqJ}z%TM;$&%r2IA?z`J~rb3V^-=9{ye_wv<-7#-Wj>xFTe-24vdfGzok8CwEOZHV7blKi79XH#^IFU77 zm+9&XefzII);Fdc!K7tjJs4^QQs+7pj9YjtpuEY?->+jurq(;)&xGem0)jnRXrZ^{f znt>xqDyUOi8g{L4(z7(sfY*yk6L1N!1KoR}C8_p))um|Vj~9=ML}ZXo5?Y#+kPzzP zPc>aoa7ZK7d)wc-_dzx{2emWXf_gl5QnMXG)|QTjYE_O}gLgF)^fePZ1co31M0E1$ zCf5sb?!DDK{{S{`=ZEn#`BKrx)Vo6fK1clF-L#aHoq6%!XH^`&PYspN2&3CMj^4~r zt$l9K#$;xzh3IiKu+5*%c_La`Xz8VD_&wLUp`NAwTK)0!E43*?D2Jpd9_*6MEKer2D^39LA3m%tRGcjZrWG3UAaBb`nx!f$WI<$Z<&Z9q< z`Fa=amckH>tErC+)OAq*05Nxda|M=6HBRusP~zrSlOD}gm8Zz!vLZJ?%S@D230Rb* z0@0uMSE|5~v!KoS z@!gcI2cc7s%yiD!OguQ2+}JF3cQdi^HIz-db_Gz6BiTJ;Jd-R^(&iqTjSk`3Vy=`& zj?DxT5`0y$!$0d=Bf?OI28Yw4sNkI?S1XajjXy4rPRIEvy7pdPzx%Bg^4s;;`7zjf zOual`Y?YJ=Ngh)cmDxG`FilF3RVyu)XrS_tmS!W{7W;+X-6?x3$BB=p6Y})_T^rA1 zx9;}po2K5AqMT~rK4Z`Mj)pqlkl!(TzM`vY_4d{7p55HFam7VUHg01*M~bMFz_He2 z>*=Urf*Oo$5W2-Qjw7ZXK!0$PVGKOS%$F5axX-SYAGFX4{LOj}+;Zn7*_}EF~+~=^ZA~NW${~6J!*JU)2&gzpKtRN-@Au;<^D5l928w~vZ*r*F6zkR zMveEqX{k~fCdY1?x2F|!J1`?FnAT6VsWQa2Azc|R8P*>Od$YN>Jw7)bm)kpU`^-O!VQV*r?4a4Ze;^7|8hSmvW24Ab)m9HE zjv-G-wCSaSk*9>aUeCF1>R!nsrf|*_pDxkF{hoa<-Y=~7H3t1P$hh;Y6{rauvwfls{M?)5-lBSz>%bUgF@({D@QAs^Ka*CH$ z2E+sH@9J*(JD(Fys?*F7{J)py(nxvBVTA#Lyf~5%ro_<7!a8Prr;vvJUD zoV7mB-`#h=bDep#cVgyuPH%2(jl)f!+|5sh%4w>eEPVt%X(wgyluawCn@J$%E>pX0 zpM2V5+@Xs4_QvAgB3Sl3(KKqu>|!`j(xe`Q+_}z{r+nBqMBC+-+Q$A1mjF~cK_bY? z8-_rqojp3)Pvf;F$Lw9T)t@7Jeto;xyK*YMy}xk?DxO?UT6#K&GZb)SjxupwO%yee zh$|o^CZ?VjiPczJ-vz8Jx2{U&i%9n^qMX;u_v+UcS0UF_mhx3gX(8I$QlN=b4u-14 z8ui-!^W7^BaoBeYICsWgUEi!4IBuXQ%&^==p@Qnvf^srPrpp%uhVz?hax2xU9?woZ7 z3lA>r+*@vkFxZTAnTLFp7Cw;VT8nn*Gh>3#*=Ryprjp@h-1zw8oRVLJSeSL28N(O4WhYRs?lT zzbXF!nD1fdF?)M;e248yt?6C2D(h(a{{RzJio{Y?ROhqbX#|*EuYlUvx-6FG&1WU0 zf;6C}hNhxoiUyShgmtv@$GSf3ZuT2OO+N9tqY{b{5;z0UG_o{kiyB~RX$>#{H6R?u zUu{0^-*w(p-}%Dg+Q*c+W@J%v=4qw4yYRI%a9hVTvdc8XQ<%~vEK3$DKqOTb)1OwyRjtMdk1^T23IosnR?T4K7XY9BP)-iK~elg zV3Qk5D$%+~p~LhC+Wt(mM_LmcW3^A>%h7dd960;h zedDga@;>6)Z+m9fCfn`q&1v*IJ)4E`BD4-&r@0DB{Z-TctiTrV#)x&lg{^{Zh5X0< z7WeLcyKsDk+PVIh>@3A~OtRO8kqk8kaS)5_sCtbUy9nb zJAWaLlAAYMB`tPBiRq<$U1}&~j#$*TnCHHpc(=6oQW$hnI#-G5=p#wN(r`1M~vihXPjl${xZP9<9@QZ7BG7Ygfz2Apxn?eqNnx_RwoL9V#y zTK@n`(q*QKn`=_uF(7*8o}QhWkdhhYf}l0s5mXB)JpDbXGoewaXZF+c=_!qxpdLTZ z{wtwQE#psHjG@ZaQ&Lja$reSbD zXg*$@R-eeO%KkA|U9+Lg*3Cn>pnPsxdU~=Z##J%CD>ICiHy$edEpD0OYx;m>BF*lS z&Wy}mwE}-&^y&12NF)NJ41E57=jye0r+#m5h}~t|J*%3IlDB+qoxNSQaTRhkJwjJ@ z7I`Xm_Qc$D@jUdB)zDDa)EtFO2;O>0X-gn#X`VD|!AF@#hA0mo^?uHsGDuVnXT$QZ zubNQj5~`6X{yue0Mt?6IK0>oMx)zgn_U7b@D#r3u zEf(L46^;9msIkk`At34p6~6Ur&0N8?>>QWMyG6~>X@07I2@4L&qzFj$a`F-Chcv$F^v5`r|DpL_chsa&6-4lGAT|Xhx{E! zw-@g2)ji!#Y)eD|3g+CKfqR4Wu>fcc7T}K4a{{XAgqUpSQXJ%6h zh#;Ywwqg5m%?&zzn>CLzO7?FT7B(N#+mZWlH$?{a-U#7tI)E%kr76=*y0lu6Skw7e z?dYfOJ@C~=rD*Z^xIARalEDw$JS)joD=77lPa@X`*sEyvx0SZ?8aowg=Y}eCk3o); zNxI&;g=eCA`SnvDE50{vUfRgjZ|ZuCe0_-ZW@@VXx=7lWGfhnhr>3B+fQCU83{K@Z zwxTcj_djx%`=+;o$`Dq?K+>S_^C#Cm6kT0B#i*I56Q57ds<+)=8v9SJup6&$b>w)Q zPHS=P@j%k0l$kH{3?lG$kiQM={iDa1<05lcBuZw+SL?$tb3}e2pkY zN88a{S5reOoj`zVPcO2be=km}$K*Fo_XJ&0)l`-EdYpwG%Bjj@w_YwMlt*8auE?mT z+{j~7PdSd7kW--0Oenzr0BoOTDQyGGaPUgCY^`W9{5kU-2)6CsFBig*LsZn)9DNV@ zIt1bCeceZ#-1~C7Zq`9nLt87sL0d&6%l6f@w9N5SJa&ie1QJG3c~+5F@K3a|K{<5s z8oyz{r=2~2K8E(&p4hQVIFVWwr~r{u`FeSJ*PwQ&=XMrjFHexbI8gT24X2GDs z<}rJp9=o#*ERsW!S#Znz6&jjyvPD^wnn?VZdC)$Y8B_;RZ^%B^5VI=^1Bz0$2lDkD z2Ja$NoGLDW!l%l=<~<#rpZ;JwqhaO_A0fMP`;Q5Xbf;>$YGSAnBxC?zL7=_}p<3G7 zm6lmbUhN!Y{{V>g9KPlF+!Jpas}qsrYyJX%XGxJEmr{x>o~Msixv)Q&P6u}5AcGZI zxgyC`M9CZ#`I+U$qTD2s>7a&s`{^RcvW|Zq!Z(|7wJZgyhx0$?>g%>lC}fm)W7E&% zf7s}6+xx<8?UAF(EqT)kbJ)0 zkV;7@q-jxJIj=xp^A78HyEo$>d~7!wzrEc#*!Vb=RI?hn_MT2$a0;HUD9FPWk~vqg zA5UT)T#*vt5AiVjFmXfDSIdTBLDse3@RD8Sp0D{e^26ii-mj>o$#$>xT@WoD&#L>Lc$``_p5&N^UZo9tSv_8_{O&shPQJ9ou zEO0OYC<`&*2iw$-?cV2Qx8H6e{DA{R8l{z1s&tB$^Y5S@XRYUO*gfq>h?1*y<3yP1 zYK**jDjeMmRP`}Mj-G0Is-lK78^l%vBC)aXl_X!>5o@;d1+o_1ZBlD6?NLRo2igAs z7fw0qW4fPixRN!nm6Bqsq=INk6%_oxBjt{nJ3lkGy3?(zH`WJcN1dj}QXI0=Vll<) zq>833QAI&d8pO&gmP>-Gr<;+_vBt->?NG(yTHB%!2~bv)u5pZhT@YVgU(0eKxs}DhnG$8BxwNzA^&>|Lz{*_iN|3SG&yvUt3OBh<*yqr*{CMwoOE&Z0n* zy2m^`E8Umco9(XUQKg71wH2a}Puor=o@0+jJ8i|J&LN&p39CNnJyzD)Zxi=;PhaFp+!eXTUD^C&2Bee*gs~=feSBoM=DNu|b?PcH}p!Nvd z7V2-U-?@dHa2XRb9DyR+&i)H0Vzf!vM8yJ-|ZX?JhY{69^CAFHd29g z3lUF!D|-oNsK24dJ+`*q-OJEHU6ik>p`Ds~nh2?qTF9xBh`hBCG;83RQKZ>CjG?ss z2_Ea+3UIE=-8AV8QQ~XXGzgHaalutih@#4ofelm(7#v!_Ti?3(LH6v~7+f7AWMRtG z(nivxaZpPdR!KX%-Jzp$(Mla-xgJ95w)Go(_g?8)g0I+BxY}$bH`xeLO05o36o#fr z9FHWdY86&$ncUp6F(jTpp!Z(s9od+!x9iQDx_cXT?uvbZv$k#%Be^$5ex|J1Ug7x3-&YozCHZaIslJh27f$RYgfZm*#j3^nJ?w zugpB_%v&cY@|Mvx{{S;?S25e#+r%|VG}5q0(MJri6(ogGR$>$qG(P!3-hJ8p-F|27 z4!Y_r9!_nuHg0`|&|40yPaQ7W+H%!>&U3K$xyQp^nEKq6B^zcp4QNS)1r0jDtt@nr zmcagS=3VpNK6SLP+F*a9)?&1T){(|dT4`tv8G!L7Y8@&9ii8#V$NRW@CGB7LZT;AJ zi<>>b-EIE>tcKZl4q@C-F1x$MO)zcNB0`1Yg`8RK&=x~H(lpE?lIB3Wzx*Wleb*ld zK0oa)kL%cDtDb^C;~VdI%Sla5m*4yIBNRtHx$><9Nai+p)|VdyjVn=ODXHnal6Z`b zncS7iJ9i}P7MmvC0c9Gcl7KX_pNZO^?J&|LB-3b3dK72w&gScHj@?Jt-RayrqJw4ie^hM@ z-ud4fpCsf{;;DBC@_qH&Yj)uQ6Fr z>82kHar>`zT$tbZxX^#pZ7=Z}r9 z*xGJ(S6g-b3oVrKvN|3NtSCk^ka&U!;s`wmIa8XshmrZ4VdoxG-DR=nZLaPst6PZa zt{LHQ@wf~Moh$`a)scl&)s&Ead;b6_{y+Dh@`Cxhg~@D8)?iX?%(&lu5!qGrC-{E) z*;6x8*Wk0_nJIDE8tO_q$#C0}fmxBz)ob@ckgGp;@;zJoyUa!Ev&?1 zSk4MPC>YR~=1f!?&?~QBT>i@Yo$W98kbTxSjh~%1n`b+Px6p69YCq~&-mM-xi*m)} ziA$nh?Y9R}MnHw$Yk7d(E8!<}^*_zdhuWR-vNCeRPnVDQR`l4hPZL-5{{6?&(!S-{ z*-EWHaXeI0)U4D~nBX;-%8Gi8E9J1w?oQ_Ivz@jpP4{f=4m8OfYGRZDt~2rk)ky4X%mk+#;-Q%7<>>lg$2en-9`p<60TPwhYBiuIm9mTEU3XmE_Qj^B4!W)#D9Y@2d zGkfc9)|v5?_`159+Ib?5iW~#i>yjS?O`@Wj8i~};0fr;wE?A*k-p0UD)DP5bUsq&i z()nuGC?dBs^gvY9@I{o&>a_6!FZ2)Z-Fu}zZ)e3pwx*-PWh(Ka7kbIXPDWVi@@f5L{huWN7Im%R~4eZ1;2nSJr{4}XbwU4GxM-48sO_3IqA?=w|n_dZf;xz{1ODp|J$ zY?DaPNl6>BFlv3?`r=21(lZ)*;Mn66 z;^U8J1VpHG91k(WqMcR2sehjj+5W2Z9q(?7o=Bz1(A7}sosN}`DXN-Rb_Vg6Bu*F~ z!d~28*lPOOW;*nY)YOmX(1Ob0l|mYW`!VVA>bw3#{3*}xEG|bOMX~XlmoA=4%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 } ///