Touch Interface Designer 2025.2
Create touch interface with a visual editor and manage all mobile inputs like gestures
Loading...
Searching...
No Matches
GestureRecognizerComp.h
Go to the documentation of this file.
1// Copyright 2022 Lost in Game Studio. All Rights Reserved.
2
3#pragma once
4
5//#include "CoreMinimal.h"
8#include "Components/ActorComponent.h"
9#include "Layout/Geometry.h"
10#include "Input/Events.h"
11//#include "Gestures/GestureBase.h"
12#include "GestureRecognizerComp.generated.h"
13
14//class UGestureBase;
15
16class UGestureBase;
17
18enum class ETouchMode : uint8
19{
23
27
31};
32
34UENUM()
49
50UENUM(BlueprintType)
63
64UENUM(BlueprintType)
65enum class ESlideDirection : uint8
66{
69};
70
71USTRUCT(BlueprintType)
73{
74 GENERATED_BODY()
75
76 UPROPERTY(Category="Swipe Data", BlueprintReadOnly)
78
79 UPROPERTY(Category="Swipe Data", BlueprintReadOnly)
80 FVector2D BeginPosition;
81
82 UPROPERTY(Category="Swipe Data", BlueprintReadOnly)
83 FVector2D EndPosition;
84
85 UPROPERTY(Category="Swipe Data", BlueprintReadOnly)
86 FVector2D CustomDirection;
87
88 UPROPERTY(Category="Swipe Data", BlueprintReadOnly)
89 FVector2D Offset;
90
91 UPROPERTY(Category="Swipe Data", BlueprintReadOnly)
92 float Velocity;
93
94 UPROPERTY(Category="Swipe Data", BlueprintReadOnly)
95 float Duration;
96
99 BeginPosition(ForceInitToZero),
100 EndPosition(ForceInitToZero),
101 CustomDirection(ForceInitToZero),
102 Offset(ForceInitToZero),
103 Velocity(0.0f),
104 Duration(0.0f)
105 {
106
107 }
108};
109
111{
113
122
123 FVector2D BeginPosition;
125 FVector2D LastPosition;
128
129 bool AcceptPointerIndex(const uint32 InPointerIndex) const
130 {
131 return PointerIndex == InPointerIndex;
132 }
133
135 : PointerIndex(-1)
136 , LastTapTime(0.0f)
137 , TapAmount(0)
138 , PressDuration(0.0f)
139 , TouchStartTime(0.0f)
140 , TouchEndTime(0.0f)
141 , StartTapTime(0.0f)
142 , AccumulatedTime(0.0f)
143 , BeginPosition(ForceInitToZero)
144 , LastPosition(ForceInitToZero)
145 , OffsetFromBegin(ForceInitToZero)
146 , bActive(false)
147 , bDetected(false)
148 , bFirstTouchDetected(false)
149 , bDoubleTapDetected(false)
150 , bLongPressDetected(false)
151 , bDragDetected(false)
152 , bFirstTapSend(false)
153 , bSlideDetected(false)
154 , bSlideVertically(false)
155 , bBlockDrag(false)
156 {
157 FMemory::Memzero(this, sizeof(*this));
158 }
159
160private:
162
164 uint8 bActive:1;
165
166 uint8 bDetected:1;
167 uint8 bFirstTouchDetected:1;
168 uint8 bDoubleTapDetected:1;
169 uint8 bLongPressDetected:1;
170 uint8 bDragDetected:1;
171 uint8 bFirstTapSend:1;
172 uint8 bSlideDetected:1;
173 uint8 bSlideVertically:1;
174 uint8 bBlockDrag:1;
175
176 FTimerHandle TapHandle;
177
179 void Reset()
180 {
181 PointerIndex = -1;
182 TapAmount = 0;
183 LastTapTime = 0.0f;
184 PressDuration = 0.0f;
185 TouchStartTime = 0.0f;
186 AccumulatedTime = 0.0f;
187 BeginPosition = FVector2D::ZeroVector;
188 LastPosition = FVector2D::ZeroVector;
189 OffsetFromBegin = FVector2D::ZeroVector;
190 LastTapPosition = FVector2D::ZeroVector;
191 bDetected = false;
192 bFirstTouchDetected = false;
193 bDoubleTapDetected = false;
194 bLongPressDetected = false;
195 bDragDetected = false;
196 bActive = false;
197 }
198
199 void ResetTapData()
200 {
201 TapAmount = 0;
202 LastTapTime = 0.0f;
203 AccumulatedTime = 0.0f;
204 LastTapPosition = FVector2D::ZeroVector;
205 bDoubleTapDetected = false;
206 }
207};
208
209USTRUCT(BlueprintType)
210struct FTouch
211{
212 GENERATED_BODY()
213
214 UPROPERTY(Category="Touch", BlueprintReadOnly)
216
217 UPROPERTY(Category="Touch", BlueprintReadOnly)
218 double StartTime;
219
220 UPROPERTY(Category="Touch", BlueprintReadOnly)
222
223 UPROPERTY(Category="Touch", BlueprintReadOnly)
224 FVector2D BeginLocation;
225
226 UPROPERTY(Category="Touch", BlueprintReadOnly)
227 FVector2D Location;
228
229 UPROPERTY(Category="Touch", BlueprintReadOnly)
231
232 UPROPERTY(Category="Touch", BlueprintReadOnly)
233 FVector2D Delta;
234
236 : FingerIndex(-1)
237 , StartTime(0.0f)
238 , PressDuration(0.0f)
239 , BeginLocation(ForceInitToZero)
240 , Location(ForceInitToZero)
241 , OffsetFromStart(ForceInitToZero)
242 , Delta(ForceInitToZero)
243 {
244
245 }
246
247 explicit FTouch(const FFingerData& FingersData)
248 : FingerIndex(FingersData.PointerIndex)
249 , StartTime(FingersData.TouchStartTime)
250 , PressDuration(FingersData.PressDuration)
251 , BeginLocation(FingersData.BeginPosition)
252 , Location(FingersData.CurrentPosition)
253 , OffsetFromStart(FingersData.OffsetFromBegin)
254 {
255 Delta.X = FingersData.LastPosition.X - FingersData.CurrentPosition.X;
256 //Invert Y
257 Delta.Y = (FingersData.LastPosition.Y - FingersData.CurrentPosition.Y) * -1.0f;
258 }
259};
260
261DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnSimpleGestureSignature, int32, FingerIndex, FVector2D, Location);
262DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnComplexGesture, float, Delta, float, CurrentOffset, FVector2D, Direction);
263DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnSwipeGestureSignature, int32, FingerIndex, FSwipeData, SwipeData);
264
265DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnMultiTouchSignature, FTouch, Touch, FVector2D, AveragePosition);
266DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnMultiTapSignature, int32, FingerIndex, int32, TapAmount, FVector2D, Location);
268DECLARE_DYNAMIC_MULTICAST_DELEGATE_FourParams(FOnSlideSignature, int32, FingerIndex, ESlideDirection, Direction, FVector2D, Location, float, Delta);
269
274UCLASS(ClassGroup=(TouchInterfaceDesigner), meta=(BlueprintSpawnableComponent, DisplayName="Gesture Recognizer"))
275class TOUCHINTERFACE_API UGestureRecognizerComp : public UTouchInterfaceListener
276{
277 GENERATED_BODY()
278
279public:
280 UGestureRecognizerComp();
281
282protected:
283 virtual void BeginPlay() override;
284
285public:
286 virtual bool OnTouchStarted(const int32 FingerIndex, const FVector2D Location) override;
287 virtual void OnTouchMoved(const int32 FingerIndex, const FVector2D Location) override;
288 virtual void OnTouchEnded(const int32 FingerIndex, const FVector2D Location) override;
289
290 virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
291
292private:
293 virtual void TapGesture(FFingerData& FingerData, FVector2D Location);
294 virtual void SlideGesture(FFingerData& FingerData, FVector2D Location);
295 virtual void DragGesture(FFingerData& FingerData, FVector2D Location);
296 virtual void SwipeGesture(FFingerData& FingerData, FVector2D Location);
297 virtual void ZoomGesture(FFingerData& FirstFinger, FFingerData& SecondFinger);
298 virtual void RotateGesture(FFingerData& FirstFinger, FFingerData& SecondFinger);
299
300 virtual void TwoFingerSwipe(FFingerData& FirstFinger, FFingerData& SecondFinger);
301 virtual void TwoFingerTap(FFingerData& FirstFinger, FFingerData& SecondFinger);
302
303public:
304 virtual void HandleOnOrientationChanged() override;
305
307 UFUNCTION(Category="Gesture Manager", BlueprintCallable, BlueprintPure)
308 bool IsThereAnActiveFinger();
309
311 UFUNCTION(Category="Gesture Manager", BlueprintCallable, BlueprintPure)
312 int32 GetActiveFingerCount();
313
315 UFUNCTION(Category="Gesture Manager", BlueprintCallable, BlueprintPure)
316 TArray<FVector2D> GetFingerPositions();
317
319 UFUNCTION(Category="Gesture Manager", BlueprintCallable, BlueprintPure)
320 FVector2D GetFingerAveragePosition();
321
322 //TODO: Change mode, warning! reset all data
323
324private:
326 void ResetGesture();
327
328 TArray<int32> GetActiveFingerIndex();
329
330 bool GetLastTwoActiveFinger(int32& First, int32& Second);
331
332 bool GetLastFingerTouchingScreen(int32& FingerIndex);
333
334
337 UPROPERTY(Category="General", EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess="true"))
338 uint8 bEnableTwoFingerGesture:1;
339
341 UPROPERTY(Category="General", EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess="true"))
342 EMultiTouchBehavior MultiTouchBehavior;
343
344 UPROPERTY(Category="Gesture Config", EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess="true"))
345 uint8 bOverrideGestureConfig:1;
346
347 UPROPERTY(Category="Gesture Config", EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess="true", EditCondition="bOverrideGestureConfig", EditConditionHides))
348 FGesturesConfig GesturesConfig;
349
350 //Add any gestures you wish to recognize.
351 UPROPERTY(Category="General", EditAnywhere, BlueprintReadWrite, Instanced, meta=(AllowPrivateAccess="true"))
352 TArray<TObjectPtr<UGestureBase>> Gestures;
353
354public:
355 //EVENTS
356
357 UPROPERTY(Category="Gesture Manager|Gestures", BlueprintAssignable)
358 FOnSimpleGestureSignature OnTouchBegin;
359
360 UPROPERTY(Category="Gesture Manager|Gestures", BlueprintAssignable)
361 FOnSimpleGestureSignature OnTouchMove;
362
363 UPROPERTY(Category="Gesture Manager|Gestures", BlueprintAssignable)
364 FOnSimpleGestureSignature OnTouchEnd;
365
366 UPROPERTY(Category="Gesture Manager|Gestures", BlueprintAssignable)
367 FOnMultiTouchSignature OnMultiTouch;
368
371 UPROPERTY(Category="Gesture Manager|Gestures", BlueprintAssignable)
372 FOnSimpleGestureSignature OnTap;
373
375 UPROPERTY(Category="Gesture Manager|Gestures", BlueprintAssignable)
376 FOnSimpleGestureSignature OnTwoFingerTap;
377
379 UPROPERTY(Category="Gesture Manager|Gestures", BlueprintAssignable)
380 FOnSimpleGestureSignature OnDoubleTap;
381
383 UPROPERTY(Category="Gesture Manager|Gestures", BlueprintAssignable)
384 FOnMultiTapSignature OnMultiTap;
385
388 UPROPERTY(Category="Gesture Manager|Gestures", BlueprintAssignable)
389 FOnSimpleGestureSignature OnLongPress;
390
392 UPROPERTY(Category="Gesture Manager|Gestures", BlueprintAssignable)
393 FOnDragSignature OnDragBegin;
394
398 UPROPERTY(Category="Gesture Manager|Gestures", BlueprintAssignable)
399 FOnDragSignature OnDrag;
400
402 UPROPERTY(Category="Gesture Manager|Gestures", BlueprintAssignable)
403 FOnDragSignature OnDragEnd;
404
406 UPROPERTY(Category="Gesture Manager|Gestures", BlueprintAssignable)
407 FOnSlideSignature OnSlide;
408
410 UPROPERTY(Category="Gesture Manager|Gestures", BlueprintAssignable)
411 FOnSwipeGestureSignature OnSwipe;
412
414 UPROPERTY(Category="Gesture Manager|Gestures", BlueprintAssignable)
415 FOnSwipeGestureSignature OnTwoFingerSwipe;
416
418 UPROPERTY(Category="Gesture Manager|Gestures", BlueprintAssignable)
419 FOnComplexGesture OnZoom;
420
422 UPROPERTY(Category="Gesture Manager|Gestures", BlueprintAssignable)
423 FOnComplexGesture OnRotate;
424
425private:
427
428 TArray<FFingerData> GestureData;
429
430 //TArray<FGestureData> SavedGestureData;
431
432 ETouchMode CurrentTouchMode;
433
434 double CurrentTime;
435
436 FVector2D StartDirection;
437
438 int32 GestureFirstIndex;
439 int32 GestureSecondIndex;
440
441 uint8 bTwoFingerGestureDetected:1;
442
443 float StartOffsetBetweenFinger;
444 float LastZoomOffset;
445 float LastRotationOffset;
446
447 float TotalRotationAngle;
448};
BlueprintType
Definition ComponentDecorator_Animation.h:40
DisplayName
Definition DecoratorRotationAnim.h:15
DECLARE_DYNAMIC_MULTICAST_DELEGATE_FourParams(FOnSlideSignature, int32, FingerIndex, ESlideDirection, Direction, FVector2D, Location, float, Delta)
EMultiTouchBehavior
Definition GestureRecognizerComp.h:36
@ KeepFirstAndUpdateLast
Definition GestureRecognizerComp.h:44
@ DoNothing
Definition GestureRecognizerComp.h:38
@ KeepExistingIndex
Definition GestureRecognizerComp.h:41
@ UpdateBoth
Definition GestureRecognizerComp.h:47
meta
Definition GestureRecognizerComp.h:274
ESwipeDirection
Definition GestureRecognizerComp.h:52
@ Down
Definition GestureRecognizerComp.h:56
@ LeftUp
Definition GestureRecognizerComp.h:60
@ Up
Definition GestureRecognizerComp.h:54
@ RightUp
Definition GestureRecognizerComp.h:58
@ Custom
Definition GestureRecognizerComp.h:53
@ Right
Definition GestureRecognizerComp.h:55
@ Left
Definition GestureRecognizerComp.h:57
@ LeftDown
Definition GestureRecognizerComp.h:61
@ RightDown
Definition GestureRecognizerComp.h:59
DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnComplexGesture, float, Delta, float, CurrentOffset, FVector2D, Direction)
ESlideDirection
Definition GestureRecognizerComp.h:66
@ Vertical
Definition GestureRecognizerComp.h:68
@ Horizontal
Definition GestureRecognizerComp.h:67
ETouchMode
Definition GestureRecognizerComp.h:19
@ DoubleTouch
Definition GestureRecognizerComp.h:26
@ SingleTouch
Definition GestureRecognizerComp.h:22
@ MultiTouch
Definition GestureRecognizerComp.h:30
ClassGroup
Definition GestureRecognizerComp.h:274
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnDragSignature, FTouch, Touch)
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnSimpleGestureSignature, int32, FingerIndex, FVector2D, Location)
Config
Definition TouchInterfaceSettings.h:162
Definition GestureBase.h:134
Definition TouchInterfaceListener.h:16
Definition GestureRecognizerComp.h:111
FVector2D BeginPosition
Definition GestureRecognizerComp.h:123
float PressDuration
Definition GestureRecognizerComp.h:117
double TouchStartTime
Definition GestureRecognizerComp.h:118
double TouchEndTime
Definition GestureRecognizerComp.h:119
double LastTapTime
Definition GestureRecognizerComp.h:115
uint32 PointerIndex
Definition GestureRecognizerComp.h:112
double AccumulatedTime
Definition GestureRecognizerComp.h:121
FVector2D LastTapPosition
Definition GestureRecognizerComp.h:127
FFingerData()
Definition GestureRecognizerComp.h:134
bool AcceptPointerIndex(const uint32 InPointerIndex) const
Definition GestureRecognizerComp.h:129
FVector2D CurrentPosition
Definition GestureRecognizerComp.h:124
FVector2D LastPosition
Definition GestureRecognizerComp.h:125
double StartTapTime
Definition GestureRecognizerComp.h:120
int32 TapAmount
Definition GestureRecognizerComp.h:116
friend class UGestureRecognizerComp
Definition GestureRecognizerComp.h:161
FVector2D OffsetFromBegin
Definition GestureRecognizerComp.h:126
Definition TouchInterfaceSettings.h:29
Definition GestureRecognizerComp.h:73
BlueprintReadOnly FVector2D Offset
Definition GestureRecognizerComp.h:89
BlueprintReadOnly float Velocity
Definition GestureRecognizerComp.h:92
BlueprintReadOnly FVector2D BeginPosition
Definition GestureRecognizerComp.h:80
BlueprintReadOnly FVector2D EndPosition
Definition GestureRecognizerComp.h:83
Category
Definition GestureRecognizerComp.h:76
BlueprintReadOnly float Duration
Definition GestureRecognizerComp.h:95
FSwipeData()
Definition GestureRecognizerComp.h:97
BlueprintReadOnly ESwipeDirection Direction
Definition GestureRecognizerComp.h:77
BlueprintReadOnly FVector2D CustomDirection
Definition GestureRecognizerComp.h:86
Definition GestureRecognizerComp.h:211
FTouch()
Definition GestureRecognizerComp.h:235
BlueprintReadOnly FVector2D OffsetFromStart
Definition GestureRecognizerComp.h:230
BlueprintReadOnly double StartTime
Definition GestureRecognizerComp.h:218
BlueprintReadOnly FVector2D Delta
Definition GestureRecognizerComp.h:233
BlueprintReadOnly FVector2D BeginLocation
Definition GestureRecognizerComp.h:224
BlueprintReadOnly double PressDuration
Definition GestureRecognizerComp.h:221
Category
Definition GestureRecognizerComp.h:214
BlueprintReadOnly int32 FingerIndex
Definition GestureRecognizerComp.h:215
FTouch(const FFingerData &FingersData)
Definition GestureRecognizerComp.h:247
BlueprintReadOnly FVector2D Location
Definition GestureRecognizerComp.h:227