Touch Interface Designer 2025.2
Create touch interface with a visual editor and manage all mobile inputs like gestures
Loading...
Searching...
No Matches
SDeprecatedTouchInterface.h
Go to the documentation of this file.
1// Copyright 2022 Lost in Game Studio. All Rights Reserved.
2
3#pragma once
4
7#include "Widgets/SCompoundWidget.h"
8#include "Widgets/Layout/SConstraintCanvas.h"
9
10class SVirtualAnchor;
12//class UVirtualShape;
13class UShapeRecognizer;
14class SVirtualShapeDrawer;
15enum class EScalingMode;
16
17class UTouchInterfaceSettings;
18class SVirtualControl;
20class UWorld;
21class UGameInstance;
22class ULocalPlayer;
23class UEnhancedInputLocalPlayerSubsystem;
24
25DECLARE_DELEGATE_TwoParams(FOnTouchEvent, int32, FVector2D);
26DECLARE_DELEGATE_OneParam(FOnStateChangedEvent, bool);
27DECLARE_DELEGATE_OneParam(FOnAutoMoveSignature, FVector2D);
28
30{
31 FName Name;
32 SConstraintCanvas::FSlot* Slot;
33 TSharedPtr<SVirtualControl> VirtualControl;
34 uint8 bIsChild:1;
35
36 FVirtualControlWidget(const FName InName, SConstraintCanvas::FSlot* InSlot, TSharedPtr<SVirtualControl> VirtualControl, const bool IsChild) :
37 Name(InName),
38 Slot(InSlot),
40 bIsChild(IsChild)
41 {
42
43 }
44};
45
46class TOUCHINTERFACE_API SDeprecatedTouchInterface : public SCompoundWidget
47{
48 SLATE_BEGIN_ARGS(SDeprecatedTouchInterface)
49 : _LoadConfig(false)
50 , _UserIndex(0)
51 , _ConfigIndex(0)
52 {}
53
54 SLATE_ARGUMENT(bool, LoadConfig)
55 SLATE_ARGUMENT(int32, UserIndex)
56 SLATE_ARGUMENT(int32, ConfigIndex)
57
58 SLATE_EVENT(FOnTouchEvent, OnTouchBegan)
59 SLATE_EVENT(FOnTouchEvent, OnTouchMoved)
60 SLATE_EVENT(FOnTouchEvent, OnTouchEnded)
61 SLATE_EVENT(FOnStateChangedEvent, OnActiveStateChanged)
62 SLATE_EVENT(FOnStateChangedEvent, OnVisibilityStateChanged)
63 SLATE_END_ARGS()
64
65 SDeprecatedTouchInterface();
66
67 void Construct(const FArguments& InArgs, ULocalPlayer* InLocalPlayer, UVirtualControlSetup* InVirtualControlSetup);
68
69private:
70 void GenerateVirtualInputNextFrame(TArray<FVirtualControl>& InVirtualControls);
71
73 void GenerateVirtualControls(TArray<FVirtualControl> InVirtualControls);
74
75 TSharedRef<SVirtualControl> ConstructVirtualControlWidget(const FVirtualControl& InVirtualControl, SConstraintCanvas::FSlot* OwnerSlot, TSharedPtr<SVirtualControl>&);
76
78 void GenerateChildControls(const TArray<FName> ChildrenName, TSharedPtr<SVirtualControl> Parent, TArray<FVirtualControl>& InVirtualControls);
79
80 // Generate virtual anchor widgets and add associated virtual inputs
81 //void GenerateVirtualAnchors(const TArray<FVirtualAnchor>& InVirtualAnchors);
82
83 EActiveTimerReturnType ActivateTouchInterface(double InCurrentTime, float InDeltaTime);
84
85 EActiveTimerReturnType DrawVirtualControl(double InCurrentTime, float InDeltaTime);
86
87public:
88 //Begin SWidget implementation
89 virtual FReply OnMouseButtonDown(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override;
90 virtual FReply OnMouseMove(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override;
91 virtual FReply OnMouseButtonUp(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override;
92
93 virtual FReply OnTouchStarted(const FGeometry& MyGeometry, const FPointerEvent& Event) override;
94 virtual FReply OnTouchMoved(const FGeometry& MyGeometry, const FPointerEvent& Event) override;
95 virtual FReply OnTouchEnded(const FGeometry& MyGeometry, const FPointerEvent& Event) override;
96
97 virtual void Tick( const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime ) override;
98 virtual int32 OnPaint( const FPaintArgs& Args, const FGeometry& AllottedGeometry, const FSlateRect& MyCullingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId, const FWidgetStyle& InWidgetStyle, bool bParentEnabled ) const override;
99 virtual bool SupportsKeyboardFocus() const override { return false; }
100 virtual FVector2D ComputeDesiredSize(float) const override { return FVector2D(100, 100); }
101 //End SWidget implementation
102
105 virtual void RebuildTouchInterface(const bool bLoadConfig, const int32 InUserIndex, const int32 InConfigIndex);
106
107 // Called before destruction
108 virtual void PreDestruct();
109
111 static FName GenerateUniqueLayerName(const TArray<FVisualLayer>& VisualLayers);
112 static bool DoesThisNameExistInVisualLayer(const TArray<FVisualLayer> VisualLayers, const FName OtherName);
113
115 int32 GetControllerId() const { return ControllerIdAssociated; }
116
118 UWorld* GetWorldContext() const;
119
120
121 TArray<UTouchInterfaceListener*>& GetListeners() { return TouchInputComps; }
122
123 TSharedPtr<SVirtualControl> GetVirtualControlWidget(const FName ControlName);
124
125
126 //TODO: Make only getters and eventually setters. All logics are written in subsystem
127
128 // INPUT
129
130 bool RegisterTouchInputComponent(UTouchInterfaceListener* ManagerComp);
131 bool UnregisterTouchInputComponent(UTouchInterfaceListener* ManagerComp);
132
133 void UnregisterAllManagerComponents();
134
135 // Whether or not input is enabled
136 void BlockInput(const bool bBlock) { bBlockInput = bBlock; }
137
138 // Whether or not gesture is enabled
139 void BlockGesture(const bool bBlock) { bBlockRecognizers = bBlock; }
140
141 // Change InputAction on virtual control
142 bool ChangeInputAction(const FName ControlName, UInputAction* Action);
143
144 // Enable virtual input (user interaction)
145 void EnableVirtualInput(const FName InputName);
146
147 // Disable virtual input (no interaction)
148 void DisableVirtualInput(const FName InputName);
149
150
151 // VISIBILITY
152
153 // Shows or hides the touch interface widget
154 void SetWidgetVisibility(const bool bInVisible, const bool bInBlockInput, const bool bInBlockGesture);
155
156 // Show or hide virtual input by name
157 void SetVirtualInputVisibility(const FName Name, const bool bInVisible, const bool bIncludeChildren);
158
159 // Show all virtual input
160 void ShowAllVirtualInputs();
161
162 // Hide all virtual input
163 void HideAllVirtualInputs();
164
165 float GetVirtualInputOpacity(const FName ControlName);
166
167 void SetVirtualInputOpacity(const FName ControlName, const float NewOpacity);
168
169
170 //DATA
171
173 bool GetVirtualControlData(const FName ControlName, FVirtualControl& VirtualControl);
174
175 FVirtualControl& GetVirtualControl(const FName ControlName);
176
178 TArray<FVirtualControl> GetAllControls(const bool IncludeButton = true, const bool IncludeJoystick = false, const bool IncludeTouchRegion = false);
179
181 void AddControl(const FVirtualControl& NewControl);
182
184 void RemoveControl(const FName Name, const bool bRemoveChildren);
185
187 void ResetToDefault();
188
189
190 // VISUAL
191
193 void SetVirtualControlVisualLayers(const FName ControlName, TArray<FVisualLayer> Layers);
194
196 void GetVirtualControlLayer(const FName ControlName, const FName LayerName, FVisualLayer& OutLayer);
197
199 void SetVirtualControlLayer(const FName ControlName, const FVisualLayer& Layer);
200
202 FName AddNewLayer(const FName ControlName, FVisualLayer& Layer);
203
205 FName InsertNewLayer(const FName ControlName, FVisualLayer& Layer, const int32 Index);
206
208 void RemoveLayer(const FName ControlName, const FName LayerName);
209
210 void RemoveLayerAt(const FName ControlName, const int32 Index);
211
212 //Todo: Add function to allow dev to Add/Remove layer
213
216 UMaterialInstanceDynamic* GetLayerDynamicMaterialInstance(const FName ControlName, const FName LayerName, UObject* InOuter);
217
218 void SetControlSize(const FName Name, const FVector2D NewVisualSize, const FVector2D NewThumbSize, const FVector2D NewInteractionSize);
219
220 bool SetControlPosition(const FName Name, const FVector2D NewPosition, const bool InLandscape);
221
222
223 // UTILITIES
224
225 TArray<UTouchInterfaceListener*> GetAllListener();
226
227 /***/
228 bool GetTypeOfControl(const FName ControlName, EControlType& Type);
229
230 bool ContainName(const FName ControlName);
231
232 TArray<FName> GetAllControlNames();
233
234 TArray<FName> GetLayerNames(const FName ControlName);
235
236 UEnhancedInputLocalPlayerSubsystem* GetEnhancedInputSubsystem() const { return EnhancedInputSubsystem; }
237
238 bool IsActive() const { return State == State_Active; }
239
240 bool IsVisible() const { return bVisible; }
241
242 void SetScaleMultiplier(const float NewScale) { ScaleMultiplier = NewScale; }
243
245 FVector2D LocalToNormalized(const FVector2D LocalPosition) const;
246
248 FVector2D NormalizedToLocal(const FVector2D NormalizedPosition) const;
249
250 static float GetDebugOpacity();
251
252 //SAVE
253
254 bool SaveConfigurationFromCurrentSetup(const uint32 InUserIndex, const uint32 InConfigIndex);
255 bool LoadConfiguration(const uint32 InUserIndex, const uint32 InConfigIndex);
256
257 // EVENTS
258
259 FOnTouchEvent OnTouchBeganEvent;
260 FOnTouchEvent OnTouchMovedEvent;
261 FOnTouchEvent OnTouchEndedEvent;
262
263 FOnStateChangedEvent OnActiveStateChanged;
264 FOnStateChangedEvent OnVisibilityStateChanged;
265
266private:
267 void SetWidgetOpacity(const float DeltaTime);
268
269public:
270 float GetVirtualControlOpacity() const { return CurrentOpacity; }
271
272 float GetCurrentScaleFactor() const { return CurrentScaleFactor; }
273
274 bool GetDrawDebug() const { return bDrawDebug; }
275
276 float GetScaleFactor(const FGeometry& Geometry);
277
278private:
279
280 // Callback for handling device orientation changes
281 virtual void HandleOnOrientationChanged(const int32 Mode);
282
283 int32 GetVisualLayerIndex(TArray<FVisualLayer>& VisualLayer, const FName LayerName);
284
285 bool CanSendInputsToRecognizer(const bool bHitControl) const;
286
287 // Callback for handling display metrics changes
288 //virtual void HandleDisplayMetricsChanged(const FDisplayMetrics& NewDisplayMetric);
289
290 TSharedPtr<SConstraintCanvas> VirtualControlCanvas;
291
292 TArray<TSharedRef<SVirtualControl>> VirtualControlWidgets;
293
294 TSharedPtr<SVirtualShapeDrawer> ShapeDrawer;
295
296 TArray<UTouchInterfaceListener*> TouchInputComps;
297
298 TArray<UVirtualShape> VirtualShapes;
299
300 struct FFingerDebugData
301 {
302 uint32 FingerIndex;
303 FVector2D Position;
304
305 FFingerDebugData(const uint32 InFingerIndex, const FVector2D InPosition) :
306 FingerIndex(InFingerIndex),
307 Position(InPosition)
308 {
309
310 }
311 };
312
313 TArray<FFingerDebugData> Fingers;
314
315 UVirtualControlSetup* VirtualControlSetup;
316
317 UEnhancedInputLocalPlayerSubsystem* EnhancedInputSubsystem;
318
319 const UTouchInterfaceSettings* Settings;
320
321 class UTouchInterfaceSave* ConfigurationSaveSlot;
322
323 UGameInstance* PersistantOuter;
324
325 EScalingMode ScalingMode;
326
327 TArray<FVirtualControlWidget> ChildWidgets;
328
329 TArray<TSharedPtr<SVirtualAnchor>> VirtualAnchors;
330
331 //TAttribute<UWorld*> WorldContext;
332 //TAttribute<ULocalPlayer*> LocalPlayer;
333
334 UWorld* WorldContext;
335 ULocalPlayer* LocalPlayer;
336
337 float CurrentScaleFactor;
338 float ScaleMultiplier;
339
341 uint8 bVisible:1;
342
345 uint8 bIsActivated:1;
346
347
348 uint8 bActiveEventSend:1;
349
351 uint8 bBlockInput:1;
352
353
354 //GESTURE RECOGNIZER
355
357 uint8 bGestureRecognizerEnabled:1;
358
360 uint8 bBlockRecognizers:1;
361
362 // From settings : block touch event
363 uint8 bBlockTouchEvent:1;
364
365 uint8 bMoveEventAllowed:1;
366
367 uint8 bCaptureMouse:1;
368
369
370 //SHAPE RECOGNIZER
371
372 // True if the widget should send input to the Shape Recognition Manager
373 uint8 bShapeRecognizerEnabled:1;
374
376 uint8 bBlockShapeRecognition:1;
377
378
379 uint8 bDrawDebug:1;
380
381 int32 NumberOfActiveControl;
382
383 int32 ControllerIdAssociated;
384
385 FSlateBrush DebugCircle;
386
388 float ActiveOpacity;
389 float InactiveOpacity;
390 float ActiveLerpRate;
391 float InactiveLerpRate;
392 float TimeUntilDeactivated;
393 float TimeUntilReset;
394 float ActivationDelay;
395 float StartupDelay;
396
397 uint8 bCalculatePositionAuto:1;
398
399 enum ETouchInterfaceState
400 {
401 State_Active,
402 State_CountingDownToInactive,
403 State_CountingDownToReset,
404 State_Inactive,
405 };
406
408 ETouchInterfaceState State;
409
411 uint8 bIsInLandscapeMode:1;
412
414 float CurrentOpacity;
415
416 /* Countdown until next state change */
417 float Countdown;
418
420 float PreviousScalingFactor = 0.0f;
421
422 FVector2D PreviousGeometrySize;
423
424 float OpacityCurveValue;
425
426 uint8 bLoadFromSave:1;
427 int32 UserIndex;
428 int32 ConfigIndex;
429};
DECLARE_DELEGATE_TwoParams(FOnTouchEvent, int32, FVector2D)
DECLARE_DELEGATE_OneParam(FOnStateChangedEvent, bool)
EScalingMode
Definition TouchInterfaceSettings.h:127
EControlType
Definition VirtualControlSetup.h:25
bool IsActive() const
Definition SDeprecatedTouchInterface.h:238
FOnTouchEvent OnTouchBeganEvent
Definition SDeprecatedTouchInterface.h:259
float GetVirtualControlOpacity() const
Definition SDeprecatedTouchInterface.h:270
virtual FReply OnMouseButtonDown(const FGeometry &MyGeometry, const FPointerEvent &MouseEvent) override
Definition SDeprecatedTouchInterface.cpp:286
virtual void Tick(const FGeometry &AllottedGeometry, const double InCurrentTime, const float InDeltaTime) override
Definition SDeprecatedTouchInterface.cpp:733
virtual FReply OnMouseMove(const FGeometry &MyGeometry, const FPointerEvent &MouseEvent) override
Definition SDeprecatedTouchInterface.cpp:395
void BlockGesture(const bool bBlock)
Definition SDeprecatedTouchInterface.h:139
FOnStateChangedEvent OnVisibilityStateChanged
Definition SDeprecatedTouchInterface.h:264
virtual FReply OnTouchEnded(const FGeometry &MyGeometry, const FPointerEvent &Event) override
Definition SDeprecatedTouchInterface.cpp:669
virtual FReply OnTouchStarted(const FGeometry &MyGeometry, const FPointerEvent &Event) override
Definition SDeprecatedTouchInterface.cpp:509
virtual FVector2D ComputeDesiredSize(float) const override
Definition SDeprecatedTouchInterface.h:100
bool IsVisible() const
Definition SDeprecatedTouchInterface.h:240
virtual FReply OnTouchMoved(const FGeometry &MyGeometry, const FPointerEvent &Event) override
Definition SDeprecatedTouchInterface.cpp:615
virtual int32 OnPaint(const FPaintArgs &Args, const FGeometry &AllottedGeometry, const FSlateRect &MyCullingRect, FSlateWindowElementList &OutDrawElements, int32 LayerId, const FWidgetStyle &InWidgetStyle, bool bParentEnabled) const override
Definition SDeprecatedTouchInterface.cpp:755
virtual bool SupportsKeyboardFocus() const override
Definition SDeprecatedTouchInterface.h:99
virtual FReply OnMouseButtonUp(const FGeometry &MyGeometry, const FPointerEvent &MouseEvent) override
Definition SDeprecatedTouchInterface.cpp:455
int32 GetControllerId() const
Definition SDeprecatedTouchInterface.h:115
void SetScaleMultiplier(const float NewScale)
Definition SDeprecatedTouchInterface.h:242
FOnTouchEvent OnTouchEndedEvent
Definition SDeprecatedTouchInterface.h:261
TArray< UTouchInterfaceListener * > & GetListeners()
Definition SDeprecatedTouchInterface.h:121
bool GetDrawDebug() const
Definition SDeprecatedTouchInterface.h:274
float GetCurrentScaleFactor() const
Definition SDeprecatedTouchInterface.h:272
void BlockInput(const bool bBlock)
Definition SDeprecatedTouchInterface.h:136
UEnhancedInputLocalPlayerSubsystem * GetEnhancedInputSubsystem() const
Definition SDeprecatedTouchInterface.h:236
FOnTouchEvent OnTouchMovedEvent
Definition SDeprecatedTouchInterface.h:260
FOnStateChangedEvent OnActiveStateChanged
Definition SDeprecatedTouchInterface.h:263
Definition SVirtualAnchor.h:15
Definition SVirtualControl.h:18
Definition TouchInterfaceListener.h:16
Definition VirtualControlSetup.h:465
Definition TouchInterfaceSave.h:14
Definition VirtualControlSetup.h:165
FVirtualControlWidget(const FName InName, SConstraintCanvas::FSlot *InSlot, TSharedPtr< SVirtualControl > VirtualControl, const bool IsChild)
Definition SDeprecatedTouchInterface.h:36
uint8 bIsChild
Definition SDeprecatedTouchInterface.h:34
FName Name
Definition SDeprecatedTouchInterface.h:31
TSharedPtr< SVirtualControl > VirtualControl
Definition SDeprecatedTouchInterface.h:33
SConstraintCanvas::FSlot * Slot
Definition SDeprecatedTouchInterface.h:32
Definition VirtualControlSetup.h:62