Touch Interface Designer 2025.2
Create touch interface with a visual editor and manage all mobile inputs like gestures
Loading...
Searching...
No Matches
SVirtualControl.h
Go to the documentation of this file.
1// Copyright 2023 Lost in Game Studio. All Rights Reserved.
2
3#pragma once
4
5#include "Widgets/SLeafWidget.h"
7#include "UObject/StrongObjectPtr.h"
8
9class UTouchInterfaceSettings;
10class UEnhancedInputLocalPlayerSubsystem;
11
12DEFINE_LOG_CATEGORY_STATIC(LogVirtualControl, Log, All);
13
14//TODO: For parenting feature, use SCompoundWidget, add canvas or other and then use ArrangeChildren
15
16// Base class for virtual input
17class TOUCHINTERFACE_API SVirtualControl : public SLeafWidget
18{
19 //TODO: Needed for Slate Attribute optimization (invalidation)
20 //SLATE_DECLARE_WIDGET(SVirtualControl, SLeafWidget)
21
22public:
24 : _TouchInterface(nullptr)
25 , _VirtualInput(nullptr)
26 , _Slot(nullptr)
27 , _AutoPositioning(false)
28 , _ParentOffset(ForceInitToZero)
29 {}
30 SLATE_ARGUMENT(TSharedPtr<SDeprecatedTouchInterface>, TouchInterface)
31 SLATE_ARGUMENT(FVirtualControl, VirtualControl)
32 SLATE_ARGUMENT(UVirtualInput*, VirtualInput)
33 SLATE_ARGUMENT(SConstraintCanvas::FSlot*, Slot)
34 SLATE_ARGUMENT(bool, AutoPositioning)
35 SLATE_ARGUMENT(FVector2D, ParentOffset)
36 SLATE_ARGUMENT(ULocalPlayer*, LocalPlayer)
37
38 SLATE_ATTRIBUTE(float, Opacity)
39 SLATE_ATTRIBUTE(float, ScaleFactor)
40 SLATE_ATTRIBUTE(bool, DrawDebug)
41 SLATE_END_ARGS()
42
44
46 void Construct(const FArguments& InArgs);
47
49 virtual ~SVirtualControl() override;
50
52 virtual bool OnPress(const FGeometry& MyGeometry, const FPointerEvent& Event);
53 virtual void OnMove(const FGeometry& MyGeometry, const FPointerEvent& Event);
54 virtual void OnRelease(const FGeometry& MyGeometry, const FPointerEvent& Event);
55 virtual void OnTick(const FGeometry& MyGeometry, const float InScaleFactor, const double InCurrentTime, const float InDeltaTime, const bool InForceUpdate, const bool OrientToLandscape);
56
57 //Begin SWidget Implementation
58 virtual int32 OnPaint(const FPaintArgs& Args, const FGeometry& AllottedGeometry, const FSlateRect& MyCullingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId, const FWidgetStyle& InWidgetStyle, bool bParentEnabled) const override;
59 //virtual void Tick(const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime) override;
60 virtual FVector2D ComputeDesiredSize(float LayoutScaleMultiplier) const override;
61 virtual bool SupportsKeyboardFocus() const override { return false; }
62 //End SWidget Implementation
63
64 //virtual int32 PaintAdditionalLayer(const FGeometry& AllottedGeometry, const FSlateRect& MyCullingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId, const FWidgetStyle& InWidgetStyle);
65
66 void SetCanvasSlot(SConstraintCanvas::FSlot* NewSlot) { CanvasSlot = NewSlot; }
67
69 virtual void RefreshPosition() { bRefreshPosition = true; }
70
71 virtual void DrawLayer(const FVisualLayer& InLayer, const FVector2D InSize, const FVector2D InBrushSize, float Angle, const FVector2D InOffset, const FGeometry& AllottedGeometry, FSlateWindowElementList& OutDrawElements, int32 LayerId, const FWidgetStyle& InWidgetStyle) const;
72
73 virtual bool IsInside(const FVector2D FingerPosition);
74
76
77 FName GetControlName() const { return VirtualControl.ControlName; }
78
80
82
83 TArray<UVirtualInputEvent*> GetVirtualInputEventInstances() { return VirtualInputEvents; }
84
86 void AddNewLayer(const FVisualLayer& VisualLayer);
87
91 //void AddNewLayer(const FVisualLayer& VisualLayer, int32 LayerGroup);
92 void InsertNewLayer(const FVisualLayer& VisualLayer, const int32 Index);
93 void RemoveLayer(const FName LayerName);
94 void RemoveLayerByIndex(const int32 LayerIndex);
95
96 UMaterialInstanceDynamic* GetLayerDynamicMaterialInstance(const FName LayerName, UObject* InOuter);
97
99 bool ApplyModification();
100
101 bool ContainPointerIndex(int32 PointerIndex);
102
103 //int32 GetPointerIndex() const { return CapturePointerIndex; }
104
105 UEnhancedInputLocalPlayerSubsystem* GetEnhancedInputSubsystem();
106
107 void HandleOnOrientationChanged(const bool bOrientToLandscape);
108
109 void Reset();
110
111 void ResetChild(const FVector2D ParentPosition);
112
113 virtual void FlushPressedKey();
114
115 bool AddChild(TSharedPtr<SVirtualControl> Other);
116
117 // Called before destroy
118 void PreDestroy();
119
120 bool RemoveChild(TSharedPtr<SVirtualControl> ChildToRemove);
121
122 bool IsParent() const { return ChildControls.Num() > 0; }
123
124 bool IsChild() const { return VirtualControl.bIsChild; }
125
126 const TArray<TSharedPtr<SVirtualControl>>& GetLinkedVirtualControls() { return ChildControls; }
127
128 // Inject input with enhanced input subsystem. The injected input will be processed next tick
129 void InjectInput(const UInputAction* Action, FInputActionValue RawValue);
130
131 // Stop injection for given action
132 void StopInjectingInput(const UInputAction* Action);
133
134 void SetEnableInput(const bool Enabled) { bBlockInput = !Enabled; }
135
136 ULocalPlayer* GetLocalPlayer() const { return LocalPlayer; }
137
138protected:
140 const UTouchInterfaceSettings* GetSettings();
141
143 void AlignBoxIntoScreen(FVector2D& Position, const FVector2D& Size, const FVector2D& ScreenSize);
144
146 void ResolveRelativePosition(FVector2D& Position, const FVector2D RelativeTo);
147
154 virtual void CalculateCorrectedValues(const FVector2D& Center, const FVector2D Offset, const FGeometry& AllottedGeometry, const float InScaleFactor);
155
157 virtual void Recenter(const FVector2D DesiredPosition);
158
160 virtual void RefreshChild(const FGeometry& MyGeometry, const FVector2D ParentCenter, const float InScaleFactor);
161
162 virtual void RecenterChild(const FVector2D ParentPosition);
163
165 void SetLocalPosition(const FVector2D NewPosition, const bool IsNormalized);
166
167 bool MultitouchDetected() const { return bMultitouchDetected; }
168
169
170 TSharedPtr<SDeprecatedTouchInterface> ParentWidget;
171
172 TArray<int32> CapturePointerIndex;
173
175
177
178 SConstraintCanvas::FSlot* CanvasSlot;
179
180 TAttribute<float> TouchInterfaceOpacity;
181 TAttribute<float> ScaleFactor;
182 TAttribute<bool> DrawDebug;
183
184 uint8 bIsPressed:1;
185 uint8 bBlockInput:1;
186
188
191
193
194 FVector2D AbsoluteCenter;
198 FVector2D ParentOffset;
200
202
204
206
208
211
214
217
219
221
222private:
223 // Set offset in canvas
224 void SetOffset(const FVector2D NewPosition, const FVector2D NewVisualSize) const;
225
226 void ComputeEffectiveKernelSize(float Strength, int32& OutKernelSize, int32& OutDownsampleAmount) const;
227
228 const UTouchInterfaceSettings* Settings;
229
230 UEnhancedInputLocalPlayerSubsystem* InputSubsystem;
231
232 float TimeToReset;
233
234 uint8 bMustBeReset:1;
235
236 uint8 bMultitouchDetected:1;
237
238 TArray<TSharedPtr<SVirtualControl>> ChildControls;
239
240 TMap<const UInputAction*, FInputActionValue> InjectedInputs;
241
242 TArray<UVirtualInputEvent*> VirtualInputEvents;
243
244 ULocalPlayer* LocalPlayer;
245};
@ OnPress
Definition ComponentDecorator_Animation.h:17
@ OnRelease
Definition ComponentDecorator_Animation.h:20
@ Center
Definition LayoutComponent.h:78
DEFINE_LOG_CATEGORY_STATIC(LogVirtualControl, Log, All)
EControlType
Definition VirtualControlSetup.h:25
Definition SVirtualControl.h:18
TAttribute< bool > DrawDebug
Definition SVirtualControl.h:182
uint8 bSupportMultitouch
Definition SVirtualControl.h:192
TArray< int32 > CapturePointerIndex
Definition SVirtualControl.h:172
double CurrentTime
Definition SVirtualControl.h:210
FVirtualControl & GetDataRef()
Definition SVirtualControl.h:81
void SetCanvasSlot(SConstraintCanvas::FSlot *NewSlot)
Definition SVirtualControl.h:66
SConstraintCanvas::FSlot * CanvasSlot
Definition SVirtualControl.h:178
bool MultitouchDetected() const
Definition SVirtualControl.h:167
TAttribute< float > TouchInterfaceOpacity
Definition SVirtualControl.h:180
FVector2D CorrectedVisualSize
Definition SVirtualControl.h:196
FVector2D CorrectedCenter
Definition SVirtualControl.h:195
float ElapsedTime
Definition SVirtualControl.h:216
uint8 bUseLandscapePosition
Definition SVirtualControl.h:190
bool IsParent() const
Definition SVirtualControl.h:122
FVirtualControl VirtualControl
Definition SVirtualControl.h:174
virtual void RefreshPosition()
Definition SVirtualControl.h:69
uint8 bIsPressed
Definition SVirtualControl.h:184
FVector2D CorrectedInteractionSize
Definition SVirtualControl.h:197
UVirtualInput * VirtualInput
Definition SVirtualControl.h:176
float PreviousScaleFactor
Definition SVirtualControl.h:207
FVector2D ParentOffset
Definition SVirtualControl.h:198
FName GetControlName() const
Definition SVirtualControl.h:77
FVirtualControl GetData() const
Definition SVirtualControl.h:79
FVector2D CorrectedOffset
Definition SVirtualControl.h:199
float CircleHitMaxLength
Definition SVirtualControl.h:203
const TArray< TSharedPtr< SVirtualControl > > & GetLinkedVirtualControls()
Definition SVirtualControl.h:126
float CurrentScaleFactor
Definition SVirtualControl.h:205
virtual bool SupportsKeyboardFocus() const override
Definition SVirtualControl.h:61
float LastElapsedTime
Definition SVirtualControl.h:218
uint8 bBlockInput
Definition SVirtualControl.h:185
TSharedPtr< SDeprecatedTouchInterface > ParentWidget
Definition SVirtualControl.h:170
bool IsChild() const
Definition SVirtualControl.h:124
float DeltaTime
Definition SVirtualControl.h:213
ULocalPlayer * GetLocalPlayer() const
Definition SVirtualControl.h:136
EControlType GetControlType() const
Definition SVirtualControl.h:75
float CorrectedInteractionRadiusSize
Definition SVirtualControl.h:201
TArray< UVirtualInputEvent * > GetVirtualInputEventInstances()
Definition SVirtualControl.h:83
uint8 bRefreshPosition
Definition SVirtualControl.h:187
void SetEnableInput(const bool Enabled)
Definition SVirtualControl.h:134
SLATE_BEGIN_ARGS(SVirtualControl)
Definition SVirtualControl.h:23
float DebugOpacity
Definition SVirtualControl.h:220
SVirtualControl()
Definition SVirtualControl.cpp:26
FVector2D AbsoluteCenter
Definition SVirtualControl.h:194
TAttribute< float > ScaleFactor
Definition SVirtualControl.h:181
uint8 bAutoPositioning
Definition SVirtualControl.h:189
Definition TouchInterface.Build.cs:6
Definition VirtualInput.h:26
Definition VirtualControlSetup.h:165
Definition VirtualControlSetup.h:62