More progress on prompt
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -127,14 +127,14 @@ enum class ElxLuaSyntaxCheck : uint8 {
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
//
|
||||
// ElxInputMode
|
||||
// ElxControllerType
|
||||
//
|
||||
// The three input modes recognized by the game.
|
||||
// The three types of controller recognized by luprex.
|
||||
//
|
||||
////////////////////////////////////////////////////////////
|
||||
|
||||
UENUM(BlueprintType)
|
||||
enum class ElxInputMode : uint8 {
|
||||
enum class ElxControllerType : uint8 {
|
||||
KeyboardMouse,
|
||||
XboxGamepad,
|
||||
PlayStationGamepad,
|
||||
|
||||
@@ -248,25 +248,6 @@ void AlxPlayerControllerBase::BuildInputStack(TArray<UInputComponent*>& InputSta
|
||||
}
|
||||
}
|
||||
|
||||
static ElxInputMode DetectInputMode(const ULocalPlayer *LocalPlayer)
|
||||
{
|
||||
UInputDeviceSubsystem *IDS = GEngine->GetEngineSubsystem<UInputDeviceSubsystem>();
|
||||
if (!IDS) return ElxInputMode::KeyboardMouse;
|
||||
|
||||
FHardwareDeviceIdentifier Device = IDS->GetMostRecentlyUsedHardwareDevice(LocalPlayer->GetPlatformUserId());
|
||||
if (Device.PrimaryDeviceType != EHardwareDevicePrimaryType::Gamepad)
|
||||
{
|
||||
return ElxInputMode::KeyboardMouse;
|
||||
}
|
||||
|
||||
FString DeviceName = Device.HardwareDeviceIdentifier.ToString();
|
||||
if (DeviceName.Contains(TEXT("PS4")) || DeviceName.Contains(TEXT("PS5")) || DeviceName.Contains(TEXT("PlayStation")))
|
||||
{
|
||||
return ElxInputMode::PlayStationGamepad;
|
||||
}
|
||||
return ElxInputMode::XboxGamepad;
|
||||
}
|
||||
|
||||
void AlxPlayerControllerBase::UpdateInputMode()
|
||||
{
|
||||
// Get all the various objects we need to be able to manipulate
|
||||
@@ -323,13 +304,6 @@ void AlxPlayerControllerBase::UpdateInputMode()
|
||||
|
||||
GameViewportClient->SetIgnoreInput(false);
|
||||
|
||||
ElxInputMode NewInputMode = DetectInputMode(LocalPlayer);
|
||||
if (NewInputMode != CurrentInputMode)
|
||||
{
|
||||
CurrentInputMode = NewInputMode;
|
||||
OnInputModeChanged.Broadcast(CurrentInputMode);
|
||||
}
|
||||
|
||||
// We always put keyboard focus on whatever user widget is in
|
||||
// front. If the front widget doesn't want keyboard focus,
|
||||
// then we put keyboard focus on the viewport.
|
||||
@@ -346,11 +320,6 @@ void AlxPlayerControllerBase::UpdateInputMode()
|
||||
}
|
||||
}
|
||||
|
||||
ElxInputMode AlxPlayerControllerBase::GetInputMode(const UObject *Context)
|
||||
{
|
||||
return FromContext(Context)->CurrentInputMode;
|
||||
}
|
||||
|
||||
void AlxPlayerControllerBase::UpdateLookAt()
|
||||
{
|
||||
UlxTangibleManager *TM = GetGameInstance()->GetSubsystem<UlxTangibleManager>();
|
||||
|
||||
@@ -7,8 +7,6 @@
|
||||
#include "UObject/ObjectKey.h"
|
||||
#include "PlayerControllerBase.generated.h"
|
||||
|
||||
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FlxInputModeChanged, ElxInputMode, NewMode);
|
||||
|
||||
class UlxRootCanvasPanel;
|
||||
class UWidget;
|
||||
|
||||
@@ -43,12 +41,6 @@ public:
|
||||
// Called by GameMode each tick.
|
||||
void UpdateLookAt();
|
||||
|
||||
UFUNCTION(BlueprintPure, meta = (WorldContext = "Context"), Category = "Luprex|Input Mode")
|
||||
static ElxInputMode GetInputMode(const UObject *Context);
|
||||
|
||||
UPROPERTY(BlueprintAssignable, Category = "Luprex|Input Mode")
|
||||
FlxInputModeChanged OnInputModeChanged;
|
||||
|
||||
// Called by GameMode each tick. GCs dead requests and will
|
||||
// eventually reconcile focus, pointer, and capture state.
|
||||
void UpdateInputMode();
|
||||
@@ -97,7 +89,4 @@ public:
|
||||
UlxRootCanvasPanel *RootCanvas = nullptr;
|
||||
|
||||
bool MustCallLookAtChanged = false;
|
||||
|
||||
UPROPERTY()
|
||||
ElxInputMode CurrentInputMode = ElxInputMode::KeyboardMouse;
|
||||
};
|
||||
|
||||
@@ -1,5 +1,10 @@
|
||||
#include "PromptWidget.h"
|
||||
#include "UtilityLibrary.h"
|
||||
#include "PlayerControllerBase.h"
|
||||
#include "Engine/Engine.h"
|
||||
#include "GameFramework/InputDeviceSubsystem.h"
|
||||
#include "InputAction.h"
|
||||
#include "InputMappingContext.h"
|
||||
#include "Widgets/SOverlay.h"
|
||||
#include "Widgets/Images/SImage.h"
|
||||
#include "Widgets/Text/STextBlock.h"
|
||||
@@ -57,25 +62,30 @@ int32 UlxPromptWidget::ChooseIcon(bool Playstation, FKey Key) const
|
||||
|
||||
void UlxPromptWidget::ChooseAppearance(int32 &OutIcon, FString &OutGlyph)
|
||||
{
|
||||
UWorld* World = GetWorld();
|
||||
APlayerController* PC = World ? World->GetFirstPlayerController() : nullptr;
|
||||
AlxPlayerControllerBase* LPC = Cast<AlxPlayerControllerBase>(PC);
|
||||
|
||||
ElxInputMode Mode = LPC ? LPC->CurrentInputMode : ElxInputMode::KeyboardMouse;
|
||||
|
||||
FKey Key = (Mode == ElxInputMode::KeyboardMouse) ? KeyboardKey : GamepadKey;
|
||||
|
||||
OutIcon = ChooseIcon(Mode == ElxInputMode::PlayStationGamepad, Key);
|
||||
FKey Key = (ControllerType == ElxControllerType::KeyboardMouse) ? KeyboardKey : GamepadKey;
|
||||
OutIcon = ChooseIcon(ControllerType == ElxControllerType::PlayStationGamepad, Key);
|
||||
if (OutIcon == 0) OutGlyph = Key.GetDisplayName().ToString();
|
||||
else OutGlyph = TEXT("");
|
||||
}
|
||||
|
||||
void UlxPromptWidget::OnHardwareDeviceChanged(const FPlatformUserId UserId, const FInputDeviceId DeviceId)
|
||||
{
|
||||
ElxControllerType Type = UlxUtilityLibrary::DetectControllerType(GetOwningLocalPlayer());
|
||||
if (ControllerType != Type)
|
||||
{
|
||||
ControllerType = Type;
|
||||
SynchronizeProperties();
|
||||
}
|
||||
}
|
||||
|
||||
FBox2f UlxPromptWidget::GetIconUVs(int32 IconIndex)
|
||||
{
|
||||
const float ColWidth = 1.0f / 4.0f;
|
||||
const float RowHeight = 1.0f / 8.0f;
|
||||
float U = (IconIndex % 4) * ColWidth;
|
||||
float V = (IconIndex / 4) * RowHeight;
|
||||
int32 Col = IconIndex % 4;
|
||||
int32 Row = IconIndex / 4;
|
||||
float U = Col * ColWidth;
|
||||
float V = Row * RowHeight;
|
||||
return FBox2f(FVector2f(U, V), FVector2f(U + ColWidth, V + RowHeight));
|
||||
}
|
||||
|
||||
@@ -151,13 +161,50 @@ void UlxPromptWidget::SetKeys(FKey InGamepadKey, FKey InKeyboardKey)
|
||||
}
|
||||
}
|
||||
|
||||
void UlxPromptWidget::SetKeysFromBindings(const UInputMappingContext* InputMappingContext, const UInputAction* EnhancedInputAction)
|
||||
{
|
||||
check(InputMappingContext);
|
||||
check(EnhancedInputAction);
|
||||
|
||||
FKey NewFirstKey;
|
||||
FKey NewGamepadKey;
|
||||
FKey NewKeyboardKey;
|
||||
|
||||
for (const FEnhancedActionKeyMapping& Mapping : InputMappingContext->GetMappings())
|
||||
{
|
||||
if (Mapping.Action != EnhancedInputAction) continue;
|
||||
FKey Key = Mapping.Key;
|
||||
if (Key.IsDigital())
|
||||
{
|
||||
if (!NewFirstKey.IsValid()) NewFirstKey = Mapping.Key;
|
||||
if (Key.IsTouch()) { /* not supported */ }
|
||||
else if (Key.IsGesture()) { /* not supported */ }
|
||||
else if (Key.IsGamepadKey()) { if (!NewGamepadKey.IsValid()) NewGamepadKey = Key; }
|
||||
else { if (!NewKeyboardKey.IsValid()) NewKeyboardKey = Key; }
|
||||
}
|
||||
}
|
||||
|
||||
if (!NewGamepadKey.IsValid()) NewGamepadKey = NewFirstKey;
|
||||
if (!NewKeyboardKey.IsValid()) NewKeyboardKey = NewFirstKey;
|
||||
SetKeys(NewGamepadKey, NewKeyboardKey);
|
||||
}
|
||||
|
||||
TSharedRef<SWidget> UlxPromptWidget::RebuildWidget()
|
||||
{
|
||||
if (!IsDesignTime())
|
||||
{
|
||||
ControllerType = UlxUtilityLibrary::DetectControllerType(GetOwningLocalPlayer());
|
||||
if (UInputDeviceSubsystem* IDS = GEngine->GetEngineSubsystem<UInputDeviceSubsystem>())
|
||||
{
|
||||
IDS->OnInputHardwareDeviceChanged.AddDynamic(this, &UlxPromptWidget::OnHardwareDeviceChanged);
|
||||
}
|
||||
}
|
||||
|
||||
int32 Icon = 0;
|
||||
FString Glyph;
|
||||
ChooseAppearance(Icon, Glyph);
|
||||
|
||||
MyBrush.SetResourceObject(ButtonAtlas);
|
||||
MyBrush.SetResourceObject(ButtonAtlas.Get());
|
||||
MyBrush.ImageSize = Size;
|
||||
MyBrush.SetUVRegion(GetIconUVs(Icon));
|
||||
|
||||
@@ -184,6 +231,13 @@ TSharedRef<SWidget> UlxPromptWidget::RebuildWidget()
|
||||
void UlxPromptWidget::ReleaseSlateResources(bool bReleaseChildren)
|
||||
{
|
||||
Super::ReleaseSlateResources(bReleaseChildren);
|
||||
if (!IsDesignTime())
|
||||
{
|
||||
if (UInputDeviceSubsystem* IDS = GEngine->GetEngineSubsystem<UInputDeviceSubsystem>())
|
||||
{
|
||||
IDS->OnInputHardwareDeviceChanged.RemoveDynamic(this, &UlxPromptWidget::OnHardwareDeviceChanged);
|
||||
}
|
||||
}
|
||||
MyOverlay.Reset();
|
||||
MyImage.Reset();
|
||||
MyScaleBox.Reset();
|
||||
|
||||
@@ -4,9 +4,13 @@
|
||||
#include "Common.h"
|
||||
#include "Components/Widget.h"
|
||||
#include "InputCoreTypes.h"
|
||||
#include "Widgets/SOverlay.h"
|
||||
#include "Widgets/Layout/SScaleBox.h"
|
||||
#include "PromptWidget.generated.h"
|
||||
|
||||
class UInputAction;
|
||||
class UInputMappingContext;
|
||||
|
||||
|
||||
UCLASS(BlueprintType, Blueprintable)
|
||||
class INTEGRATION_API UlxPromptWidget : public UWidget
|
||||
@@ -17,8 +21,14 @@ public:
|
||||
UPROPERTY(EditAnywhere, Category="Prompt")
|
||||
TObjectPtr<UTexture2D> ButtonAtlas;
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category="Prompt")
|
||||
void SetKeys(FKey InGamepadKey, FKey InKeyboardKey);
|
||||
UPROPERTY(EditAnywhere, Category="Prompt")
|
||||
ElxControllerType ControllerType = ElxControllerType::KeyboardMouse;
|
||||
|
||||
UPROPERTY(EditAnywhere, Category="Prompt")
|
||||
FKey GamepadKey = EKeys::Gamepad_FaceButton_Left;
|
||||
|
||||
UPROPERTY(EditAnywhere, Category="Prompt")
|
||||
FKey KeyboardKey = EKeys::Z;
|
||||
|
||||
UPROPERTY(EditAnywhere, Setter, Category="Prompt")
|
||||
FVector2D Size = FVector2D(64, 64);
|
||||
@@ -29,6 +39,12 @@ public:
|
||||
UPROPERTY(EditAnywhere, Setter, Category="Prompt")
|
||||
FLinearColor GlyphColor = FLinearColor::White;
|
||||
|
||||
public:
|
||||
UFUNCTION(BlueprintCallable, Category="Prompt")
|
||||
void SetKeys(FKey InGamepadKey, FKey InKeyboardKey);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category="Prompt")
|
||||
void SetKeysFromBindings(const UInputMappingContext* InputMappingContext, const UInputAction* EnhancedInputAction);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category="Prompt")
|
||||
void SetGlyphMargins(FMargin InMargins);
|
||||
@@ -36,21 +52,17 @@ public:
|
||||
UFUNCTION(BlueprintCallable, Category="Prompt")
|
||||
void SetGlyphColor(FLinearColor InColor);
|
||||
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category="Prompt")
|
||||
void SetSize(FVector2D InSize);
|
||||
|
||||
UFUNCTION()
|
||||
void OnHardwareDeviceChanged(const FPlatformUserId UserId, const FInputDeviceId DeviceId);
|
||||
|
||||
protected:
|
||||
virtual TSharedRef<SWidget> RebuildWidget() override;
|
||||
virtual void SynchronizeProperties() override;
|
||||
virtual void ReleaseSlateResources(bool bReleaseChildren) override;
|
||||
|
||||
UPROPERTY(EditAnywhere, Category="Prompt")
|
||||
FKey GamepadKey = EKeys::Gamepad_FaceButton_Left;
|
||||
|
||||
UPROPERTY(EditAnywhere, Category="Prompt")
|
||||
FKey KeyboardKey = EKeys::Z;
|
||||
|
||||
private:
|
||||
FSlateBrush MyBrush;
|
||||
TSharedPtr<SOverlay> MyOverlay;
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
#include "EnhancedInputComponent.h"
|
||||
#include "Animation/AnimSequenceBase.h"
|
||||
#include "GameFramework/Pawn.h"
|
||||
#include "GameFramework/InputDeviceSubsystem.h"
|
||||
#include "GameFramework/InputSettings.h"
|
||||
|
||||
|
||||
#define LOCTEXT_NAMESPACE "Luprex Utility"
|
||||
@@ -275,3 +277,23 @@ void UlxUtilityLibrary::ValidateLuaExpr(
|
||||
FlxLockedWrapper w;
|
||||
Status = w.ValidateLuaExpr(Code, ErrorMessage);
|
||||
}
|
||||
|
||||
ElxControllerType UlxUtilityLibrary::DetectControllerType(ULocalPlayer *Player)
|
||||
{
|
||||
UInputDeviceSubsystem *IDS = GEngine->GetEngineSubsystem<UInputDeviceSubsystem>();
|
||||
if (!IDS) return ElxControllerType::KeyboardMouse;
|
||||
|
||||
FHardwareDeviceIdentifier Device = IDS->GetMostRecentlyUsedHardwareDevice(Player->GetPlatformUserId());
|
||||
if (Device.PrimaryDeviceType != EHardwareDevicePrimaryType::Gamepad)
|
||||
{
|
||||
return ElxControllerType::KeyboardMouse;
|
||||
}
|
||||
|
||||
FString DeviceName = Device.HardwareDeviceIdentifier.ToString();
|
||||
if (DeviceName.Contains(TEXT("PS4")) || DeviceName.Contains(TEXT("PS5")) || DeviceName.Contains(TEXT("PlayStation")))
|
||||
{
|
||||
return ElxControllerType::PlayStationGamepad;
|
||||
}
|
||||
return ElxControllerType::XboxGamepad;
|
||||
}
|
||||
|
||||
|
||||
@@ -179,4 +179,9 @@ public:
|
||||
//
|
||||
UFUNCTION(BlueprintCallable, meta = (WorldContext = "context"), Category = "Luprex|Utility")
|
||||
static void ValidateLuaExpr(ElxLuaSyntaxCheck &Status, FString &ErrorMessage, UObject *context, const FString &Code);
|
||||
|
||||
// Determine what type of controller the game is currently using
|
||||
//
|
||||
UFUNCTION(BlueprintCallable, category="Luprex|Utility")
|
||||
static ElxControllerType DetectControllerType(ULocalPlayer *Player);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user