Touch Interface Designer 2025.2
Create touch interface with a visual editor and manage all mobile inputs like gestures
Loading...
Searching...
No Matches
KnobLogic.h
Go to the documentation of this file.
1// Copyright 2024 Lost in Game Studio. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
6#include "ComponentLogic.h"
7#include "Styling/SlateBrush.h"
8#include "KnobLogic.generated.h"
9
11
12UENUM(BlueprintType)
13enum class EKnobMode : uint8
14{
15 //Free rotation
17
18 //Limited rotation value
20
21 //Snap to desired rotation value. Act as selector
23};
24
28UCLASS()
29class TOUCHINTERFACE_API UKnobLogic : public UComponentLogic
30{
31 GENERATED_BODY()
32
33public:
34 UKnobLogic();
35
36 virtual void Initialize_Implementation() override;
37
38private:
39 virtual void InitSwitch();
40
41public:
42 virtual void OnPress_Implementation(const FGeometry& ComponentGeometry, const FPointerEvent& PointerEvent) override;
43 virtual void OnMove_Implementation(const FGeometry& ComponentGeometry, const FPointerEvent& PointerEvent) override;
44 virtual void OnRelease_Implementation(const FGeometry& ComponentGeometry, const FPointerEvent& PointerEvent) override;
45
46 virtual void SetInputAction_Implementation(UInputAction* NewInputAction) override;
47
48 //Return current rotation of knob
49 UFUNCTION(Category="Knob", BlueprintCallable, BlueprintPure)
50 float GetCurrentKnobRotation() const { return CurrentKnobArtRotation; }
51
52 //Return input value based on touch or last touch in absolute
53 UFUNCTION(Category="Knob", BlueprintCallable, BlueprintPure)
54 float GetKnobInput(const bool bMapTo360) const;
55
56 //TODO: Set range min and max rotation, min and max input value
57
58 //TODO: Get range min max rotation, min max input value
59
60 //TODO: Set switch array, Set switch index
61
62 //TODO: Get Switch array, get switch index
63
64#if WITH_EDITOR
65 //virtual void PostEditChangeProperty(struct FPropertyChangedEvent& PropertyChangedEvent) override;
66#endif
67
68private:
69 virtual void SendFreeInputValue(const FVector2D& Offset);
70
71public:
73 TObjectPtr<UInputAction> InputAction;
74
77 UPROPERTY(Category="Knob", EditAnywhere, BlueprintReadOnly, meta=(GetOptions="GetAllDecoratorNames"))
78 FName KnobLayer;
79
80 //Select the knob rotation mode
81 UPROPERTY(Category="Knob", EditAnywhere, BlueprintReadOnly)
83
84 // If enabled, the forward of knob is snapped to finger position on press
85 UPROPERTY(Category="Knob", EditAnywhere, BlueprintReadOnly)
86 uint8 bSnapOnPress:1;
87
90 UPROPERTY(Category="Knob", EditAnywhere, BlueprintReadOnly)
92
93 // If enabled, reset knob rotation to default rotation on release
94 UPROPERTY(Category="Knob", EditAnywhere, BlueprintReadOnly, meta=(EditCondition="Mode==EKnobMode::Free || Mode==EKnobMode::InRange", EditConditionHides))
95 uint8 bBackToCenter:1;
96
97 //TODO: Back to center smoothly
98
99
100 //FREE
101
102 // By default, forward begin from Top Center (FVector2D(0.0f, -1.0f)), but you can add an offset to set the start value at different angle
103 UPROPERTY(Category="Knob|Free", EditAnywhere, BlueprintReadOnly, meta=(EditCondition="Mode==EKnobMode::Free"))
104 float StartOffset;
105
106 //In Free mode, send absolute value (offset from start) instead of delta
107 UPROPERTY(Category="Knob|Free", EditAnywhere, BlueprintReadOnly, meta=(EditCondition="Mode==EKnobMode::Free"))
108 uint8 bAbsoluteValue:1;
109
110 UPROPERTY(Category="Knob|Free", EditAnywhere, BlueprintReadOnly, meta=(EditCondition="Mode==EKnobMode::Free && bAbsoluteValue==true"))
111 uint8 bMapRangeTo360:1;
112
115 UPROPERTY(Category="Knob|Free", EditAnywhere, BlueprintReadOnly, meta=(EditCondition="Mode==EKnobMode::Free && bAbsoluteValue==false"))
116 float MinDeltaToSendEvent;
117
118 //TODO: Additive value (0 to infinite)
119
120
121 // IN RANGE
122
123 // Minimum rotation value allowed in degree
124 UPROPERTY(Category="Knob|Range", EditAnywhere, BlueprintReadOnly, meta=(EditCondition="Mode==EKnobMode::InRange"))
125 float MinRotationAngle;
126
127 // Maximum rotation value allowed in degree
128 UPROPERTY(Category="Knob|Range", EditAnywhere, BlueprintReadOnly, meta=(EditCondition="Mode==EKnobMode::InRange"))
129 float MaxRotationAngle;
130
131 // Input raw value at minimum rotation. Can be different from Minimum Rotation Value.
132 UPROPERTY(Category="Knob|Range", EditAnywhere, BlueprintReadOnly, meta=(EditCondition="Mode==EKnobMode::InRange"))
133 float MinValue;
134
135 // Input raw value at maximum rotation. Can be different from Maximum Rotation Value.
136 UPROPERTY(Category="Knob|Range", EditAnywhere, BlueprintReadOnly, meta=(EditCondition="Mode==EKnobMode::InRange"))
137 float MaxValue;
138
139 // If enabled, inject input each frame. Otherwise inject input only when rotation is changed.
140 UPROPERTY(Category="Knob|Range", EditAnywhere, BlueprintReadOnly, meta=(EditCondition="Mode==EKnobMode::InRange"))
141 uint8 bContinuousInput:1;
142
143 // Center knob in middle of range instead of forward middle of art
144 UPROPERTY(Category="Knob|Range", EditAnywhere, BlueprintReadOnly, meta=(EditCondition="Mode==EKnobMode::InRange"))
145 uint8 bCenterOrigin:1;
146
147
148 // SWITCH
149
150 //If enabled, use SwitchLocations array instead of automatically computed positions.
151 UPROPERTY(Category="Knob|Switch", EditAnywhere, BlueprintReadOnly, meta=(ClampMin=1), meta=(EditCondition="Mode==EKnobMode::Switch"))
152 uint8 bCustomLocation:1;
153
154 // Number of switch
155 UPROPERTY(Category="Knob|Switch", EditAnywhere, BlueprintReadOnly, meta=(ClampMin=1), meta=(EditCondition="Mode==EKnobMode::Switch && bCustomLocation==false"))
156 int32 SwitchAmount;
157
158 // Gap between each switch
159 UPROPERTY(Category="Knob|Switch", EditAnywhere, BlueprintReadOnly, meta=(EditCondition="Mode==EKnobMode::Switch && bCustomLocation==false"))
160 float SwitchGap;
161
162 // If enabled, switch is centered based on amount and gap
163 UPROPERTY(Category="Knob|Switch", EditAnywhere, BlueprintReadOnly, meta=(EditCondition="Mode==EKnobMode::Switch && bCustomLocation==false"))
164 uint8 bCenterSwitch:1;
165
169 UPROPERTY(Category="Knob|Switch", EditAnywhere, BlueprintReadOnly, meta=(EditCondition="Mode==EKnobMode::Switch && bCustomLocation==true"))
170 TArray<float> SwitchLocations;
171
172 //Index used to set knob rotation on start
173 UPROPERTY(Category="Knob|Switch", EditAnywhere, BlueprintReadOnly, meta=(EditCondition="Mode==EKnobMode::Switch"))
174 int32 StartIndex;
175
176
179 UPROPERTY(Category="Knob|Appearance", EditAnywhere, BlueprintReadOnly, meta=(Experimental="true"))
180 FSlateBrush KnobBrush;
181
184 //UPROPERTY(Category="Knob|Appearance", EditAnywhere, BlueprintReadOnly, meta=(EditCondition="Mode==EKnobMode::Switch", EditConditionHides))
185 //FSlateBrush SwitchBrush;
186
187 //TODO: Allow KnobLogic to add texture or material in decorator. Add option like center offset, size, opacity, etc.
188
189 //TODO: Preview in editor
190
191protected:
192 UPROPERTY()
194
195private:
196 // Knob layer rotation
197 float CurrentKnobArtRotation;
198
199 // Knob Raw input
200 float CurrentKnobLogicRotation;
201
202 FVector2D CurrentOffset;
203 FVector2D PreviousOffset;
204
205 TArray<float> SwitchDesiredPositions;
206
207 float StartKnobRotation;
208
209 FVector2D PressOffset;
210};
BlueprintType
Definition ComponentDecorator_Animation.h:40
EKnobMode
Definition KnobLogic.h:14
@ InRange
Definition KnobLogic.h:19
@ Free
Definition KnobLogic.h:16
@ Switch
Definition KnobLogic.h:22
Definition ComponentDecorator.h:36
BlueprintReadOnly FVector2D Offset
Definition ComponentDecorator.h:183
Category
Definition ComponentDecorator.h:80
BlueprintCallable
Definition ComponentDecorator.h:80
BlueprintReadOnly TObjectPtr< UInputAction > InputAction
Definition KnobLogic.h:73
EditAnywhere
Definition KnobLogic.h:72
meta
Definition KnobLogic.h:77
BlueprintReadOnly
Definition KnobLogic.h:77
BlueprintReadOnly uint8 bSnapOnPress
Definition KnobLogic.h:86
TWeakObjectPtr< UComponentDecorator > KnobLayerRef
Definition KnobLogic.h:193
Category
Definition KnobLogic.h:49
UKnobLogic()
Definition KnobLogic.cpp:9
BlueprintReadOnly EKnobMode Mode
Definition KnobLogic.h:82
BlueprintPure float GetCurrentKnobRotation() const
Definition KnobLogic.h:50
virtual void OnMove_Implementation(const FGeometry &ComponentGeometry, const FPointerEvent &PointerEvent) override
Definition KnobLogic.cpp:292
BlueprintCallable
Definition KnobLogic.h:49
virtual void OnPress_Implementation(const FGeometry &ComponentGeometry, const FPointerEvent &PointerEvent) override
Definition KnobLogic.cpp:159
BlueprintReadOnly uint8 bSendInputOnPress
Definition KnobLogic.h:91
virtual void OnRelease_Implementation(const FGeometry &ComponentGeometry, const FPointerEvent &PointerEvent) override
Definition KnobLogic.cpp:496
virtual void SetInputAction_Implementation(UInputAction *NewInputAction) override
Definition KnobLogic.cpp:532
virtual void Initialize_Implementation() override
Definition KnobLogic.cpp:37