Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 14 additions & 4 deletions Source/Swipe/Classes/SwipeViewportClient.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@

#pragma once

#include "UObject/Object.h"
#include "Engine/GameViewportClient.h"
#include "SwipeViewportClient.generated.h"

UENUM(BlueprintType)
namespace Swipe {
enum Direction {
namespace Swipe
{
enum Direction
{
None,
Left,
Right,
Expand All @@ -20,15 +22,18 @@ namespace Swipe {
}

UCLASS()
class USwipeViewportClient : public UGameViewportClient {
class USwipeViewportClient : public UGameViewportClient
{
GENERATED_BODY()

public:
USwipeViewportClient();
virtual bool InputTouch(FViewport* Viewport,
int32 ControllerId,
uint32 Handle,
ETouchType::Type Type,
const FVector2D& TouchLocation,
float Force,
FDateTime DeviceTimestamp,
uint32 TouchpadIndex) override;

Expand All @@ -38,6 +43,11 @@ class USwipeViewportClient : public UGameViewportClient {
FVector2D SwipeStartLocation;
FVector2D SwipeTriggerLocation;
int32 TapCount = 0;
const class USwipeSettings* SwipeSettings;

void CallSwipeDelegates(const FVector2D & TouchLocation);
void DetermineTapAmount(const FVector2D & TouchLocation);
void CallSwipeEndedDelegates(const FVector2D & TouchLocation);

UFUNCTION()
void ResetTapHandler();
Expand Down
5 changes: 2 additions & 3 deletions Source/Swipe/Private/Swipe.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,9 @@
// Copyright (c) 2015 Get Set Games Inc. All rights reserved.
//

#include "SwipePrivatePCH.h"
#include "ISettingsModule.h"

DEFINE_LOG_CATEGORY(LogSwipe);
#include "ISwipe.h"
#include "SwipeSettings.h"

#define LOCTEXT_NAMESPACE "Swipe"

Expand Down
3 changes: 2 additions & 1 deletion Source/Swipe/Private/SwipeComponent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@
// Copyright (c) 2015 Get Set Games Inc. All rights reserved.
//

#include "ISettingsModule.h"
#include "SwipeComponent.h"
#include "SwipePrivatePCH.h"
#include "SwipeDelegates.h"

void USwipeComponent::OnRegister()
{
Expand Down
2 changes: 1 addition & 1 deletion Source/Swipe/Private/SwipeDelegates.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
// Copyright (c) 2015 Get Set Games Inc. All rights reserved.
//

#include "ISettingsModule.h"
#include "SwipeDelegates.h"
#include "SwipePrivatePCH.h"

USwipeDelegates::FTouchDelegate USwipeDelegates::TouchBeganDelegate;
USwipeDelegates::FTouchDelegate USwipeDelegates::TouchMovedDelegate;
Expand Down
15 changes: 0 additions & 15 deletions Source/Swipe/Private/SwipePrivatePCH.h

This file was deleted.

2 changes: 1 addition & 1 deletion Source/Swipe/Private/SwipeSettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
// Copyright (c) 2015 Get Set Games Inc. All rights reserved.
//

#include "ISettingsModule.h"
#include "SwipeSettings.h"
#include "SwipePrivatePCH.h"

USwipeSettings::USwipeSettings(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
Expand Down
210 changes: 115 additions & 95 deletions Source/Swipe/Private/SwipeViewportClient.cpp
Original file line number Diff line number Diff line change
@@ -1,17 +1,22 @@
//
// Created by Derek van Vliet on 2014-12-10.
// Copyright (c) 2015 Get Set Games Inc. All rights reserved.
//

#include "ISettingsModule.h"
#include "SwipeViewportClient.h"
#include "SwipePrivatePCH.h"
#include "Runtime/Engine/Classes/Engine/UserInterfaceSettings.h"
#include "SwipeSettings.h"
#include "SwipeDelegates.h"

#include "Engine/Engine.h"
#include "Engine/World.h"
#include "Engine/UserInterfaceSettings.h"

USwipeViewportClient::USwipeViewportClient() :
SwipeSettings(GetDefault<USwipeSettings>())
{}

bool USwipeViewportClient::InputTouch(FViewport* InViewport,
int32 ControllerId,
uint32 Handle,
ETouchType::Type Type,
const FVector2D& TouchLocation,
float Force,
FDateTime DeviceTimestamp,
uint32 TouchpadIndex)
{
Expand All @@ -20,8 +25,6 @@ bool USwipeViewportClient::InputTouch(FViewport* InViewport,
return false;
}

const USwipeSettings* SwipeSettings = GetDefault<USwipeSettings>();

switch (Type)
{
case ETouchType::Began:
Expand All @@ -37,109 +40,126 @@ bool USwipeViewportClient::InputTouch(FViewport* InViewport,
case ETouchType::Moved:
{
USwipeDelegates::TouchMovedDelegate.Broadcast(TouchLocation, Handle);

float MinSwipeDistance = SwipeSettings->MinSwipeDistance;
if (SwipeSettings->EnableDPIScaling)
{
MinSwipeDistance *= GetDPIScreenScale();
}

if (bSwiping && SwipeDirection == Swipe::Direction::None) {
FVector2D TouchDelta = TouchLocation - SwipeStartLocation;
float AbsX = FMath::Abs(TouchDelta.X);
float AbsY = FMath::Abs(TouchDelta.Y);
bool XMeetsThreshold = (AbsX >= MinSwipeDistance);
bool YMeetsThreshold = (AbsY >= MinSwipeDistance);

if (AbsX > AbsY && XMeetsThreshold) {
SwipeTriggerLocation = TouchLocation;
if (TouchDelta.X > 0) {
USwipeDelegates::SwipeRightDelegate.Broadcast(SwipeStartLocation, SwipeTriggerLocation);
SwipeDirection = Swipe::Direction::Right;
}
else {
USwipeDelegates::SwipeLeftDelegate.Broadcast(SwipeStartLocation, SwipeTriggerLocation);
SwipeDirection = Swipe::Direction::Left;
}
}
else if (YMeetsThreshold) {
SwipeTriggerLocation = TouchLocation;
if (TouchDelta.Y > 0) {
USwipeDelegates::SwipeDownDelegate.Broadcast(SwipeStartLocation, SwipeTriggerLocation);
SwipeDirection = Swipe::Direction::Down;
}
else {
USwipeDelegates::SwipeUpDelegate.Broadcast(SwipeStartLocation, SwipeTriggerLocation);
SwipeDirection = Swipe::Direction::Up;
}
}
}

CallSwipeDelegates(TouchLocation);
break;
}
case ETouchType::Ended:
{
USwipeDelegates::TouchEndedDelegate.Broadcast(TouchLocation, Handle);

bSwiping = false;

switch (SwipeDirection)
if (SwipeDirection != Swipe::Direction::None)
{
case Swipe::Direction::Right:
{
USwipeDelegates::SwipeRightEndedDelegate.Broadcast(SwipeStartLocation, SwipeTriggerLocation, TouchLocation);
break;
}
case Swipe::Direction::Left:
{
USwipeDelegates::SwipeLeftEndedDelegate.Broadcast(SwipeStartLocation, SwipeTriggerLocation, TouchLocation);
break;
}
case Swipe::Direction::Down:
{
USwipeDelegates::SwipeDownEndedDelegate.Broadcast(SwipeStartLocation, SwipeTriggerLocation, TouchLocation);
break;
}
case Swipe::Direction::Up:
{
USwipeDelegates::SwipeUpEndedDelegate.Broadcast(SwipeStartLocation, SwipeTriggerLocation, TouchLocation);
break;
}
default:
TapCount++;

if (TapCount == 1)
{
USwipeDelegates::SingleTapDelegate.Broadcast(TouchLocation);
}
else if(TapCount >= 2)
{
USwipeDelegates::DoubleTapDelegate.Broadcast(TouchLocation);
}

FTimerHandle TapHandler;
FTimerDelegate TapHandlerDelegate;
TapHandlerDelegate.BindUObject(this, &USwipeViewportClient::ResetTapHandler);
UWorld* World = GetWorld();
if (World)
{
World->GetTimerManager().SetTimer(TapHandler, TapHandlerDelegate, SwipeSettings->MaxTimeBetweenTaps, false);
}

break;
CallSwipeEndedDelegates(TouchLocation);
SwipeDirection = Swipe::Direction::None;
}
else
{
DetermineTapAmount(TouchLocation);
}

SwipeDirection = Swipe::Direction::None;
}
default:
break;
}

bool bResult = Super::InputTouch(InViewport, ControllerId, Handle, Type, TouchLocation, DeviceTimestamp, TouchpadIndex);
bool bResult = Super::InputTouch(InViewport, ControllerId, Handle, Type, TouchLocation, Force, DeviceTimestamp, TouchpadIndex);

return bResult;
}

void USwipeViewportClient::CallSwipeDelegates(const FVector2D & TouchLocation)
{
float MinSwipeDistance = SwipeSettings->MinSwipeDistance;
if (SwipeSettings->EnableDPIScaling)
{
MinSwipeDistance *= GetDPIScreenScale();
}

if (bSwiping && SwipeDirection == Swipe::Direction::None)
{
const FVector2D TouchDelta = TouchLocation - SwipeStartLocation;
const float AbsX = FMath::Abs(TouchDelta.X);
const float AbsY = FMath::Abs(TouchDelta.Y);
const bool XMeetsThreshold = (AbsX >= MinSwipeDistance);
const bool YMeetsThreshold = (AbsY >= MinSwipeDistance);
if (AbsX > AbsY && XMeetsThreshold)
{
SwipeTriggerLocation = TouchLocation;
if (TouchDelta.X > 0)
{
USwipeDelegates::SwipeRightDelegate.Broadcast(SwipeStartLocation, SwipeTriggerLocation);
SwipeDirection = Swipe::Direction::Right;
}
else
{
USwipeDelegates::SwipeLeftDelegate.Broadcast(SwipeStartLocation, SwipeTriggerLocation);
SwipeDirection = Swipe::Direction::Left;
}
}
else if (YMeetsThreshold)
{
SwipeTriggerLocation = TouchLocation;
if (TouchDelta.Y > 0)
{
USwipeDelegates::SwipeDownDelegate.Broadcast(SwipeStartLocation, SwipeTriggerLocation);
SwipeDirection = Swipe::Direction::Down;
}
else
{
USwipeDelegates::SwipeUpDelegate.Broadcast(SwipeStartLocation, SwipeTriggerLocation);
SwipeDirection = Swipe::Direction::Up;
}
}
}
}

void USwipeViewportClient::DetermineTapAmount(const FVector2D & TouchLocation)
{
++TapCount;
if (TapCount == 1)
{
USwipeDelegates::SingleTapDelegate.Broadcast(TouchLocation);
}
else if (TapCount >= 2)
{
USwipeDelegates::DoubleTapDelegate.Broadcast(TouchLocation);
}
FTimerHandle TapHandler;
FTimerDelegate TapHandlerDelegate;
TapHandlerDelegate.BindUObject(this, &USwipeViewportClient::ResetTapHandler);
UWorld* World = GetWorld();
if (World)
{
World->GetTimerManager().SetTimer(TapHandler, TapHandlerDelegate, SwipeSettings->MaxTimeBetweenTaps, false);
}
}

void USwipeViewportClient::CallSwipeEndedDelegates(const FVector2D & TouchLocation)
{
switch (SwipeDirection)
{
case Swipe::Direction::Right:
{
USwipeDelegates::SwipeRightEndedDelegate.Broadcast(SwipeStartLocation, SwipeTriggerLocation, TouchLocation);
break;
}
case Swipe::Direction::Left:
{
USwipeDelegates::SwipeLeftEndedDelegate.Broadcast(SwipeStartLocation, SwipeTriggerLocation, TouchLocation);
break;
}
case Swipe::Direction::Down:
{
USwipeDelegates::SwipeDownEndedDelegate.Broadcast(SwipeStartLocation, SwipeTriggerLocation, TouchLocation);
break;
}
case Swipe::Direction::Up:
{
USwipeDelegates::SwipeUpEndedDelegate.Broadcast(SwipeStartLocation, SwipeTriggerLocation, TouchLocation);
break;
}
}
}

void USwipeViewportClient::ResetTapHandler()
{
TapCount = 0;
Expand Down
3 changes: 1 addition & 2 deletions Source/Swipe/Swipe.Build.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ namespace UnrealBuildTool.Rules
{
public class Swipe : ModuleRules
{
public Swipe(TargetInfo Target)
public Swipe(ReadOnlyTargetRules Target) : base (Target)
{
PublicIncludePaths.AddRange(
new string[] {
Expand All @@ -17,7 +17,6 @@ public Swipe(TargetInfo Target)

PrivateIncludePaths.AddRange(
new string[] {
"Developer/Swipe/Private",
// ... add other private include paths required here ...
}
);
Expand Down